STM32程序跳轉(zhuǎn)需要注意的問題
Note: keil生成的.axf或者.elf都是可以執(zhí)行的鏡像文件。
IAP <->User Program 需要注意的問題
要設(shè)置好好中斷向量的問題,假設(shè)User Program 開始地址是(0x08008000),那么中斷向量就必須設(shè)在在0x08008000處,中斷向量要設(shè)置program的開始的位置。
User Program到IAP主要是要設(shè)置好中斷向量,跳轉(zhuǎn)前要注意設(shè)置中斷向量在IAP程序(0x08000000)的開始地方即(0x08000000)。還要關(guān)閉所有中斷,如下操作:
NVIC_SetVectorTable(0x08000000, 0x00);
__disable_irq();
問題:如果這樣子做,跳到了IAP后,有從IAP跳回來,就會(huì)出現(xiàn)問題了,原因不懂。我的解決方法是:當(dāng)執(zhí)行完IAP后,即升級(jí)完成后,直接重啟MCU系統(tǒng)。
這樣子就可以設(shè)置好了。注意program<->IAP 沒有升級(jí) 然后直接IAP到program,會(huì)導(dǎo)致program沒有正常工作,目前的解決方法是:program<->IAP后,IAP可以讓系統(tǒng)重啟,然后就可以了。
系統(tǒng)重啟的函數(shù)如下:
static__INLINEvoidNVIC_SystemReset(void)
{
SCB->AIRCR=((0x5FA<
(SCB->AIRCR&SCB_AIRCR_PRIGROUP_Msk)|
SCB_AIRCR_SYSRESETREQ_Msk);/*Keepprioritygroupunchanged*/
__DSB();/*Ensurecompletionofmemoryaccess*/
while(1);/*waituntilreset*/
}
此函數(shù)可以讓系統(tǒng)重啟。
簡單的說IAP就是一個(gè)普通額程序,就是負(fù)責(zé)APP的Flash區(qū)的擦除和編程。