stm32執行完loader程序後如何跳轉到應用程序呢,一共有四件事要做:
第一,關閉外設中斷,關閉外設時鐘,失能外設功能,如果不關閉,跳轉到app區後會產生各種奇怪的問題
第二,重設中斷向量表位置,設置在app程序的起始地址
根據stm32中斷向量表的定義,表的地址就是可執行程序的起始地址,設置好後方便應用程序進入中斷後可以找到對應的中斷程序入口
第三,重設堆棧指針,設置在app程序的起始地址,application_addr + 0x00000000
stm32復位後的第一件事就是取堆棧地址,此處跳轉也是一樣,第一件事就是取得堆棧地址,想想ucos中切到新任務第一件事不也是找到堆棧地址嗎
第四,取出app程序的main函數地址,application_addr + 0x00000004
stm32復位後的第二件事就是找到復位地址,然後從裏面取得main函數的地址,根據stm32中斷向量表的定義,復位地址的偏移量是0x04,緊挨着堆棧棧頂地址,因此需要取得application_addr + 0x00000004地址處的內容,然後執行
typedf void(*pfunc)(void);
((pfunc)(*(uint32_t*)(application_addr + 0x00000004)))();