• No : 14084
  • 公開日時 : 2023/03/15 16:17
  • 更新日時 : 2023/09/07 15:35
  • 印刷

【NXP:LPC】 LPC54628で別の領域に書き込まれているプロジェクトを起動できますか。

LPC54628は、フラッシュの先頭に書き込まれたプロジェクトを実行しますが、別の領域(例:0x0004 0000以降)に書き込まれたプロジェクトを起動させることはできますか。
カテゴリー : 

回答

次のようなソースコードにより別の領域(例:0x0004 0000以降)に書き込まれたプロジェクトを起動させることができます。

    uint32_t fwImageBaseAddr = 0x00040000;
    void (*firmwareFunc)(void);
    uint32_t fwStackVal = *((uint32_t *)(fwImageBaseAddr));     /* the first word is for the stack pointer. */
    uint32_t fwEntryVal = *((uint32_t *)(fwImageBaseAddr+4U));  /* the second works is for the boot function. */
    firmwareFunc = (void (*)(void))fwEntryVal;
    /*ユーザーアプリケーションが有効かどうかを確認するために割り込みベクタ0~7までのチェックサムを計算*/
    uint32_t checksum = 0;
    for (uint32_t cnt = 0; cnt <8 ; cnt++)
    {
        checksum += *((uint32_t*)(fwImageBaseAddr + cnt * 4));
    }
    /*チェックサムが0の場合は、有効なユーザーアプリケーションが書き込まれているので起動可能 */
    if (checksum != 0)
    {
        while (1) {};
    }
    /* SCBのVTORにファームウェアイメージのベースアドレス(割り込みベクタアドレス)を設定 */
    SCB->VTOR = fwImageBaseAddr; /* The stack address is also the start address of vector. */
    /* ユーザーアプリケーションのスタックポインタをMSPとPSPに設定 */
    __set_MSP(fwStackVal);
    __set_PSP(fwStackVal);
    /* ユーザーアプリケーションに分岐 */
    firmwareFunc();