前言
如果我們的App 程序起始地址在0x08006000 ,并且App 的中斷向量表在起始地址,那么BootLoader 程序下載App 后,為了App 程序能正確運行,開始App 程序的運行后第一步,就要把中斷向量表重定位到0x08006000 那里。
跳轉(zhuǎn)到新程序運行
我們的BootLoader下載App程序后,App程序就需要做同樣的事情。主要有三個步驟,其中BootLoader程序需要做的是:
- 跳轉(zhuǎn)到復位向量
App需要做的是:
- 重定位中斷向量表
- 設置棧指針
?文章來源地址http://www.zghlxwxcb.cn/news/detail-502641.html
根據(jù)上圖分析加入IAP后的起動和運行過程
- STM32復位后,還是從0X08000004地址取出復位中斷向量的地址,并跳轉(zhuǎn)到復位中斷服務程序,在運行完復位中斷服務程序之后跳轉(zhuǎn)到IAP的main函數(shù),如將IAP看作是一個APP的話,那么此部分和正常起動是一樣的。(此步=執(zhí)行復位中斷服務程序+跳轉(zhuǎn)main,即將正常運行的①和②合并了)。
- ?在執(zhí)行完IAP以后(固件升級或直接跳轉(zhuǎn)),跳轉(zhuǎn)至APP的復位向量表(APP的復位中斷向量起始地址為0X08000004+N+M)。
- ?取出APP的復位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復位中斷服務程序,隨后跳轉(zhuǎn)至APP的main函數(shù)(此步=執(zhí)行復位中斷服務程序+跳轉(zhuǎn)main)
- ?同樣main函數(shù)為一個超循環(huán),并且注意到此時STM32的FLASH,在不同位置上,共有兩個中斷向量表。在main函數(shù)執(zhí)行過程中,如果CPU得到一個中斷請求,PC指針仍強制跳轉(zhuǎn)到地址0X08000004中斷向量表處,而不是APP程序的中斷向量表。
- ?程序再根據(jù)我們設置的中斷向量表偏移量,跳轉(zhuǎn)到對應中斷源的APP的中斷服務程序中,
- 在執(zhí)行完中斷服務程序后,程序返回main函數(shù)繼續(xù)運行。
gd32的啟動文件:
升級bootloader調(diào)試記錄
目前boot的實現(xiàn)方式有兩種
- 一直是boot里面只做文件拷貝、版本對比與跳轉(zhuǎn)。這種方法的好處是不需要在boot中添加通訊協(xié)議及相關的通訊功能。但是升級需要外部有一個備份區(qū)來進行存儲升級數(shù)據(jù),占用空間較大,但是升級失敗后,依然可以運行之前的app,保證機器能一直有app可以使用。
- 另外一種是在boot里面增加通訊功能,讓其具備接收數(shù)據(jù)、并將數(shù)據(jù)寫到指定位置的特性。使用這種方式可以實現(xiàn)不要備份區(qū)升級、以此來滿足小容量單片機的需求。每次進行升級都會對app區(qū)進行擦寫。這樣就會導致一個問題,當升級失敗后,會一直停留在boot等待再一次升級,直到升級成功后,才能去運行app。
升級app調(diào)試記錄
如果使用了bootloader后需要調(diào)試app應用需要做一下操作
1、修改ROM1起始位置及大小
?
2、修改啟動文件(.s)中的NVIC中斷向量表的偏移。比如,我的app其中地址的偏移為
#define VECT_TAB_OFFSET (uint32_t)0x1E00 /* vector table base offset */
在SystemInit中會用到
3、修改debug的app堆棧指針的偏移,這里使用外部加載ini文件的方式。
文件內(nèi)容
SP = _RDWORD(0x08001E00); // Setup Stack Pointer
PC = _RDWORD(0x08001E04); // Setup Program Counter
?
4、到這里你就可以開心的調(diào)試自己的代碼了。
文章來源:http://www.zghlxwxcb.cn/news/detail-502641.html
?
到了這里,關于STM32/GD32 BootLoader升級 IAP升級的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!