c++ - 如何交换STM32L475闪存中不同存储体的两个存储区域?

标签 c++ c stm32 flash-memory stm32ldiscovery

我正在开发 B-L475E-IOT01A2,它是 STM32L475 系列 Discovery IoT 套件,具有 ARM M4 皮质。它有两组闪存,每组大小为 512 KB。我正在实现两个应用程序以及一个引导加载程序,它们都存储在闪存中。由于空间很小,引导加载程序、第一个应用程序和第二个应用程序的某些部分存储在第一个存储体中,而第二个存储体包含第二个应用程序的剩余部分。因此,在引导加载程序中的某个时刻,我需要交换两个应用程序。

问题是两个应用程序中只有一部分被交换,因为第二个应用程序部分存储在两个银行中。一次只能在 FLASH 中写入一页 (2 KB) 内存。两个应用程序的大小均为 384 KB,经过计算,结果为 192 页。但运行交换程序后,仅交换了 72 个页面。

这是应用程序和引导加载程序的地址。

BOOTLOADER_ADDRESS 0x08000000,  (Size = 48K )

APPLICATION1_ADDRESS 0x0800F000 (Size = 384 KB)

APPLICATION2_ADDRESS 0x0806F800 (Size = 384 KB)

那么我应该怎么做才能确保正确交换?我应该启用双银行模式还是将第二个应用程序存储在第二个银行中或执行其他操作?

我们将非常感谢您的帮助。

谢谢

舍图

最佳答案

一种可能的解决方法/不同方法是将引导加载程序功能集成到应用程序 1 和应用程序 2 中,并使每个应用程序位于其自己的闪存组中(1 和 2)。使用双组模式可以更轻松地在应用程序之间来回切换。我已经在 STM32F7 设备上使用了这种方法。

当设备启动时,它被配置为从闪存组 1 或 2 启动,具体取决于多个设备选项字节/设置。如果引导加载程序/应用程序中的代码决定引导到其他应用程序,它可以通过修改一些选项字节然后执行软重置来完成此操作。此外,在从一个闪存库运行引导加载程序/应用程序时,可以更新另一个闪存库。

如果使用此方法进行固件更新,您必须特别小心,新的固件版本不会破坏引导加载程序的固件更新功能。

关于c++ - 如何交换STM32L475闪存中不同存储体的两个存储区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286886/

相关文章:

C |静态数组: why does writing out-of-bounds not result in exception?

c++ - 使用 iomanip 自动间距

c++ - 将 streambuf 的内容复制到字符串

c - 为什么 GDB "thread apply all where"没有将所有输出发送到文件(只有一些......)?

c++ - C Header 定义顺序/位置

serial-port - 虚拟 COM 在 pyserial/Linux 上失败,但以其他方式工作

stm32 - 如何从高优先级 ISR 唤醒 FreeRtos 任务?

algorithm - STM32L1xx 上的闪存 ECC 算法

android - 具有 ASTC 8x8 纹理的 glCompressedTexSubImage2D 上的 GL_INVALID_VALUE

C++ 构造函数与初始化列表速度比较