#define DEVICE_CONFIG_ARR (存储设备信息地址) //根据需求修改值
/*
注意单片机是几位的,32位单片机写入flash一次是32位,8位单片机则一次写入8位,所以要注意结构体字节对齐。如本文使用32位单片机,结构体大小是32位的整数倍,方便读出,避免数据不对。也可以使用关键字**__attribute__ ((aligned (4))**,里面4是指变量最小字节对齐数,具体用法不做展开
*/
typedef struct
{
char id[16];
u32 b;
u16 c;
u8 d;
u8 e;
}device_flash_config;
device_flash_config Device_flash_config;
void set_device_flash(void)
{
u32 source = 0;
u32 FlashDest = DEVICE_CONFIG_ARR; //设备信息存储地址
//flash要先擦后写
flash_earase(LL_FLASH_ERTYPE_PAGE,DEVICE_CONFIG_ARR);
/*flash擦除函数,根据你所使用的单片机的库函数修改,LL_FLASH_ERTYPE_PAGE按页擦除,DEVICE_CONFIG_ARR擦除的地址*/
source = (u32)&Device_flash_config;//取结构体第一个变量的地址转为32位整形值
for(u16 j = 0 ; j < sizeof(Device_flash_config); j += 4)
{
flash_write(DEVICE_CONFIG_ARR, *(u32 *)source);
//(u32*)source 把值变为指针指向的地址,*(u32 *)source 既指针指向地址的值
FlashDest += 4; //地址偏移四个字节
source += 4; //结构体下一个变量的地址值
}
}
void get_device_flash()
{
u8 j;
memcpy((char *)&Device_flash_config , (char *)DEVICE_CONFIG_ARR , sizeof(Device_flash_config ));
/*
&Device_flash_config 取结构体第一个变量地址(注:结构体里的变量地址是连续的)
*/
if(Device_flash_config.id[0] == 0 || Device_flash_config.id[0] == 0xff)
{
//判断是否存过数据,没有存过flash里的初始值一般为0或者0xff
memset(Device_flash_config.id , 0 , sizeof(Device_flash_config.id)); //将id字符数组清0
memcpy(Device_flash_config.id , "123456789abcdef",strlen("123456789abcdef"));
else printf("%s\r\n",Device_flash_config.id);
}
其他同理
}
int main()
{
bsp_init();
struct_init();
get_flash_config();
while(1)
{
}
}
结构体写入flash并读取
最新推荐文章于 2024-08-27 18:27:16 发布