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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 IAP功能實(shí)現(xiàn)學(xué)習(xí)筆記

          STM32 IAP功能實(shí)現(xiàn)學(xué)習(xí)筆記

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          最早接觸STM32的時(shí)候就了解到,stm32有IAP功能,但是一直沒有用到,最近公司項(xiàng)目中用到了,我才詳細(xì)的學(xué)習(xí)了這個(gè)功能,學(xué)完之后感覺這個(gè)功能很好用,也很實(shí)用,特此寫下來(lái),做個(gè)筆記,同時(shí)也希望能幫助到所有的熱愛單片機(jī)的人;。

          直奔主題把,最初我做了一個(gè)小實(shí)驗(yàn),具體內(nèi)容是:
          1.寫兩個(gè)小程序,編譯完畢生成兩個(gè)bin文件
          2.用stm官方提供的flashloader 下載到單片機(jī)內(nèi),不過這里需要注意的是第二個(gè)bin文件的下載地址需要更改,具體怎么改后面介紹
          3.通過某種觸發(fā)方式,讓單片機(jī)在兩個(gè)程序之間來(lái)回切換
          上面是我實(shí)驗(yàn)的內(nèi)容,在做這個(gè)小實(shí)驗(yàn)的前提是你必須知道怎么在兩個(gè)程序之間跳轉(zhuǎn),其次你也必須知道bin文件的生成,以及生成之前工程選項(xiàng)的設(shè)置,最后肯定是怎么下載到單片機(jī)內(nèi)。
          一、跳轉(zhuǎn)代碼的實(shí)現(xiàn)
          從官方網(wǎng)站上下載了IAP例子,從中摘取了一下代碼用在項(xiàng)目中,其他的沒有用,只需核心部分。
          if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
          {
          JumpAddress = *(volatile uint32_t*)(ApplicationAddress + 4);
          Jump_To_Application = (pFunction)JumpAddress;
          __set_MSP(*(volatile uint32_t*)ApplicationAddress); //初始化用戶程序的堆棧指針
          Jump_To_Application();
          }
          ApplicationAddress是你要跳轉(zhuǎn)的那個(gè)代碼存放的首地址,我代碼里是
          #define ApplicationAddress1 0x08008000 //應(yīng)用程序起始地址
          JumpAddress = *(volatile uint32_t*)(ApplicationAddress + 4); 這句話的意思執(zhí)行的結(jié)果是,打開bin文件偏移四個(gè)字節(jié)后的一個(gè)uint32數(shù)據(jù),具體是為什么取這個(gè)數(shù),對(duì)bin文件感興趣的朋友可以自己研究一下。如果你這段代碼實(shí)在不理解,不過沒關(guān)系,你只需要添加進(jìn)去就行了,呵呵
          0x08000000-----------------------------------------
          |
          | 程序1
          |
          |
          0x08008000 -----------------------------------------
          |
          |
          | 程序2
          |
          |
          -----------------------------------------
          程序1和我們普通的代碼一樣不需要設(shè)置中斷偏移量,工程選項(xiàng)也不需要設(shè)置,程序2需要設(shè)置,設(shè)置流程如下:
          將里面原來(lái)的數(shù)據(jù)0x8000000改為0x8008000,不一定非要是這個(gè),我只是害怕小了重疊,官網(wǎng)給的是 0x8004000,
          同時(shí)在你的代碼里加上中斷偏移設(shè)置為0x8000
          #ifdef VECT_TAB_RAM
          // Set the Vector Table base location at 0x20000000
          NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
          #else /* VECT_TAB_FLASH */
          // Set the Vector Table base location at 0x08000000
          //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
          #endif
          二、bin文件的生成
          填入的內(nèi)容和你工程路徑有關(guān)系,我的是:
          fromelf --bin --output E:STM32_IAP2ProjectoutputProj1.bin E:STM32_IAP2ProjectoutputProj1.axf
          當(dāng)然了,兩個(gè)代碼,肯定路徑也是不一樣,調(diào)試的時(shí)候發(fā)現(xiàn) 這個(gè)axf文件名和bin文件名必須和下面圖片中的名字一直,否則生成bin文件錯(cuò)誤
          如果編譯完畢顯示如下信息,說明你的bin文件生成正確了,
          三、bin文件的下載過程
          點(diǎn)擊下一步 next,直到出現(xiàn)下面界面
          先擦出一下整個(gè)芯片,然后載入代碼1對(duì)應(yīng)的bin文件,
          注意看地址,第一個(gè)代碼設(shè)置的為 8000000,第二個(gè)為你代碼中的地址,我的為8008000,第二個(gè)代碼下載截圖如下,
          代碼可以到我csdn帳號(hào)中下載,免費(fèi)的,連接為http://download.csdn.net/detail/likang123321/5318910
          通過上面的介紹,相信離遠(yuǎn)程更新已經(jīng)不遠(yuǎn)了,大家根據(jù)具體情況可以具體應(yīng)用,
          當(dāng)你下載連個(gè)代碼到單片機(jī)內(nèi)后,上電運(yùn)行的是第一個(gè),此時(shí)你發(fā)送0xaa到串口,代碼會(huì)跳轉(zhuǎn)到代碼2,繼續(xù)發(fā)送0xaa單片機(jī)會(huì)回到代碼1執(zhí)行,我感覺很有趣,希望本文能夠讓更多i的電子愛好者了解IAP,謝謝閱讀,有什么不足之處,請(qǐng)廣大大神提出寶貴的意見,共同學(xué)習(xí)中……


          關(guān)鍵詞: STM32IAP功

          評(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); })();