<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > stm32的IAP學(xué)習

stm32的IAP學(xué)習

作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò ) 收藏
幾乎所有的同類(lèi)書(shū)籍都介紹綜合性的應用示例如“萬(wàn)年歷 + 溫度顯示 + 鬧鐘響鈴 + 計時(shí)表”這樣的一個(gè)實(shí)時(shí)時(shí)鐘范例或“STM32 + 音頻解碼 + 大容量存儲方案”這樣的MP3播放器范例。這些綜合性實(shí)例的目的在于引領(lǐng)讀者進(jìn)行綜合性實(shí)驗,達到把單片機的基礎模塊整合運用的目的。這些實(shí)例普遍存在一種共同點(diǎn),即“練手”意義要大于“實(shí)用”的意義。本文將講述一個(gè)STM32的綜合性應用示例,該示例將涉及到STM32微控制器的時(shí)鐘系統、GPIO、定時(shí)器、中斷系統、異步串口以及內置可編程flash等設備的應用,作為一個(gè)綜合性實(shí)驗的同時(shí)還具有很強的“實(shí)用”意義。這個(gè)示例就是STM32的IAP方案。
IAP,全稱(chēng)是“In-Application
Programming”,中文解釋為“在程序中編程”。IAP是一種對通過(guò)微控制器的對外接口(如USART,IIC,CAN,USB,以太網(wǎng)接口甚至是無(wú)線(xiàn)射頻通道)對正在運行程序的微控制器進(jìn)行內部程序的更新的技術(shù)(注意這完全有別于ICP或者ISP技術(shù))。ICP(In-Circuit Programming)技術(shù)即通過(guò)在線(xiàn)仿真器對單片機進(jìn)行程序燒寫(xiě),而ISP技術(shù)則是通過(guò)單片機內置的bootloader程序引導的燒寫(xiě)技術(shù)。無(wú)論是ICP技術(shù)還是ISP技術(shù),都需要有機械性的操作如連接下載線(xiàn),設置跳線(xiàn)帽等。若產(chǎn)品的電路板已經(jīng)層層密封在外殼中,要對其進(jìn)行程序更新無(wú)疑困難重重,若產(chǎn)品安裝于狹窄空間等難以觸及的地方,更是一場(chǎng)災難。但若進(jìn)引入了IAP技術(shù),則完全可以避免上述尷尬情況,而且若使用遠距離或無(wú)線(xiàn)的數據傳輸方案,甚至可以實(shí)現遠程編程和無(wú)線(xiàn)編程。這絕對是ICP或ISP技術(shù)無(wú)法做到的。某種微控制器支持IAP技術(shù)的首要前提是其必須是基于可重復編程閃存的微控制器。STM32微控制器帶有可編程的內置閃存,同時(shí)STM32擁有在數量上和種類(lèi)上都非常豐富的外設通信接口,因此在STM32上實(shí)現IAP技術(shù)是完全可行的。
實(shí)現IAP技術(shù)的核心是一段預先燒寫(xiě)在單片機內部的IAP程序。這段程序主要負責與外部的上位機軟件進(jìn)行握手同步,然后將通過(guò)外設通信接口將來(lái)自于上位機軟件的程序數據接收后寫(xiě)入單片機內部指定的閃存區域,然后再跳轉執行新寫(xiě)入的程序,最終就達到了程序更新的目的。
在STM32微控制器上實(shí)現IAP程序之前首先要回顧一下STM32的內部閃存組織架構和其啟動(dòng)過(guò)程。STM32的內部閃存地址起始于0x8000000,一般情況下,程序文件就從此地址開(kāi)始寫(xiě)入。此外STM32是基于Cortex-M3內核的微控制器,其內部通過(guò)一張“中斷向量表”來(lái)響應中斷,程序啟動(dòng)后,將首先從“中斷向量表”取出復位中斷向量執行復位中斷程序完成啟動(dòng)。而這張“中斷向量表”的起始地址是0x8000004,當中斷來(lái)臨,STM32的內部硬件機制亦會(huì )自動(dòng)將PC指針定位到“中斷向量表”處,并根據中斷源取出對應的中斷向量執行中斷服務(wù)程序。最后還需要知道關(guān)鍵的一點(diǎn),通過(guò)修改STM32工程的鏈接腳本可以修改程序文件寫(xiě)入閃存的起始地址。
在STM32微控制器上實(shí)現IAP方案,除了常規的串口接收數據以及閃存數據寫(xiě)入等常規操作外,還需注意STM32的啟動(dòng)過(guò)程和中斷響應方式。圖1顯示了STM32常規的運行流程。

(原文件名:1.jpg)
圖1
對圖1解讀如下:
1、 STM32復位后,會(huì )從地址為0x8000004處取出復位中斷向量的地址,并跳轉執行復位中斷服務(wù)程序,如圖1中標號○1所示。
2、 復位中斷服務(wù)程序執行的最終結果是跳轉至C程序的main函數,如圖1中標號○2所示,而main函數應該是一個(gè)死循環(huán),是一個(gè)永不返回的函數。
3、 在main函數執行的過(guò)程中,發(fā)生了一個(gè)中斷請求,此時(shí)STM32的硬件機制會(huì )將PC指針強制指回中斷向量表處,如圖1中標號○3所示。
4、 根據中斷源進(jìn)入相應的中斷服務(wù)程序,如圖1中標號○5所示。
5、 中斷服務(wù)程序執行完畢后,程序再度返回至main函數中執行,如圖1中標號○6所示。
若在STM32中加入了IAP程序,則情況會(huì )如圖2所示。

(原文件名:2.jpg)
圖2
對圖2的解讀如下:
1、 STM32復位后,從地址為0x8000004處取出復位中斷向量的地址,并跳轉執行復位中斷服務(wù)程序,隨后跳轉至IAP程序的main函數,如圖2中標號○1、○2所示。這個(gè)過(guò)程和圖1相應部分是一致的。
2、 執行完IAP過(guò)程后(STM32內部多出了新寫(xiě)入的程序,圖2中以灰色底紋方格表示,地址始于0x8000004+N+M)跳轉至新寫(xiě)入程序的復位向量表,取出新程序的復位中斷向量的地址,并跳轉執行新程序的復位中斷服務(wù)程序,隨后跳轉至新程序的main函數,其過(guò)程如圖2的標號○3所示。新程序的main函數應該也具有永不返回的特性。同時(shí)應該注意在STM32的內部存儲空間在不同的位置上出現了2個(gè)中斷向量表。
3、 在新程序main函數執行的過(guò)程中,一個(gè)中斷請求來(lái)臨,PC指針仍會(huì )回轉至地址為0x8000004中斷向量表處,而并不是新程序的中斷向量表,如圖2中標號○5所示。注意到這是由STM32的硬件機制決定的。
4、 根據中斷源跳轉至對應的中斷服務(wù),如圖2中標號○6所示。注意此時(shí)是跳轉至了新程序的中斷服務(wù)程序中。
5、 中斷服務(wù)執行完畢后,返回main函數。如圖2中標號○8所示。
從上述兩個(gè)過(guò)程的分析可以得知,對將使用IAP過(guò)程寫(xiě)入的程序要滿(mǎn)足2個(gè)要求:
1、新程序必須從IAP程序之后的某個(gè)偏移量為x的地址開(kāi)始;
2、必須將新程序的中斷向量表相應的移動(dòng),移動(dòng)的偏移量為x;
而設置程序起始位置的方法是(keil uvision4集成開(kāi)發(fā)環(huán)境)在工程的“Option for Target….”界面中的“Target”頁(yè)里將“IROM”的“Start”列改為欲使程序起始的地方,如圖3中將程序起始位置設為0x8002000。

(原文件名:3.jpg)
圖3
將中斷向量表移動(dòng)的方法是在程序中加入函數:
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);
其中參數NVIC_VectTab為中斷向量表起始位置,而參數Offset則為地址偏移量,如將中斷向量表移至0x8002000處,則應調用該函數如下:
void NVIC_SetVectorTable(0x8000000, 0x2000);
同時(shí)有必要提醒讀者注意的是,此函數只會(huì )修改STM32程序中用于存儲中斷向量的結構體變量,而不會(huì )實(shí)質(zhì)地改變中斷向量表在閃存中的物理位置,詳情請研究該程序原型。
有了以上準備后就可以著(zhù)手設計一個(gè)IAP方案了,如下:
1、STM32復位后,利用一個(gè)按鍵的狀態(tài)進(jìn)行同步,當按鍵按下時(shí)表示將要進(jìn)行IAP過(guò)程;
2、IAP過(guò)程中,通過(guò)上位機軟件向STM32的USART1設備發(fā)送所要更新的程序文件,STM32接收到數據后轉而從0x8002000地址開(kāi)始寫(xiě)入收到的數據;
3、STM32借助定時(shí)器來(lái)判斷數據是否完全接收,完全接收后IAP過(guò)程結束;
4、再次復位后,跳轉0x8002004地址開(kāi)始運行新寫(xiě)入的程序;
最后提出幾點(diǎn)注意事項:
1、具體實(shí)現的工程見(jiàn)附件;
2、利用IAP寫(xiě)入的程序文件最好是.bin格式的文件,但不能是.hex格式的文件;
3、向STM32發(fā)送程序文件時(shí)盡量慢一些,因為STM32對FLASH的寫(xiě)入速度往往跟不上通訊外設接口的速度;
4、建議在STM32和上位機之間設計一套握手機制和出錯管理機制,這樣可以大幅提高IAP的成功率;
5、附件中的IAP工程具體運行現象為,按著(zhù)連接于GPIOA.0引腳上的按鍵后對STM32進(jìn)行復位操作,若連接于GPIOA.4引腳上的LED被點(diǎn)亮則表示進(jìn)入了IAP程序,等待從USART1接口傳入欲更新的程序文件。程序文件更新完畢后,LED被熄滅。此時(shí)再度對STM32進(jìn)行復位,就開(kāi)始運行新寫(xiě)入的程序了。


關(guān)鍵詞: stm32IA

評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>