<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時(shí)間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          IAP程序:
          主要是設(shè)置用戶程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通過外設(shè)把用戶代碼寫入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之間
          // 通過判斷棧頂?shù)刂分凳欠裾_來判斷是否已經(jīng)下載用戶應(yīng)用程序。因?yàn)橛脩舫绦虻膯?dòng)文件開始會(huì)初始化??臻g,如果棧頂?shù)刂氛_,說明用戶程序已經(jīng)下載。
          {
          __set_PRIMASK(1);// 關(guān)閉全局中斷。注意,在跳轉(zhuǎn)前,必須先關(guān)閉全局中斷,進(jìn)入用戶程序后,在中斷向量表地址設(shè)置完成后再開中斷。
          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è)置中斷向量表,以及開全局中斷。
          可以在main的開始設(shè)置中斷向量表。
          工程選項(xiàng)的修改

          在main函數(shù)開始增加設(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開始為用戶程序區(qū)
          /* Set the Vector Table base location at 0x08000000 */
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
          __set_PRIMASK(0);// 開啟全局中斷
          #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文件拷貝出來,例如:
          copy ..Objectsoutput.hex Flashacq_v2_IAPMain.hex
          copy ..Objectsoutput.bin Flashacq_v2_IAPMain.bin
          合并燒寫:
          在燒寫程序時(shí),需要先用燒寫器燒寫IAP程序,就是BOOTLOADER的部分,然后再通過外設(shè)寫入用戶程序。
          但其實(shí),這兩步可以合并為一步燒寫。
          把IAP的.hex最后一句結(jié)束語去掉,即刪除 :00000001FF;然后把用戶程序的.hex全部內(nèi)容復(fù)制到IAP的.hex后面;最后把整合后的.hex文件燒寫到0x0800 0000的起始地址即可。


          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();