1

私は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 しかありません。

コードの何が問題なのか誰でも理解できますか?

ありがとう、
シェトゥ

4

1 に答える 1