Memory 使用用户数据写入和擦除内部闪存的次数

Memory 使用用户数据写入和擦除内部闪存的次数,memory,stm32,flash-memory,Memory,Stm32,Flash Memory,在我的stm32 mcu上没有eeprom。因此,我使用内部闪存保存一个字节的用户数据,以便在两次电源循环之间保留数据。我按照以下方式进行操作 在链接器脚本的内存中添加数据节 记忆 { RAM(xrw):原点=0x20000000,长度=8K 闪光(rx):原点=0x8000000,长度=64K 数据(xrw):原点=0x8003800,长度=2K//分配了一个完整的闪存页 } 创建用户数据部分 .用户数据: { .=对齐(4); *(.用户数据) .=对齐(4); }>数据 创建一个变量以

在我的stm32 mcu上没有eeprom。因此,我使用内部闪存保存一个字节的用户数据,以便在两次电源循环之间保留数据。我按照以下方式进行操作

  • 在链接器脚本的内存中添加数据节

    记忆 { RAM(xrw):原点=0x20000000,长度=8K 闪光(rx):原点=0x8000000,长度=64K 数据(xrw):原点=0x8003800,长度=2K//分配了一个完整的闪存页 }

  • 创建用户数据部分

    .用户数据: { .=对齐(4); *(.用户数据) .=对齐(4); }>数据

  • 创建一个变量以存储在flash中

    属性(“.user\u data”))const uint8\u t userConfig[64]

  • 使用以下函数写入数据

    HAL_FLASH_Unlock()

    __HAL_FLASH_CLEAR_标志(FLASH_标志| EOP | FLASH_标志| Oper | FLASH_标志| WRPERR | FLASH_标志| FLASH_标志| PGSERR)

    闪存擦除扇区(闪存扇区11,电压范围3)

    HAL_FLASH_程序(键入程序、WORD和userConfig[index],someData)

    HAL_FLASH_Lock()


  • 我的问题是,通过这种方式可以对内部闪存进行多少次写入以保存用户数据?

    STM32内部闪存的特性始终在产品数据表中详细说明。例如,在STM32H743上,耐久性为10周

    您可以由此推断,内部闪存不适合您的用例(除非电源循环是异常事件)


    如果您确实需要多次编写内部Flash(我强烈怀疑),您可能需要了解Flash翻译层的概念。它是一个软件层,提供一种虚拟到物理内存映射,并允许减少闪存磨损。

    您正在使用的特定部件的数据表应该说明闪存的额定写入周期。并非所有的stm32设备都是一样的。@NateEldredge我也这么认为。但我似乎在数据表和参考手册数据表中找不到该信息-参考手册-我在第17页找到了eeprom仿真的应用说明,其中有各种stm32 MCU的闪存耐久性表-查看设备数据表中的“闪存耐久性和数据保留”表(不是参考手册)。我可以找到我使用的每个控制器的te信息。如果我使用mcu的电源电压检测器功能,并且仅在断电时打开闪光灯,在通电时读取。那也会减少磨损,对吧?我不知道。断电的频率有多高?如果这是一个例外事件,可能就足够了。