在我的stm32 mcu上没有eeprom。因此,我使用内部闪存来保存一个字节的用户数据,以在电源循环之间保留它。,我是按照以下方式来做的
-
在链接器脚本中的内存中添加数据段
存储器{RAM(xrw(:原点=0x20000000,长度=8KFLASH(rx(:原点=0x8000000,长度=64KDATA(xrw(:ORIGIN=0x8003800,LENGTH=2K//已分配一个完整的闪存页}
-
创建用户数据部分
.user_data:{.=对齐(4(;*(.user_data(.=对齐(4(;}>数据
-
创建一个变量存储在闪存中
属性((部分((".user_data"((const uint8_t userConfig[64]
-
使用以下功能写入数据,
HAL_FLASH_Unlock((;
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_frag_OPERR | FLASH_filg_WRPERR | FLASH_FLAG_PGAERR | flashflag_PGSERR(;
FLASH_Erase_Sector(FLASH_Sector_11,VOLTAGE_RANG_3(;
HAL_FLASH_Program(TYPEPROGRAM_WORD,&userConfig[index],someData(;
HAL_FLASH_Lock((;
我的问题是,通过这种方式可以对内部闪存进行多少次写入以保存用户数据?
STM32内部闪存的特性在产品数据表中始终有详细说明。例如,在STM32H743上,续航时间为10kcycles。
您可以从中推断出内部闪存不适合您的用例(除非电源循环是异常事件(。
如果你绝对需要多次编写内部Flash(我强烈怀疑(,你可能想看看Flash翻译层的概念。它是一个软件层,提供了一种虚拟到物理内存的映射,并允许减少闪存损耗。