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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32存儲器知識的相關(guān)應(yīng)用“>STM32存儲器 — STM32存儲器知識的相關(guān)應(yīng)用

          STM32存儲器知識的相關(guān)應(yīng)用“>STM32存儲器 — STM32存儲器知識的相關(guān)應(yīng)用

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

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

          2、想操作Peripherals中Bit Band區(qū)地址為0x4000 0021字節(jié)的第7位

          (可能是一個功能寄存器);

          計(jì)算別名區(qū)對應(yīng)子地址:0x4200 0000+(21*32)+(7*4)=0x4200 02BC

          所以,對0x4200 02BC的操作,就是對0x4000 0021字節(jié)的第7位進(jìn)行操作;

          對比使用Bit Banding功能和直接訪問Bit Band區(qū)域,如圖:

          5 STM32的IAP

          In Application Programming,在應(yīng)用編程。

          5.1什么是IAP

          IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運(yùn)行過程中對User Flash的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的固件程序進(jìn)行更新升級。通常在用戶需要實(shí)現(xiàn)IAP功能時,即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時編寫兩個項(xiàng)目代碼,第一個項(xiàng)目程序不執(zhí)行正常的功能操作,而只是通過某種通信管道(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個項(xiàng)目代碼開始運(yùn)行,它作如下操作:

          1)檢查是否需要對第二部分代碼進(jìn)行更新

          2)如果不需要更新則轉(zhuǎn)到4)

          3)執(zhí)行更新操作

          4)跳轉(zhuǎn)到第二部分代碼執(zhí)行

          第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過第一部分IAP代碼更新。

          對于STM32來說,因?yàn)樗闹袛嘞蛄勘砦挥诔绦虼鎯ζ鞯淖畹偷刂穮^(qū),為了使第一部分代碼能夠正確地響應(yīng)中斷,通常會安排第一部分代碼處于Flash的開始區(qū)域,而第二部分代碼緊隨其后。

          在第二部分代碼開始執(zhí)行時,首先需要把CPU的中斷向量表映像到自己的向量表,然后再執(zhí)行其他的操作。

          如果IAP程序被破壞,產(chǎn)品必須通過JTAG或ISP重新燒寫程序,這是很麻煩并且非常耗費(fèi)時間和金錢的。針對這樣的需求,STM32在對Flash區(qū)域?qū)嵭凶x保護(hù)的同時,自動地對用戶Flash區(qū)的開始4頁設(shè)置為寫保護(hù),這樣可以有效地保證IAP程序(第一部分代碼)區(qū)域不會被意外地破壞。

          如圖為IAP示意圖:

          5.2設(shè)計(jì)自己獨(dú)特的IAP

          IAP程序可以自己設(shè)計(jì),這樣能夠符合自身對在先下載的特殊需求。針對這一要求,本文進(jìn)行了一個IAP程序的結(jié)構(gòu)設(shè)計(jì),并已經(jīng)通過測試。

          帶IAP的系統(tǒng)由兩個工程需要編寫,一個是IAP工程,一個User App工程。

          設(shè)計(jì)將IAP程序放在0x0800 0000——0x0800 2000這段空間中,User App放在0x0800 2000之后的余下空間;

          下面描述如何友好的處理著兩個工程之間程序運(yùn)行的關(guān)系,達(dá)到IAP這個功能:

          1)設(shè)置系統(tǒng)為Boot from main flash memory啟動模式;

          2)系統(tǒng)上電之后PC指向0x0800 0000處,進(jìn)而運(yùn)行到IAP工程的main()入口處;

          3)在IAP中:檢測標(biāo)志,如果UserApp_Flag為OK,則直接跳轉(zhuǎn)到5)User App;

          4)在IAP中:檢測標(biāo)志,如果UserApp_Flag不為OK,則繼續(xù)IAP歷程,等到更新好User App后,設(shè)置UserApp_Flag為OK,然后跳轉(zhuǎn)到5)User App;

          5)跳轉(zhuǎn)到User App,運(yùn)行系統(tǒng)功能;

          6)在User App中,如果檢測到現(xiàn)在需要更新User App,先設(shè)置UserApp_Flag為!OK,然后跳轉(zhuǎn)到3)IAP中;

          以上6個步驟能夠保證IAP和User App之間的良好關(guān)系,實(shí)現(xiàn)STM32的IAP功能。

          如圖所示:

          5.3 IAP例程

          IAP程序設(shè)計(jì)思路:

          1)IAP程序設(shè)計(jì)放置在Flash的起始地址,當(dāng)用戶選擇從Main Flash memory啟動時,系統(tǒng)進(jìn)入了0x0800 0000地址,也就是進(jìn)入了IAP程序;

          2)在IAP中,判斷UserApp程序是否有效(通過對標(biāo)志地址內(nèi)容的判斷),若有效則直接跳轉(zhuǎn)到UserApp程序地址0x08002000,也就是進(jìn)入了UserApp程序(跳轉(zhuǎn)到4));若UserApp程序標(biāo)志無效,則更新UserApp。

          3)在IAP中,需要更新的UserApp程序數(shù)據(jù)來自于USART,將從USART接收到的數(shù)據(jù)寫入到UserApp程序地址中去,達(dá)到更新UserApp程序的目的;當(dāng)UserApp程序完成更新之后,設(shè)置UserApp程序有效標(biāo)志,然后跳轉(zhuǎn)到UserApp程序地址0x08002000;

          4)在UserApp程序中,可以實(shí)現(xiàn)系統(tǒng)功能;當(dāng)有需要IAP信號產(chǎn)生之后,首先設(shè)置UserApp程序?yàn)闊o效,然后跳轉(zhuǎn)到IAP程序首地址0x0800 0000,程序又進(jìn)入IAP(跳轉(zhuǎn)到2));

          至此,關(guān)于《器知識的相關(guān)應(yīng)用(IAP、Bit Banding)》知識已經(jīng)結(jié)束.



          上一頁 1 2 下一頁

          關(guān)鍵詞: STM32存儲

          評論


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