stm32 片上flash用作EEPROM(掉电保存)(绝对可用)

10 篇文章 1 订阅
4 篇文章 0 订阅

 一、源码:

#if !defined  (_FLASH_H)
#define _FLASH_H
#define FLASH_ADR 0x08010000  //要写入数据的地址
#define u8 INT8U
#define u16 INT16U
#define u32 INT32U

union union_temp16
{
    unsigned int un_temp16;
    unsigned char  un_temp8[2];  // example 16: 0x0102  8:[0]2 [1]1
}my_unTemp16;

typedef struct 
{
 u8 apn[20];
 u8 useName[20];
 u8 password[20];
 u8 serverIP[16];
 u8 port[6];
 u8 useCall[3][15];
}configStruct;

configStruct myConf =
{
 "cmnet",
 "\0",
 "\0",
 "201.2.2.2",
 "9002",
 {
  "test123","\0","\0"
 }
};


/******************************************************
flash 字符串写入
每次存入两个字节
*******************************************************/
void FlashWriteStr( u32 flash_add, u16 len, u16* data )
{
 //char cp[12];
 //u8 s = 0;
 u16 byteN = 0;
 FLASH_Unlock();
 FLASH_ErasePage(flash_add);
 //sprintf( cp, "len:%d", len);
 //USART1_Puts(cp);
 while( len )
 {
  
  my_unTemp16.un_temp8[0] = *(data+byteN);
  my_unTemp16.un_temp8[1] = *(data+byteN+1);  
  FLASH_ProgramHalfWord( flash_add+byteN , my_unTemp16.un_temp16 );

  //sprintf( cp, "bye:%d\r\n", s);
  //USART1_Puts(cp);
  if( 1==len )
  {
   //如果数据长度是奇数,为1的时候跳出
   break;               
  }
  else
  {
   byteN += 2;
   len -= 2;
  } 
 }
 FLASH_Lock();
}

/******************************************************
flash 字符串读出到指定data中 
地址与写入data地址同 读出的保存类型也必须一致
*******************************************************/
void FlashReadStr( u32 flash_add, u16 len, u16* data )
{
 u16 byteN = 0;
 while( len )
 {
  my_unTemp16.un_temp16 = *(vu16*)(flash_add+byteN);
  if( 1==len )
  {
   *(data+byteN) = my_unTemp16.un_temp8[0];
   break;     
  }
  else
  {  
   *(data+byteN) = my_unTemp16.un_temp8[0];
   *(data+byteN+1) = my_unTemp16.un_temp8[1];
   byteN += 2;
   len -= 2;
  }
 }
}

#endif

二、调用方法:

INT16U data[2]={0x3234,0x3533};
  
FlashWriteStr(FLASH_ADR,2,&data[0]);//写入两个16位数据
  
FlashReadStr(FLASH_ADR,2,&data[0]);//读取两个16位数据

爱极客官方论坛,期待与你一起改变世界!

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
STM32L4系列微控制器具有非易失性存储器(Flash)来保存数据,并且在掉电后仍能保持数据。这使得我们可以使用Flash保存重要的配置信息、用户数据等。下面是关于如何在STM32L4上实现Flash掉电保存和上电读取的简要步骤: 1. 首先,我们需要定义一段Flash内存区域来保存数据。我们可以选择Flash的一个扇区来进行保存,需确保所选择的扇区不会被擦除。 2. 接下来,我们需要编写掉电保存函数。首先,应该在程序开始时读取Flash保存区域,以将保存的数据加载到相应的数据结构中。然后,在程序运行过程中,如果数据发生了变化,应该在合适的时机更新要保存的数据。最后,在掉电之前,我们应该将更新后的数据写回到Flash保存区域。为了确保数据完整性和安全性,可以使用擦除和编程操作的校验和。 3. 当系统上电时,我们需要编写上电读取函数。这个函数应该在程序启动时被调用,以将保存的数据加载到相应的数据结构中,以便程序可以继续使用之前保存的数据。读取过程是将Flash中的数据直接复制到RAM中,此后可以从RAM中快速访问数据。 4. 最后,我们需要编写其他必要的代码,以确保保存和读取的数据与实际需要的数据类型是一致的。我们还可以使用CRC校验或其他数据完整性检验来验证保存和读取的数据。 通过以上步骤,我们可以在STM32L4系列微控制器上实现Flash掉电保存和上电读取。这种方法可以保护重要的数据,使其在掉电后仍能恢复,从而提供更可靠和持久的存储解决方案。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西安爱极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值