stm32内部flash存数据 key value
1、key value 根据蔡龇呶挞关键字取值ROM:小于3.0KB RAM:小于或等于16Byte#stm32_key_value stm32 f1 f4 L151系列键值对存储;支持4字节整型数据(8Byte/个),字符串数据(至少12Byte/个)。仅仅支持stm32内部flash存储数据。stm32系列芯片移植key_value功能:一、transplant.h 配置相应宏CORTEX_M3表示F1和L151系列CORTEX_M4表示F4系列#defineSTM32L//表示stm32L151系列,因为stm32L系列,stm8S系列,stm8L系列flash属性和F1、F4不一样,因此做特殊处理#define SYS false //true带freeRTOS false不带freeRTOS#define STRINGS_HEAD_FLAG 0xef1234ef //default#define UINT32_INIT_FLAG 0x1024 //default#define STRINGS_INIT_FLAG "OK" //default#define SECTOR_NUM 1 //stm32l151系列,一个扇区只有256Byte,1表示仅用一个扇区存储数据#define SECTOR_TOTAL_NUM 8 //stm32f407vet6有8个扇区,因此配置成8,具体可以查询j-flash工具#define KEY_VALUE_SIZE ( 128 * 1024 ) //使用了5/6/7扇区,最小一个扇区是128KB,所以填128*1024;如果选择1/2/3扇区,最小一个扇区是 16KB,那么就填写( 16 * 1024 )#define FLASH_MAX_SIZE ( 512 * 1024 ) //stm32f407vet6芯片内部flash大小为512KB#define FLASH_END_ADDR ( FLASH_BASE + FLASH_MAX_SIZE )//最大的flash地址二、transplant.c 移植函数 uint32_t flash_sector_address( int16_t index ) //除了配置transplant.h宏之外,当stm32内部flash扇区是不规则大小分布的时候,需要重写这个函数。即根据第几个扇区获取当前扇区的首地址。测试过:stm32l151c8、stm32f407vet6、stm32f103rct6、stm32f103zet6、stm32f103c8t6、stm32l151rct6芯片; 均稳定运行初始化:init_key_value( ADDRESS_MAPPING(5), ADDRESS_MAPPING(6), ADDRESS_MAPPING(7) );//stm32f407vet6使用5/6/7扇区分别作为UINT32、STRINGS、备份区域(仅当扇区写满的时候才把当前扇区备份到备份扇区,然后重新覆盖回原来扇区,2KB扇区最多只能存储255(2048/8 - 1)个不同key的4Byte整型数据)可能产生哈希冲突,需要检测,检查接口 check_hash_conflict( 5, "liang", "zhang", "gan", "hao", "liu" );测试函数(初始化key_value后直接调用测试函数测试即可):void reboot_times_history_info( void ){ uint32_t reboot_times = 0; get_key_value( "reboot_times", UINT32, (uint8_t *)(&reboot_times) ); LOG_INFO( "reboot_times_history_info: %d\r\n", reboot_times ); reboot_times ++; set_key_value( "reboot_times", UINT32, (uint8_t *)(&reboot_times) );}