| 1.寫在前面 IAP全稱是In Application Programming,IAP是用戶自己的程序在運(yùn)行過程中對User Flash的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的固件程序進(jìn)行更新升級。 2.系統(tǒng)BootLoader 對于STM32來說,芯片出廠時(shí)已經(jīng)預(yù)置了一段Bootloader,但是啟動(dòng)Bootloader需要設(shè)置單片機(jī)的BOOT引腳:BOOT1=0,BOOT0=1,并復(fù)位后才能進(jìn)入系統(tǒng)Bootloader。BOOT引腳的設(shè)置可通過硬件來實(shí)現(xiàn)自動(dòng)設(shè)置和復(fù)位,從而利用系統(tǒng)Bootloader實(shí)現(xiàn)IAP。電路圖如下: 電路比較簡單就不詳細(xì)分析了。程序升級需要配合專用的軟件MCUISP。升級時(shí)MCUISP軟件會控制DTR引腳和RTS引腳將BOOT0引腳拉高,并實(shí)現(xiàn)單片機(jī)復(fù)位,從而進(jìn)入系統(tǒng)Bootloader。之后可以通過USB轉(zhuǎn)串口對程序進(jìn)行升級。 3.自己編寫BootLoader 系統(tǒng)Bootloader只能通過特定的接口對程序進(jìn)行升級,且會增加額外的硬件設(shè)計(jì),有時(shí)候并不適用。這時(shí)候就需要自己編寫B(tài)ootloader程序實(shí)現(xiàn)IAP。 實(shí)現(xiàn)IAP需要兩個(gè)程序:Bootloader程序和應(yīng)用程序。系統(tǒng)啟動(dòng)后首先進(jìn)入Bootloader程序,判斷是否需要升級,如果不需要直接跳轉(zhuǎn)到應(yīng)用程序運(yùn)行;如果需要?jiǎng)t通過指定的接口和協(xié)議接收數(shù)據(jù)并寫入到Flash中,實(shí)現(xiàn)應(yīng)用升級。這種方式靈活很多,接口和協(xié)議都可以自定義,實(shí)現(xiàn)的關(guān)鍵是協(xié)議的設(shè)計(jì)和對Flash進(jìn)行讀寫。這里以STM32F1系列單片機(jī)為例,采用串口1和通用的Ymodem協(xié)議進(jìn)行介紹。 YModem協(xié)議 YModem協(xié)議是一個(gè)非常高效的文件傳輸協(xié)議,每包數(shù)據(jù)可以達(dá)到1024字節(jié)。YModem協(xié)議傳輸?shù)耐暾奈帐诌^程如下。這里就不進(jìn)行詳細(xì)介紹了,用戶也可以采用自定義的協(xié)議,協(xié)議設(shè)計(jì)要主要發(fā)送、反饋和校驗(yàn),保證傳輸數(shù)據(jù)的正確性。 Bootloader程序 STM32Cube庫文件中提供了相關(guān)的例程,可以進(jìn)行參考: STM32Cube_FW_F1_V1.8.0\Projects\STM3210C_EVAL\Applications\IAP\IAP_Main 可以看到,程序初始化后通過檢測按鍵來判斷是否需要升級應(yīng)用程序。 很多時(shí)候,用戶的硬件上可能沒有按鍵,則需要通過其它辦法來實(shí)現(xiàn)判斷。比如,需要升級時(shí),應(yīng)用程序在Flash某個(gè)位置寫入一個(gè)標(biāo)志,然后復(fù)位進(jìn)入BootLoader程序,BootLoader程序讀取該標(biāo)志來自動(dòng)判斷是否需要升級應(yīng)用程序。 應(yīng)用程序 由于BootLoader程序的存在,應(yīng)用程序在Flash中的存儲位置也發(fā)生了改變,需要對程序中的中斷向量表偏移地址進(jìn)行修改。首先在Bootloader程序中確定應(yīng)用程序的起始地址: 在應(yīng)用程序工程中修改程序編譯的地址: 在應(yīng)用程序中system_stm32f10x.c文件,找到: 修改為: 該地址為偏移地址,不是絕對地址,與上面的地址有區(qū)別。 最后,MDK默認(rèn)只生成HEX文件,要生成bin文件需要添加一條指令。在User選項(xiàng)卡中,勾選 'Run # 1',在后面輸入框?qū)懭隻in文件生成方式: $K\ARM\ARMCC\bin\fromelf.exe --bin --output=Bin\@L.bin !L 上位機(jī) 上位機(jī)采用SecureCRT,該軟件支持YModem協(xié)議。打開軟件后,連接串口,使電路板進(jìn)入Bootloader程序,根據(jù)菜單進(jìn)行操作即可。 采用其它方式和協(xié)議進(jìn)行IAP升級的方法將在以后的文章中繼續(xù)介紹。 | 
|  |