基於STM32F103單片機的IAP實現(雖然該篇文章不會詳細寫出實現細節,但是會從一個全局的角度講述,實際的實現細節只需根據datasheet即可完成)。
一、基礎概念
什么是IAP?IAP即在應用中編程(In-Application Programming IAP),簡單的說就像是一個用戶自定義的升級程序。實際上,STM32單片機的程序燒寫有多種方法,可以用JTAG,也可用串口通過ISP軟件燒寫新程序。
JTAG的方式需要專用的燒寫工具,在產品布置到現場后,更新產品程序比較麻煩,而通過串口的ISP軟件升級方法可以直接使用常見的串口線升級程序,十分方便,這種方法用的是ISP。ISP可以說是單片機默認的bootloader,
正常情況下,單片機系統啟動后,會直接從用戶程序執行,而升級程序時,單片機會進入bootloader,在ISP中一直運行。ISP雖然方便了升級,但是還是沒法解決用戶自定義和遠程升級的問題。對於用戶來說,有時候可能需要在單片機
flash不同地址燒寫多個應用程序,用於根據不同條件啟動不同應用程序;有時候,產品分布到全國各地,去所有現場升級程序明顯不理智,解決方法是將升級程序放到服務器上,發送遠程升級指令,設備進入IAP升級程序,從遠程
獲取升級應用程序,實現在線升級。
二、IAP實現
1.硬件
STM32單片機的啟動方式有三種,
單片機根據boot0和boot1的引腳來確定啟動方式。主閃存存儲器即為用戶程序空間,IAP啟動將會從這里開始,系統存儲器是ISP啟動,內置SRAM不討論。正常情況下,boot0管腳接入低電平,單片機從應用程序開始執行;當使用ISP升級時,boot0為1,boot1為0,系統進入ISP程序,等待串口升級,升級完成后,需要斷電,改變boot電平,重新啟動,讓單片機從應用程序執行。(所以ISP升級時,還需要關注有關boot腳的電平開關問題。)
IAP升級不需要改變任何管腳電平,因為它實際上就是一個應用程序,只是讓單片機啟動時先執行它,執行完后,跳轉到真正的應用程序執行。
注意:單片機第一次燒寫時,是需要通過JTAG或ISP燒寫IAP的,如果打算用ISP,那最好留一個boot腳的硬件撥碼開關用於首次ISP升級hex文件。
2.軟件
弄清楚硬件之后,就知道什么樣的硬件boot對應什么樣的啟動方式。加入IAP之后,系統啟動時會先執行IAP程序用於判斷是否達到升級條件和執行什么樣的升級配置,相應的邏輯類似於下圖:
用戶可以根據自己的需求來設計IAP程序,詳細設計可以參考ST官方資料:
《使用STM32F10xxx的USART 實現在應用中編程》,而且官方也給出了例程,資料比較全面,實現起來也很簡單。
最后,提醒注意一點的是,在IAP后面的應用程序都要在系統啟動時重新定義中斷向量表。