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

          新聞中心

          STM32--簡(jiǎn)單的IAP操作

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          STM32支持在應(yīng)用中編程,也就是所謂的IAP,這對(duì)產(chǎn)品的在線升級(jí)帶來(lái)了很大方便。

          在線升級(jí)的原理簡(jiǎn)介如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/315436.htm

          單片機(jī)的FLASH中有兩段代碼,一段是IAP代碼,另一段就是用戶的應(yīng)用程序即APP代碼,IAP代碼放在單片機(jī)復(fù)位時(shí)的起始地址,而APP代碼則放在IAP后面的地址,上電時(shí)CPU首先執(zhí)行IAP代碼,再通過(guò)IAP代碼跳轉(zhuǎn)到APP代碼開(kāi)始執(zhí)行。

          在IAP代碼執(zhí)行期間,通過(guò)檢測(cè)某一個(gè)事件(如IO電平)來(lái)判斷是否對(duì)APP代碼進(jìn)行更新,如果該事件無(wú)效,則不更新,直接跳轉(zhuǎn)到APP代碼執(zhí)行;如果該事件有效,則更新APP代碼,而更新的文件則從外部磁盤通過(guò)串口或USB寫入FALSH應(yīng)用程序空間。

          流程圖如下:

          當(dāng)然,這只是一種最簡(jiǎn)單的方式,它還可以是當(dāng)APP代碼在執(zhí)行時(shí),將PC指針跳轉(zhuǎn)到IAP來(lái)更新自已。

          實(shí)現(xiàn)的大致原理都是一致的,只是方式不同罷了。

          值得注意的是:

          IAP跳轉(zhuǎn)的地址必須APP的起始地址一致,相應(yīng)的中斷向量表也要修改,否則APP將不能正確的運(yùn)行。

          在附件我整理的代碼中,串口方式的IAP跳轉(zhuǎn)的地址為0x8002000,因此應(yīng)用程序的起始地址也應(yīng)為0x8002000,在KEIL設(shè)置下如下圖:

          還有中斷向量表的起始地址也應(yīng)改為0x8002000:

          /*SettheVectorTablebaseaddressat0x08002000*/

          NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);//NVIC_VectTab_FLASH=0x08000000

          只有以上兩處設(shè)置正確才能確保APP能正確的運(yùn)行。

          USB方式的IAP跳轉(zhuǎn)的地址為0x8004000,設(shè)置方法同上。

          升級(jí)文件傳輸方式

          串口方式的IAP在超級(jí)終端下用Ymode協(xié)議,波特率115200;文件為.BIN格式。

          USB方式的IAP用DfuSeUSBDeviceFirmwareUpgrade軟件傳送,文件為dfu格式。

          總的來(lái)說(shuō),IAP帶給我的體驗(yàn)還是非常愉快的!

          所謂IAP,就是在系統(tǒng)編程,也就是說(shuō),CPU在運(yùn)行的
          過(guò)程中,可以對(duì)FLASH進(jìn)行刷寫.基本的應(yīng)用可用于寫入加密字或者一些存儲(chǔ)信息等,高級(jí)點(diǎn)
          的應(yīng)用則是用于某些使用的設(shè)備上,系統(tǒng)查入SD卡后自動(dòng)更新程序等.

          在stm32f10x_conf.h中開(kāi)放#include"stm32f10x_flash.h"

          #include"STM32Lib\stm32f10x.h"
          #include"hal.h"

          #defineFLASH_ADR0x08008000//要寫入數(shù)據(jù)的地址
          #defineFLASH_DATA0x8a8a8a8a//要寫入的數(shù)據(jù)

          intmain(void)
          {
          u32tmp;
          ChipHalInit();//片內(nèi)硬件初始化
          ChipOutHalInit();//片外硬件初始化
          //判斷此FLASH是否為空白
          tmp=*(vu32*)(FLASH_ADR);

          /*將地址(FLASH_ADR)強(qiáng)制轉(zhuǎn)化為(vu32*)型指針求內(nèi)容*然后再將值賦給tmp。還是比較考練C語(yǔ)言的,老師上課可從沒(méi)這么講過(guò)。*/
          if(tmp==0xffffffff)
          {
          FLASH_Unlock();
          FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
          FLASH_Lock();
          USART1_Puts("要寫入的地址為空,已經(jīng)寫入認(rèn)證數(shù)據(jù)rn");//在指定地址編寫一個(gè)字
          }
          elseif(tmp==FLASH_DATA)
          {
          USART1_Puts("地址數(shù)據(jù)與認(rèn)證數(shù)據(jù)符合rn");
          FLASH_Unlock();
          FLASH_ErasePage(FLASH_ADR);

          /*和眾多FLASH存儲(chǔ)器的特性類似,STM32內(nèi)的FLASH數(shù)據(jù)只能由1變成0,如果要由0
          變成1,則需要調(diào)用刷除函數(shù),把一個(gè)頁(yè)都刷除掉.如果不擦也能寫但是只能寫上0*/
          FLASH_ProgramWord(FLASH_ADR,0x11223344);
          FLASH_Lock();
          USART1_Puts("寫入了0x11223344rn");
          }
          else
          {
          USART1_Puts("地址上的數(shù)據(jù)與認(rèn)證的數(shù)據(jù)不符合,有可能是寫入失敗或者是要寫入的地址非空rn");
          FLASH_Unlock();
          FLASH_ErasePage(FLASH_ADR);
          FLASH_Lock();
          USART1_Puts("已經(jīng)刷除了要寫入的地址rn");
          }
          while(1);
          }

          系統(tǒng)通過(guò)串口輸出寫FLASH的狀情況,在第一次運(yùn)行的時(shí)候,一般情況,0x08008000處的
          FLASH為空,于是系統(tǒng)就往空的FLASH上寫入一個(gè)數(shù)據(jù)0x8a8a8a8a.并提示已經(jīng)寫入.此時(shí)用
          戶只要再次復(fù)位一下系統(tǒng),則由于之前已經(jīng)寫入并為系統(tǒng)所讀取,則這次串口就會(huì)輸出已經(jīng)寫
          入了數(shù)據(jù)的信息.
          注意寫FLASH之前需要調(diào)用解鎖函數(shù),寫入后應(yīng)調(diào)用鎖定函數(shù).

          閃存的指令和數(shù)據(jù)訪問(wèn)是通過(guò)AHB總線完成的。預(yù)取模塊是用于通過(guò)ICode總線讀取指令的。仲裁是作用在閃存接口,并且DCode總線上的數(shù)據(jù)訪問(wèn)優(yōu)先。

          讀訪問(wèn)可以有以下配置選項(xiàng):

          ●等待時(shí)間:可以隨時(shí)更改的用于讀取操作的等待狀態(tài)的數(shù)量。

          ●預(yù)取緩沖區(qū)(2個(gè)64位):在每一次復(fù)位以后被自動(dòng)打開(kāi),由于每個(gè)緩沖區(qū)的大小(64位)與閃存的帶寬相同,因此只通過(guò)需一次讀閃存的操作即可更新整個(gè)緩沖區(qū)的內(nèi)容。由于預(yù)取緩沖區(qū)的存在,CPU可以工作在更高的主頻。CPU每次取指最多為32位的字,取一條指令時(shí),下一條指令已經(jīng)在緩沖區(qū)中等待。

          ●半周期:用于功耗優(yōu)化。

          注:1.這些選項(xiàng)應(yīng)與閃存存儲(chǔ)器的訪問(wèn)時(shí)間一起使用。等待周期體現(xiàn)了系統(tǒng)時(shí)鐘(SYSCLK)頻率與閃存訪問(wèn)時(shí)間的關(guān)系:0等待周期,當(dāng)0

          2.半周期配置不能與使用了預(yù)分頻器的AHB一起使用,時(shí)鐘系統(tǒng)應(yīng)該等于HCLK時(shí)鐘。該特性只能用在時(shí)鐘頻率為8MHz或低于8MHz時(shí),可以直接使用的內(nèi)部RC振蕩器(HSI),或者是主振蕩器(HSE),但不能用PLL。

          3.當(dāng)AHB預(yù)分頻系數(shù)不為1時(shí),必須置預(yù)取緩沖區(qū)處于開(kāi)啟狀態(tài)。

          4.只有在系統(tǒng)時(shí)鐘(SYSCLK)小于24MHz并且沒(méi)有打開(kāi)AHB的預(yù)分頻器(即HCLK必須等于SYSHCLK)時(shí),才能執(zhí)行預(yù)取緩沖器的打開(kāi)和關(guān)閉操作。一般而言,在初始化過(guò)程中執(zhí)行預(yù)取緩沖器的打開(kāi)和關(guān)閉操作,這時(shí)微控制器的時(shí)鐘由8MHz的內(nèi)部RC振蕩器(HSI)提供。

          5.使用DMA:DMA在DCode總線上訪問(wèn)閃存存儲(chǔ)器,它的優(yōu)先級(jí)比ICode上的取指高。DMA在每次傳送完成后具有一個(gè)空余的周期。有些指令可以和DMA傳輸一起執(zhí)行。

          /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


          在ST官網(wǎng)下載IAP歷程,鏈接http://www.st.com/stonline/products/support/micro/files/an2557.zip

          移植歷程到自己的開(kāi)發(fā)板上

          主要修改main.c中的串口初始化函數(shù)IAP_Init(),根據(jù)需要再添加一個(gè)開(kāi)發(fā)板端口初始化的函數(shù),修改int main()函數(shù)里進(jìn)入IAP的條件

          應(yīng)用程序的修改主要是四點(diǎn)

          1、 options for target-->將ROM1修改成0x8002000

          2、 option for target-->linker-->勾選use memory layout from target dialog

          3、 options for target -->user 在run user programs after build/rebuild下給run#1和run#2打勾,并分別填上I:embeddedKeil MdkARMBIN40fromelf.exe --bin -o my.bin outputrelease.axf和I:embeddedKeil MdkARMBIN40fromelf.exe -z outputrelease.axf,注意地址要正確,主要目的是調(diào)用keil自帶的hex轉(zhuǎn)工具將keil編譯程序后生成的release.axf轉(zhuǎn)成bin文件

          4、 在程序中重定向向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH+0x2000, 0x2000);

          下載程序方法:

          1、 現(xiàn)在IAP的引導(dǎo)程序,也就是移植官網(wǎng)的那個(gè)程序。

          2、 使用開(kāi)始—所有程序--附件—通信—超級(jí)終端進(jìn)行下載,超級(jí)終端配置為無(wú)數(shù)據(jù)流控制,另外波特率、數(shù)據(jù)位等要與例程的串口配置要對(duì)應(yīng),輸入1使開(kāi)發(fā)板進(jìn)入等待下載的模式,點(diǎn)擊超級(jí)終端的傳送à傳送文件,選擇文件,協(xié)議使用例程的Ymodern,下載完后輸入2即可運(yùn)行應(yīng)用程序




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