单片机FLASH存取结构体的方法

本文介绍了在单片机开发中如何高效地在Flash中存储结构体数据。通过编写底层Flash读写驱动,定义无符号数据类型的结构体,并创建读写结构体的函数,实现了结构体的便捷存取。这种方法在开机读取配置、热修改数据以及系统扩展时具有显著优势。
摘要由CSDN通过智能技术生成

单片机FLASH存取结构体的方法

在日常开发中,经常遇到要保存一些配置数据到flash中,而普通的保存方法虽然粗暴简单,但是当数据类型多时,这种方法就不适用了,所以需要使用结构体的存储方法。

编写底层flash读写驱动

我使用的是EFM32单片机,不同的单片机flash读写驱动不相同,需要自行开发,部分代码如下所示, 其中主要使用 iap_write_appbin(),与efmflash_read()函数。

#include "main.h"
#include "iap.h"
#include "userpage.h"
#include <string.h>
#include "em_device.h"
#include "em_msc.h"
#include "em_usart.h"
#include "em_leuart.h"


iapfun jump2app;

#if STM32_FLASH_SIZE<256     //flash大小< 256k
#define STM_SECTOR_SIZE 512  //定义每个扇区512字节
#else
#define STM_SECTOR_SIZE	2048
#endif

uint32_t STMFLASH_BUF[STM_SECTOR_SIZE/4]={
   0};//efm32:最多是2K字节 (长度为扇区长度,单位为字节)

extern msc_Return_TypeDef  currentError;
/***************************************************
* 函数名称:	iap_write_appbin
* 功能描述:	固件写入
* 输入参数: appxaddr:应用程序的起始地址
            appbuf:应用程序CODE.
            appsize:应用程序大小(字节).  (必须小于一个扇区512字节)
* 输出参数:     无
* 返 回 值
* 其它说明:     无
* 修改日期:
  修改人
****************************************************/
uint8_t  iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t appsize)
{
   
        uint32_t iapbuf[128];
	uint16_t t;
	uint16_t i=0;
	uint32_t temp;
	uint32_t fwaddr=appxaddr;//当前写入的地址
	uint8_t *dfu=appbuf;

        if(appsize>512)
        {
   
           return 1;
        }
	memset(iapbuf, '\0',sizeof(iapbuf));
	memset(STMFLASH_BUF, '\0',sizeof(STMFLASH_BUF));
	for(t=0;t<appsize;t+=4)
	{
   

          temp=(uint32_t)dfu[3]<<24;
          temp+=(uint32_t)dfu[2]<<16;
          temp+=(uint32_t)dfu[1]<<8;
          temp+=(uint32_t)dfu[0];
          dfu+=4;//偏移4个字节
          iapbuf[i++]=temp;
	}
	if(i)STMFLASH_Write(fwaddr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值