如何在 STM32F407VGT6 嵌入式微控制器中存储持久值?

电器工程 微控制器 stm32 闪光
2022-01-14 19:40:41

我想在微控制器的闪存中存储 3 个整数值,这样如果设备断电,这些值就不会丢失。

我试图了解为此目的使用哪种类型的内存,以及如何准确地写入和读取这个内存块。

我正在做一个爱好项目,使用 HMI 将数据输入到 PLC,然后驱动多个电机来控制玩具四轴飞行器的运动。

我正在使用 Keil uvision IDE。

一些附加说明:

  • 这些值将每 2-3 个月更改一次。
  • 值更新过程中可能会出现断电。
  • 如果进程被中断并且我们丢失了输入的最新值,这并不重要。
2个回答

对于不经常进行但需要可靠的参数存储,我推荐以下方法。

  1. 使用与 MCU 分开的外部存储器组件。如果您决定将来更换 MCU,此方案更便于移植。您还可以在项目之间重复使用该方案。
  2. 使用一个简单的实现与外部存储器的接口。我通常选择I 2 C。
  3. 我使用称为 F-RAM 的外部存储器。这种铁电技术具有许多优点,例如不会发生块擦除、对 100 万亿次读取/写入的高耐受性、重写单个位置的能力以及超长的数据保留时间。数据更新与 I 2 C 接口操作一样快。上一个项目我使用了赛普拉斯 FM24W256。
  4. 始终将参数存储为一组,并在编写时将 CRC-16 或 CRC-32 附加到参数组。在读取数据时检查它以确保其完整性。
  5. 每次编写数据集时,都要写两份。确保在开始编写第二份副本之前完全完成一份副本。如果在其中一次写入期间断电,则另一个副本仍然存在。
  6. 在启动时,当您读取参数检查 CRC 并获取具有正确 CRC 验证的数据集副本。在正常情况下,两个副本都将具有良好的 CRC。如果上次参数更新时出现电源故障,则其中一个或另一个副本可能已损坏。
  7. 可以选择在启动时通知用户一个 CRC 是否错误,或者简单地将两个副本恢复为相同。这实际上是没有必要的,可以等到用户下次更新参数时。
  8. 如果在读取参数时两个 CRC 在启动时都出现错误,则将参数值设置为默认值,在某些情况下,系统会执行初始化参数所需的任何过程。如果操作正确,这也涵盖了存储尚未初始化的情况,例如生产线的新构建。

最后注。您可以将我上面描述的可靠性算法方案应用于任何非易失性存储器技术、串行 EEPROM、闪存、EEPROM 仿真。它只是不具备 F-RAM 类型存储设备的非常好的优点。在我的一些应用程序中,我必须存储可能变得非常大的数据集,而这正是铁电技术真正大放异彩的地方。在某些应用程序中,我将参数数据分为两部分,仅当用户更改某些设置时才会更改,而另一部分(通常更小)会经常更新。经常变化的数据可能是累积计数器或产品使用时间计。

您可以使用所谓EEPROM emulation的 ,它使用一部分 Flash 存储器用作 EEPROM。

您可以在以下文档中阅读有关 STM40x/STM41x 的所有信息:

https://www.st.com/resource/en/application_note/dm00036065-eeprom-emulation-in-stm32f40x-stm32f41x-microcontrollers-stmicroelectronics.pdf

当然这个 EEPROM 存储器会比普通的 Flash 存储器减少。需要分配一整页(不确定有多少字节),但是一页对于您的 3 个字节来说绰绰有余。

请注意考虑磨损均衡,以防您需要经常存储这 3 个值(如果需要,请使用不同的页面)。

对于其他人:其他 STM32 型号有不同的应用笔记。