STM32L475如何交换FLASH Memory中不同bank的两个内存区域?

How to swap two memory regions from different banks in FLASH Memory for STM32L475?

我正在研究 B-L475E-IOT01A2,它是 STM32L475 系列 Discovery 物联网套件,具有 ARM M4 皮质。它有两组闪存,每组大小为 512 KB。我正在实施两个应用程序和一个引导加载程序,它们都存储在闪存中。由于 space 很少,引导加载程序、第一个应用程序和第二个应用程序的某些部分存储在第一个存储区中,而第二个存储区包含第二个应用程序的剩余部分。所以在引导加载程序中的某个点,我需要交换这两个应用程序。

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

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

BOOTLOADER_ADDRESS 0x08000000,  (Size = 48K )

APPLICATION1_ADDRESS 0x0800F000 (Size = 384 KB)

APPLICATION2_ADDRESS 0x0806F800 (Size = 384 KB)

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

非常感谢您的帮助。

谢谢,

舍图

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

当设备启动时,它被配置为从闪存库 1 或 2 启动,具体取决于多个设备选项 bytes/settings。如果 bootloader/application 中的代码决定启动到其他应用程序,它可以通过修改一些选项字节然后执行软重置来实现。此外,当 运行 bootloader/application 来自一个闪存库时,可以更新另一个闪存库。

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