次のようなソースコードにより別の領域(例: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();