C++ 如何为STM32L475交换闪存中不同存储组的两个存储区域?

C++ 如何为STM32L475交换闪存中不同存储组的两个存储区域?,c++,c,stm32,flash-memory,stm32ldiscovery,C++,C,Stm32,Flash Memory,Stm32ldiscovery,我正在研制B-L475E-IOT01A2,这是一种STM32L475系列Discovery IoT套件,具有ARM M4皮质。它有两组闪存,每组大小为512 KB。我正在实现两个应用程序以及一个引导加载程序,它们都存储在闪存中。由于空间非常小,引导加载程序、第一个应用程序和第二个应用程序的某些部分存储在第一个存储库中,而第二个存储库包含第二个应用程序的其余部分。因此,在引导加载程序中,我需要交换两个应用程序 问题是两个应用程序中只有一部分被交换,因为第二个应用程序部分存储在两个银行中。闪存中一次

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

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

下面是应用程序和引导加载程序的地址

BOOTLOADER_ADDRESS 0x08000000,  (Size = 48K )

APPLICATION1_ADDRESS 0x0800F000 (Size = 384 KB)

APPLICATION2_ADDRESS 0x0806F800 (Size = 384 KB)
那么,我应该如何确保正确的交换呢?我应该启用双银行模式,还是将第二个应用程序存储在第二个银行,或者执行其他操作

我们将非常感谢你的帮助

谢谢


Shetu

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

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


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

不清楚为什么需要交换内存。为什么不从您的引导加载程序调用应用程序2的入口点呢?我不知道这个特定的型号,但是页面大小可能会有所不同(很可能会变大),这取决于它们的起始地址。。。
BOOTLOADER_ADDRESS 0x08000000,  (Size = 48K )

APPLICATION1_ADDRESS 0x0800F000 (Size = 384 KB)

APPLICATION2_ADDRESS 0x0806F800 (Size = 384 KB)