STM32存儲器知識的相關應用“>STM32存儲器 — STM32存儲器知識的相關應用
2、想操作Peripherals中Bit Band區地址為0x4000 0021字節的第7位
(可能是一個功能寄存器);
計算別名區對應子地址:0x4200 0000+(21*32)+(7*4)=0x4200 02BC
所以,對0x4200 02BC的操作,就是對0x4000 0021字節的第7位進行操作;
對比使用Bit Banding功能和直接訪問Bit Band區域,如圖:

5 STM32的IAP
In Application Programming,在應用編程。
5.1什么是IAP
IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布后可以方便地通過預留的通信口對產品中的固件程序進行更新升級。通常在用戶需要實現IAP功能時,即用戶程序運行中作自身的更新操作,需要在設計固件程序時編寫兩個項目代碼,第一個項目程序不執行正常的功能操作,而只是通過某種通信管道(如USB、USART)接收程序或數據,執行對第二部分代碼的更新;第二個項目代碼才是真正的功能代碼。這兩部分項目代碼都同時燒錄在User Flash中,當芯片上電后,首先是第一個項目代碼開始運行,它作如下操作:
1)檢查是否需要對第二部分代碼進行更新
2)如果不需要更新則轉到4)
3)執行更新操作
4)跳轉到第二部分代碼執行
第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過第一部分IAP代碼更新。
對于STM32來說,因為它的中斷向量表位于程序存儲器的最低地址區,為了使第一部分代碼能夠正確地響應中斷,通常會安排第一部分代碼處于Flash的開始區域,而第二部分代碼緊隨其后。
在第二部分代碼開始執行時,首先需要把CPU的中斷向量表映像到自己的向量表,然后再執行其他的操作。
如果IAP程序被破壞,產品必須通過JTAG或ISP重新燒寫程序,這是很麻煩并且非常耗費時間和金錢的。針對這樣的需求,STM32在對Flash區域實行讀保護的同時,自動地對用戶Flash區的開始4頁設置為寫保護,這樣可以有效地保證IAP程序(第一部分代碼)區域不會被意外地破壞。
如圖為IAP示意圖:

5.2設計自己獨特的IAP
IAP程序可以自己設計,這樣能夠符合自身對在先下載的特殊需求。針對這一要求,本文進行了一個IAP程序的結構設計,并已經通過測試。
帶IAP的系統由兩個工程需要編寫,一個是IAP工程,一個User App工程。
設計將IAP程序放在0x0800 0000——0x0800 2000這段空間中,User App放在0x0800 2000之后的余下空間;
下面描述如何友好的處理著兩個工程之間程序運行的關系,達到IAP這個功能:
1)
2)
3)
4)
5)
6)
以上6個步驟能夠保證IAP和User App之間的良好關系,實現STM32的IAP功能。
如圖所示:

5.3 IAP例程
IAP程序設計思路:
1)IAP程序設計放置在Flash的起始地址,當用戶選擇從Main Flash memory啟動時,系統進入了0x0800 0000地址,也就是進入了IAP程序;
2)在IAP中,判斷UserApp程序是否有效(通過對標志地址內容的判斷),若有效則直接跳轉到UserApp程序地址0x08002000,也就是進入了UserApp程序(跳轉到4));若UserApp程序標志無效,則更新UserApp。
3)在IAP中,需要更新的UserApp程序數據來自于USART,將從USART接收到的數據寫入到UserApp程序地址中去,達到更新UserApp程序的目的;當UserApp程序完成更新之后,設置UserApp程序有效標志,然后跳轉到UserApp程序地址0x08002000;
4)在UserApp程序中,可以實現系統功能;當有需要IAP信號產生之后,首先設置UserApp程序為無效,然后跳轉到IAP程序首地址0x0800 0000,程序又進入IAP(跳轉到2));


評論