STM32 EEPROM_Emulation 保存数据使用注意事项

发布时间 2023-10-20 16:13:34作者: okyihu

1 目的:

stm32 官方提供flash模拟eeprom的代码例子,为了能给产品添加数据保存功能,可以改造该例子迅速完成数据保存的功能。示例代码路径:

C:\Users\rd-yhzhang\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Applications\EEPROM\EEPROM_Emulation。

2 注意事项:

2.1:在使用flash模块时,需要先解锁flash,即在调用EE_Init();之前,先解锁FLASH,否则读写不正常。

 /* Unlock the Flash Program Erase controller */
  HAL_FLASH_Unlock();

  /* EEPROM Init */
  EE_Init();

 

2.2: 重新定义#define NB_OF_VAR             ((uint8_t)0x03),不同产品,保存的参数个数不同。

         重新定义uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};其中0x5555, 0x6666, 0x7777在读写FLASH时寻找最新的数据时要用到,每个要保存的数据都配有一个这样的唯一的地址。实际产品中应根据参数个数来重新定义。

         uint16_t VarDataTab[NB_OF_VAR] = {0, 0, 0}; 这个数组可以去掉,实际产品中不需要用到。

         以下是实际产品中的读写示例:

        

       uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555 };/*变量地址*/
         
       EE_ReadVariable(0x5555,&threshould);  /*读数据*/

     EE_WriteVariable(0x5555, threshould);   /*写数据*/

 

 2.3:修改eeprom.h头文件的宏定义:

/* EEPROM start address in Flash */
#define EEPROM_START_ADDRESS  ((uint32_t)ADDR_FLASH_PAGE_126) /* EEPROM emulation start address */

/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + 0x0000))
#define PAGE0_END_ADDRESS     ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
#define PAGE0_ID               ADDR_FLASH_PAGE_126

#define PAGE1_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + 0x400))
#define PAGE1_END_ADDRESS     ((uint32_t)(EEPROM_START_ADDRESS + 0x400 + PAGE_SIZE - 1))
#define PAGE1_ID               ADDR_FLASH_PAGE_127

/* Used Flash pages for EEPROM emulation */
#define PAGE0                 ((uint16_t)0x0000) 
#define PAGE1                 ((uint16_t)0x0001)
/*这里千万要注意PAGE0和PAGE1是相对页数,一定要根据自己定义的PAGE0地址和PAGE1地址来修改,如果PAGE0的地址在32页,PAGE1的地址在96页,两者相差0x40页,
则#define PAGE1 ((uint16_t)0x0040) 否则保存数据在换页时会死机
*/ #define NB_OF_VAR ((uint8_t)0x01) /*变量个数*/