结构体写入flash并读取

#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)
	{
		
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值