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