Memory 如何为STM32L475板交换闪存中的两个区域?

Memory 如何为STM32L475板交换闪存中的两个区域?,memory,stm32,swap,flash-memory,stm32ldiscovery,Memory,Stm32,Swap,Flash Memory,Stm32ldiscovery,我正在研制STM32L475物联网套件,这是一种ARM M4 Cortex设备。我想交换两个闪存区域。我使用的板有两个闪存组,每个组的大小为512KB,所以我有1MB的闪存。我读到,为了交换闪存的内容,您必须先解锁它,然后擦除它,然后写入它,并在操作结束后锁定闪存 另一个限制是,一次只能复制2KB的内存(定义为一个页面)。因此,只能逐页复制内存。对于我的应用程序,如果满足某些条件,我必须交换存储在闪存中的应用程序1和2。虽然这两个应用程序都被分配了384KB的内存,但它们实际使用的内存都少于38

我正在研制STM32L475物联网套件,这是一种ARM M4 Cortex设备。我想交换两个闪存区域。我使用的板有两个闪存组,每个组的大小为512KB,所以我有1MB的闪存。我读到,为了交换闪存的内容,您必须先解锁它,然后擦除它,然后写入它,并在操作结束后锁定闪存

另一个限制是,一次只能复制2KB的内存(定义为一个页面)。因此,只能逐页复制内存。对于我的应用程序,如果满足某些条件,我必须交换存储在闪存中的应用程序1和2。虽然这两个应用程序都被分配了384KB的内存,但它们实际使用的内存都少于384KB(例如264KB)

我试着按照上面的步骤去做,但它不起作用。以下是我尝试的代码:-

#定义应用程序地址0x0800F000
#定义应用程序2_地址0x0806F800
#定义交换地址0x0806F000
布尔交换(void)
{
char*app_1=(char*)APPLICATION_ADDRESS;//指向application1的第一个地址
char*app_2=(char*)APPLICATION2_ADDRESS;//指向APPLICATION2的第一个地址
int mem1=getMemorySize((unsigned char*)APPLICATION_ADDRESS);//返回Application1中的字节数
int mem2=getMemorySize((unsigned char*)APPLICATION2_ADDRESS);//返回APPLICATION2中的字节数
整数极限;
如果(mem1>mem2)
极限=mem1;
其他的
极限=mem2;
解锁_FLASH();
int lm=极限/2048;
对于(int i=1;iSR&FLASH\u SR\u BSY)!=0);
//检查控制器是否已解锁
如果((闪烁->闪烁和闪烁锁定)!=0){
//写第一个键
闪光->按键=闪光\u FKEY1;
//写第二个键
闪烁->按键=闪烁\u FKEY2;
}
}
无效擦除_闪存(int*c)
{
FLASH->CR |=FLASH_CR_PER;//页面擦除操作
FLASH->ACR=c;//设置要写入的页面的地址
FLASH->CR |=FLASH_CR_STRT;//开始页面擦除
//等待页面擦除完成
而((FLASH->SR&FLASH\u SR\u BSY)!=0);
//如果设置了操作结束位。。。
如果((闪存->SR&FLASH\U SR\U EOP)!=0){
//明白了,手术成功了
闪光->SR |=闪光| SR | EOP;
}
//否则就会出错
否则{
//管理错误案例
}
//退出页面擦除模式
闪光->闪光和闪光;
}
无效写入闪存(int*a,int*b)
{
对于(inti=1;iCR |=FLASH_CR_PG;//编程模式
*(\u IO uint16\u t*)(b)=*a;//写入数据
//等待操作结束
而((FLASH->SR&FLASH\u SR\u BSY)!=0);
//如果设置了操作结束位。。。
如果((闪存->SR&FLASH\U SR\U EOP)!=0){
//明白了,手术成功了
闪光->SR |=闪光| SR | EOP;
}
//否则就会出错
否则{
//管理错误案例
}
}
FLASH->CR&=~ FLASH\u CR\u PG;
}
无效锁定\u闪存(无效)
{
闪烁->闪烁锁定=闪烁锁定;
} 
在这里,交换缓冲区用于在交换时将每个页面(2KB)临时存储为缓冲区。此外,变量限制存储应用程序1和2的最大大小,以便在前面提到的内存大小不等的情况下交换时不会出错。因此,基本上我是逐页交换,一次仅为2KB

有人能找出代码中的错误吗

谢谢,

Shetu是2048字节,而不是2024字节。修复整个代码的增量

另一个限制是每次只能复制2KB的内存

还有一点是,这些内存块必须与2KB对齐

这个地址

#define APPLICATION2_ADDRESS 0x08076400
如果未正确对齐,则其值应能被2048整除(0x800)

#define APPLICATION2_ADDRESS 0x08076400