联盛德W801系列1-flash保存数据例程:保存wifi配网信息
文章目录
1.W801内部flash资料
1.1 W801内部flash用途分区
W801的内部flash大小是2M 字节,物理地址是0x08000000-0x081FFFFF.
在CDK的例程中,flash内部各个地址段有特定的用途,看看这种《内部flash分区表》:
其中留给用户使用的范围就是“User Area”【0x081C0000 ~ (0x081FC000-1)】。
1.2 内部flash的擦除写入特性
- 擦除的最小单位是扇区,每个扇区4k 字节;同一个扇区的内容会同时被擦除,所以改变同个扇区的部分内容时,必须把其他内容临时保存后,一起重新写入。
这一点,库函数 int tls_fls_write(u32 addr, u8 *buf, u32 len) 已经帮我们做好,我们可以直接写入小于4k字节的内容,不用关心是否擦除同个扇区的其他内容。
2.利用SDK的demo快速测试flash相关函数
2.1 打开宏 DEMO_FLASH
在文件wm_demo.h中打开DEMO_FLASH
#define DEMO_ON 1
#define DEMO_OFF 0
//demo console
#define DEMO_CONSOLE DEMO_ON
.........
//flash demo
#define DEMO_FLASH (DEMO_ON && DEMO_CONSOLE)
2.2 串口命令测试flash
编译下载后,串口命令增加t-flash,如下图:
在串口输入“t-flash"就可以进测试。
3.保存用户参数
我在实际应用中,一共用了 8个字节的用户数据 + 33字节的wifi SSID + 65字节的wifi密码,共106字节。所以选用的地址范围是【0x081FB000 ~ 0x081FBFFF】,大小为一个扇区,4k 字节。
extern u8 airkiss_pwd[65];
#define wifiCfgByte airkiss_pwd[64] // 使用密码数组最后一个字节作为配网标记
extern u8 airkiss_ssid[33];
#define PARAM_FLASH_ADDR_BASE 0x1fb000 // 0x08200000 - 0x1000 最后4k,一个扇区
#define PARAM_FLASH_DATA_LEN 8
///============ 开启配网需要相应的保存函数
#if TLS_CONFIG_AIRKISS_MODE_ONESHOT
#define PARAM_FLASH_ADDR_WIFI_ID_LEN 33
#define PARAM_FLASH_ADDR_WIFI_PWD_LEN 65
#define PARAM_FLASH_ADDR_WIFI_ID_OFFSET (PARAM_FLASH_DATA_LEN)
#define PARAM_FLASH_ADDR_WIFI_PWD_OFFSET (PARAM_FLASH_ADDR_WIFI_ID_OFFSET+PARAM_FLASH_ADDR_WIFI_ID_LEN)
#define PARAM_FLASH_ADDR_WIFI_CFG_OFFSET (PARAM_FLASH_ADDR_WIFI_PWD_OFFSET+PARAM_FLASH_ADDR_WIFI_PWD_LEN-1)
///==========传入参数为 wifi_info_storage_t ================
void WriteWifiParam(unsigned char configByte)
{
unsigned char write_buf[PARAM_FLASH_ADDR_WIFI_ID_LEN+PARAM_FLASH_ADDR_WIFI_PWD_LEN];
wifiCfgByte = configByte;
memcpy(write_buf,airkiss_ssid,sizeof(airkiss_ssid));
memcpy(write_buf+PARAM_FLASH_ADDR_WIFI_ID_LEN,airkiss_pwd,sizeof(airkiss_pwd));
tls_fls_write(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_ID_OFFSET, write_buf, sizeof(write_buf));
}
//
unsigned char ReadWifiParam(void)
{
tls_fls_read(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_ID_OFFSET, airkiss_ssid, sizeof(airkiss_ssid));
tls_fls_read(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_PWD_OFFSET, airkiss_pwd, sizeof(airkiss_pwd));
return wifiCfgByte;
}
#endif // TLS_CONFIG_AIRKISS_MODE_ONESHOT
上面的代码中,airkiss_ssid和airkiss_pwd是全局变量,看下面源码截图:
这一篇写到这里,下面讲一键配网的实用性操作,题目《联盛德W801系列2-WIFI一键配网,信息保存》。