新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 IAP 無法運行用戶程序的解決方法

STM32 IAP 無法運行用戶程序的解決方法

作者: 時間:2016-12-03 來源:網(wǎng)絡 收藏
IAP程序:
主要是設置用戶程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通過外設把用戶代碼寫入FLASH的用戶區(qū)。滿足條件后,跳轉至用戶區(qū)起始地址。
解釋一下跳轉部分代碼:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判斷棧頂?shù)刂肥欠裨?x2000 0000 - 0x2000 2000之間
// 通過判斷棧頂?shù)刂分凳欠裾_來判斷是否已經(jīng)下載用戶應用程序。因為用戶程序的啟動文件開始會初始化??臻g,如果棧頂?shù)刂氛_,說明用戶程序已經(jīng)下載。
{
__set_PRIMASK(1);// 關閉全局中斷。注意,在跳轉前,必須先關閉全局中斷,進入用戶程序后,在中斷向量表地址設置完成后再開中斷。
printf("Jump to the new program.rn");
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);// 前4字節(jié)為中斷向量表
Jump_To_Application = (pFunction) JumpAddress;// 指向用戶程序復位函數(shù)所在的地址
/* Initialize user applications Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 設置用戶程序的棧指針
Jump_To_Application();// 執(zhí)行用戶程序
}
需要注意的是,在IAP程序中,跳轉用戶程序前,需要先關閉全局中斷。
可以看論壇上的討論http://www.amobbs.com/thread-5606964-1-1.html
用戶程序:
主要是設置中斷向量表的偏移地址和工程選項里的ROM起始地址。需要注意的是在SystemInit()后再設置中斷向量表,以及開全局中斷。
可以在main的開始設置中斷向量表。
工程選項的修改

在main函數(shù)開始增加設置中斷向量表的部分
// 使用IAP,修改用戶程序區(qū)基址地址,必須為0x200的整數(shù)倍(stm32f205)
// 注意:工程選項相應修改:IROM1: start: 0x8004000
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */ // 修改FLASH向量表,起始地址由0x8004000開始為用戶程序區(qū)
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
__set_PRIMASK(0);// 開啟全局中斷
#endif
用戶程序需要轉成.bin格式,在工程選項中,User->After Build/Rebuild 中添加 fromelf.exe --bin -o "$L@L.bin" "#L",可實現(xiàn)在輸出目錄中輸出bin文件。
另外可以再添加.bat文件,把.hex和.bin文件拷貝出來,例如:
copy ..Objectsoutput.hex Flashacq_v2_IAPMain.hex
copy ..Objectsoutput.bin Flashacq_v2_IAPMain.bin
合并燒寫:
在燒寫程序時,需要先用燒寫器燒寫IAP程序,就是BOOTLOADER的部分,然后再通過外設寫入用戶程序。
但其實,這兩步可以合并為一步燒寫。
把IAP的.hex最后一句結束語去掉,即刪除 :00000001FF;然后把用戶程序的.hex全部內容復制到IAP的.hex后面;最后把整合后的.hex文件燒寫到0x0800 0000的起始地址即可。


評論


技術專區(qū)

關閉