私はARM M4 CortexデバイスであるSTM32L475 IoTキットに取り組んでいます。フラッシュ メモリの 2 つの領域をスワップしたいと考えています。私が使用しているボードには、それぞれ 512KB のサイズのフラッシュ メモリ用のバンクが 2 つあるため、1 MB のフラッシュ メモリがあります。フラッシュ メモリの内容を交換するには、最初にロックを解除し、次に消去してから書き込み、操作が終了したらフラッシュ メモリをロックする必要があることを読みました。
ページとして定義されている一度に 2KB のメモリしかコピーできないという別の制限があります。そのため、メモリのページごとのコピーのみが可能です。私のアプリケーションでは、いくつかの条件が満たされた場合、FLASH メモリに保存されているアプリケーション 1 と 2 を交換する必要があります。両方のアプリケーションにそれぞれ 384 KB のメモリが割り当てられていますが、実際にはどちらもそれよりも少ないメモリを使用します (たとえば、264 KB など)。
上記の手順を実行しようとしましたが、うまくいきません。これが私が試したコードです:-
#define APPLICATION_ADDRESS 0x0800F000
#define APPLICATION2_ADDRESS 0x0806F800
#define SWAP_ADDRESS 0x0806F000
boolean swap(void)
{
char *app_1=( char*) APPLICATION_ADDRESS;//points to the 1st address of application1
char *app_2=(char*) APPLICATION2_ADDRESS;//points to the 1st address of application2
int mem1 = getMemorySize((unsigned char*)APPLICATION_ADDRESS);//returns the number of bytes in Application1
int mem2 = getMemorySize((unsigned char*)APPLICATION2_ADDRESS);//returns the number of bytes in Application2
int limit;
if(mem1>mem2)
limit= mem1;
else
limit= mem2;
Unlock_FLASH();
int lm = limit/2048;
for(int i=1; i<=lm; i++,app_1+=2048,app_2+=2048)
{
int *swap = (int *)SWAP_ADDRESS;
Erase_FLASH(swap);
Write_FLASH(app_1, swap);
Erase_FLASH(app_1);
Write_FLASH(app_2, app_1);
Erase_FLASH(app_2);
Write_FLASH(swap, app_2);
}
Lock_FLASH();
return TRUE;
}
void Unlock_FLASH(void)
{
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
// Check if the controller is unlocked already
if ((FLASH->CR & FLASH_CR_LOCK) != 0 ){
// Write the first key
FLASH->KEYR = FLASH_FKEY1;
// Write the second key
FLASH->KEYR = FLASH_FKEY2;
}
}
void Erase_FLASH(int *c)
{
FLASH->CR |= FLASH_CR_PER; // Page erase operation
FLASH->ACR = c; // Set the address to the page to be written
FLASH->CR |= FLASH_CR_STRT;// Start the page erase
// Wait until page erase is done
while ((FLASH->SR & FLASH_SR_BSY) != 0);
// If the end of operation bit is set...
if ((FLASH->SR & FLASH_SR_EOP) != 0){
// Clear it, the operation was successful
FLASH->SR |= FLASH_SR_EOP;
}
//Otherwise there was an error
else{
// Manage the error cases
}
// Get out of page erase mode
FLASH->CR &= ~FLASH_CR_PER;
}
void Write_FLASH(int *a, int *b)
{
for(int i=1;i<=2048;i++,a++,b++)
{
FLASH->CR |= FLASH_CR_PG; // Programing mode
*(__IO uint16_t*)(b) = *a; // Write data
// Wait until the end of the operation
while ((FLASH->SR & FLASH_SR_BSY) != 0);
// If the end of operation bit is set...
if ((FLASH->SR & FLASH_SR_EOP) != 0){
// Clear it, the operation was successful
FLASH->SR |= FLASH_SR_EOP;
}
//Otherwise there was an error
else{
// Manage the error cases
}
}
FLASH->CR &= ~FLASH_CR_PG;
}
void Lock_FLASH(void)
{
FLASH->CR |= FLASH_CR_LOCK;
}
ここで、スワップ バッファーは、スワップ中に各ページ (2KB) をバッファーとして一時的に格納するために使用されます。また、変数 limit にはアプリケーション 1 と 2 の最大サイズが格納されるため、前述のようにメモリ サイズが等しくない場合にスワップ中にエラーが発生することはありません。したがって、基本的にはページごとにスワップしていますが、一度に 2 KB しかありません。
コードの何が問題なのか誰でも理解できますか?
ありがとう、
シェトゥ