新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 IAP 無(wú)法運(yùn)行用戶程序的解決方法

STM32 IAP 無(wú)法運(yùn)行用戶程序的解決方法

作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò) 收藏
IAP程序:
主要是設(shè)置用戶程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通過(guò)外設(shè)把用戶代碼寫(xiě)入FLASH的用戶區(qū)。滿足條件后,跳轉(zhuǎn)至用戶區(qū)起始地址。
解釋一下跳轉(zhuǎn)部分代碼:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判斷棧頂?shù)刂肥欠裨?x2000 0000 - 0x2000 2000之間
// 通過(guò)判斷棧頂?shù)刂分凳欠裾_來(lái)判斷是否已經(jīng)下載用戶應(yīng)用程序。因?yàn)橛脩舫绦虻膯?dòng)文件開(kāi)始會(huì)初始化??臻g,如果棧頂?shù)刂氛_,說(shuō)明用戶程序已經(jīng)下載。
{
__set_PRIMASK(1);// 關(guān)閉全局中斷。注意,在跳轉(zhuǎn)前,必須先關(guān)閉全局中斷,進(jìn)入用戶程序后,在中斷向量表地址設(shè)置完成后再開(kāi)中斷。
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;// 指向用戶程序復(fù)位函數(shù)所在的地址
/* Initialize user applications Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 設(shè)置用戶程序的棧指針
Jump_To_Application();// 執(zhí)行用戶程序
}
需要注意的是,在IAP程序中,跳轉(zhuǎn)用戶程序前,需要先關(guān)閉全局中斷。
可以看論壇上的討論http://www.amobbs.com/thread-5606964-1-1.html
用戶程序:
主要是設(shè)置中斷向量表的偏移地址和工程選項(xiàng)里的ROM起始地址。需要注意的是在SystemInit()后再設(shè)置中斷向量表,以及開(kāi)全局中斷。
可以在main的開(kāi)始設(shè)置中斷向量表。
工程選項(xiàng)的修改

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


評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉