联盛德W801系列1-flash保存数据例程:保存wifi配网信息

1.W801内部flash资料

1.1 W801内部flash用途分区

W801的内部flash大小是2M 字节,物理地址是0x08000000-0x081FFFFF.
在CDK的例程中,flash内部各个地址段有特定的用途,看看这种《内部flash分区表》:
内部flash分区表
其中留给用户使用的范围就是“User Area”【0x081C0000 ~ (0x081FC000-1)】。

1.2 内部flash的擦除写入特性

  1. 擦除的最小单位是扇区,每个扇区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一键配网,信息保存》。

posted @ 2022-08-04 16:38  汉塘阿德  阅读(70)  评论(0编辑  收藏  举报  来源