1. 程式人生 > >STM32線上升級原理,和應用程式不正常執行

STM32線上升級原理,和應用程式不正常執行

為方便產品出廠後,使用者可以通過外設介面如USB,USART對裝置進行升級,通常會有一段引導程式碼,在開機的時候從Boot啟動,啟動通過與上位機通訊是否需要升級,如果沒有升級就直接跳轉到APP空間,及一個超迴圈體中(無操作系),boot程式一般放在flash開始出0x08000000處,使用者可以在此處放入boot程式碼,處理上位機發送過來程式碼段資料,通過操作flash將我們的APP放到指定偏移地址,燒寫完畢後,可以自動跳轉到對應的地址開始執行應用程式APP;應用程式如果通過線上燒寫st-link燒寫,需要將keil編譯選項中的rom地址改為0x08002000,0x2000就是APP存放程式碼的偏移地址,並且還需要再程式碼中將我們的中斷向量偏移到0x2000處;

NVIC_VectTableSet(NVIC_VECTTAB_FLASH, 0x2000);//將中斷向量表初始化

從boot跳轉到APP空間的函式可以參考如下程式碼段,在跳轉前,必須先關閉掉所有可能產生中斷的外設,如下面的定時器,因為在跳轉後,app如果還未重新定義中斷向量表,此時產生的中斷就會讓程式跑飛,必須關閉:

void Go_APP(void)
{
u32 JumpAddress;
pFunction Jump_To_Application;

/**************關閉定時器*********************/
TIMER_Enable( TIMER1 , DISABLE);
TIMER_ClearIntBitState( TIMER1 , TIMER_INT_UPDATE);
TIMER_INTConfig(TIMER1 ,TIMER_INT_UPDATE , DISABLE);
TIMER_DeInit(TIMER1);



if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//這個必須要,
{
//跳轉至使用者程式碼
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;        
//初始化使用者程式的堆疊指標
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
else  //無應用程式
{
//做出異常處理
}
}

二、升級完成後,出現另一個問題,程式在flash中不偏移地址,所有中斷都沒有問題,但如果加了偏移地址,部分中斷就出現了問題,出現這個原因定位為中斷處理函式太長,程式碼量太大造成,具體根本原因還不知道,如果哪位出現類似問題,可以看看你的中斷函式是否呼叫了時間較長的處理函式和大程式碼量的函式,如有誰知道了根本原因還望告知;