STM32 EEPROM_Emulation 保存数据使用注意事项
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) /*变量个数*/