關注、星標公衆號,不錯過精彩內容
作者:strongerHuang
對於軟件工程師來說,代碼升級(或程序更新)算是必備基礎知識。
下面將介紹關於編程的基礎知識,以及結合STM32官方提供的Demo講述一下關於編程的內容。
一、關於ISP、ICP、IAP
1.ISP
ISP:In System Programing,在系統編程。
比如:使用STC-ISP對STC芯片編程,利用Flash loader對STM32編程等。
支持ISP的芯片一般在芯片內部固化了一段(用ISP升級的)boot程序。
2.ICP
In Circuit Programing,在電路編程。
ICSP:In-Circuit Serial Programming,在電路串行編程。如:對EEPROM編程等。
ICP編程方式網上各有說法,從字面含義(在電路)來說,所有處於編程的芯片都需要上電,都處於電路中。不嚴格來說利用J-Link、ST-Link、e-Link32等工具進行編程也屬於在電路編程(ICP)。
在維基百科中,在系統編程(ISP),也稱爲在電路串行編程(ICSP)。
3.IAP
In applicating Programing,在應用編程。
這裏是本文說的重點,可以簡單理解爲:在程序運行的過程中進行編程(升級程序,更新固件)。
IAP是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是爲了在產品發佈後可以方便地通過預留的通信口對產品中的固件程序進行更新升級。[來自百度百科]
IAP通信口
IAP的通信口有許多種:UART串口、ETH以太網、I2C、SPI......等。按理說只要能傳輸數據的通信口都能實現IAP的功能。
本文結合STM32官網提供的例程,利用UART在應用編程(IAP)。
二、關於Ymodem協議
YModem是一種文件傳輸的協議,由XModem協議演變而來的,每包數據可以達到1024字節,是一個非常高效的文件傳輸協議。
更多介紹可參考百度百科:
https://baike.baidu.com/item/Ymodem
協議傳輸流程:
其中幾個字符的ASCII碼
字符 | ASCII碼16進制 |
---|---|
SOH | 0x01 |
STX | 0x02 |
ACK | 0x06 |
NAK | 0x15 |
EOT | 0x04 |
C | 0x43 |
1.起始幀
SOH + 00 + FF + filename + filesize + NULL + CRCH + CRCL
起始幀是文件傳輸發送端發的第一條重要消息.
filename表示傳輸文件的文件名.
filesize表示需要傳輸文件的大小.
CRCH + CRCL 表示整條幀(去掉前三個字節)的CRC16校驗.
2.數據幀格式
STX/SOH + [編號] + 編號的反碼 + data[0] + data[1] + data[2] + … + CRCH + CRCL
SOH 表示有128個字節, 有的也只用SOH傳輸數據.
STX 表示有1024個字節.
CRCH + CRCL 表示整條幀(去掉前三個字節)的CRC16校驗.
如果傳輸最後一條字節不足128個字節, 則用1A填充
3.結束幀的數據格式
SOH + 00 + FF + NULL + NULL + … + NULL + CRCH + CRCL
以上部分內容授權轉自:
https://blog.csdn.net/weixin_41294615/article/details/104652105
三、ST官網IAP例程
ST官網提供的IAP例程有很多很多,比如:
庫:有使用標準外設庫(SPL)的、有使用硬件抽象層庫(HAL)的;
通信口:有使用USART的,有使用I2C的,有使用ETH的等。
MCU型號:STM8S、STM32F1、F4、L1等幾乎全系列都有。
ST官網提供的各種IAP,其方法和原理其實都類似:就是將程序文件(二進制文件)寫入FLASH。
本文以最簡單的基於(STM32F10x)利用SPL庫+UART的IAP爲例來給大家講述一下。(複雜都是從基礎開始,後續逐步爲大家更新更高級的IAP功能)
STM32F10xxx in-application programming using the USART官方地址:
https://www.stmicroelectronics.com.cn/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32008.html
(提示:公衆號不支持外部鏈接,請複製鏈接到瀏覽器下載)
相關參考文檔和代碼例程都在這個網址下載,下一章節針對這裏該IAP講述幾點重要內容。
我下載後上傳至百度網盤地址:
https://pan.baidu.com/s/1umdwlShsJpL8rLdeb9n6Cw
密碼:2t3j
(提示:該鏈接後期可能會失效,建議到官網下載)
四、IAP例程幾個要點
1.例程概要說明
該代碼工程基於STM32F1,使用UART通信口,利用超級終端(上位機)、通過YModem協議實現代碼程序的數據傳輸和寫入Flash。
2.IAP軟件工程
我們解壓(上面)下載好的軟件工程包,進入目錄,通過MDK-ARM(爲例),如下圖;
本文以MDK-ARM爲例,你也可以通過EWARM、TrueSTUDIO等工具打開。
因該工程代碼是之前用MDK-ARM V4版本建立的,現在用V5版本打開會提示如下信息:
只需要點擊“Migrate to Device Pack”即可,V5版本使用了“設備支持包”,這裏大概意思就是使用設備支持包兼容以前老版本工程。
選擇對應的目標(我們以F103ZE爲例,選擇大容量、小容量在於他們的FLASH頁大小不一樣),選擇10E-EVAL,如下圖:
直接編譯,沒有錯誤警告,此時,如果有對應的板卡,可直接下載。
提示:
1.前提:MDK下載、安裝
2.什麼是目標? 簡述工作空間、工程、目標
3.說明
這個程序只是IAP程序,放在以0x0800 0000爲起始的地址。而IAP程序的作用是將應用程序(二進制文件)下載到應用程序對應的地址。
因此,我們會將FLASH劃分我兩個區域:IAP程序區域,APP程序區域。
這裏IAP程序有兩個作用:1.對APP程序編程;2.引導程序跳轉至應用程序。所以,這段APP程序也叫BootLoader。
爲防止IAP程序不被(第一部分代碼)不被意外破壞,一般建議對IAP程序進行“寫保護”。
這個APP地址0x0800 3000是怎樣來的呢?
見IAP程序代碼:
所以,我們APP應用程序的其起始地址就必須對應爲0x0800 3000 纔行。不然,跳轉之後沒有應用程序,則會出錯。
提示:
它這裏是通過按鍵方式選擇執行IAP,還是執行APP;一般建議通過倒計時(比如5s):5s之內通過串口選擇下載,否則自動跳轉到APP程序執行。這裏就需要自己根據情況修改代碼。
Demo里程可以通過選擇3跳轉到APP程序,初學者可以直接不使用按鍵判斷,進行測試,如下圖,修改一下:
五、APP代碼和地址問題
上一章節是講述的IAP程序,本節講APP程序修改地址的問題。
1.添加代碼
在代碼開始設置向量表偏移:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);
0x3000代表偏移量
2.修改配置
project -> Options
3.生成Bin
具體可以參看我另外一篇文章:
4.APP程序代碼
爲方便大家學習,我提供在按照上面修改過的APP代碼工程給大家下載,地址和上面一樣:
https://pan.baidu.com/s/1umdwlShsJpL8rLdeb9n6Cw
密碼:2t3j
六、超級終端安裝,程序下載
1.超級終端下載、安裝
官方提供的文檔是HyperTerminal超級終端下載程序,這個可以百度谷歌搜索下載安裝。我這後面一直使用SecureCRT這款終端,這終端屬於商業軟件,但在網上可以找到很多po解的辦法。
爲方便大家調試,我這裏提供下載鏈接
https://pan.baidu.com/s/13yjA9q0Eltfer4oLPbGceQ
密碼:5r5m
(提示:該鏈接後期可能會失效,建議到官網下載)
2.程序下載
硬件連接好,將生成的程序文件(Demo.bin)放在指定位置(爲方便測試下載,我拷貝到桌面)-> 打開終端 -> 鍵盤按1 ->選擇文件 ->下載完成 -> 鍵盤按3 執行程序。
以上內容就是關於STM32 + IAP + Ymodem的基礎知識和例程說明,希望對你有幫助。
推薦閱讀:
關注微信公衆號『strongerHuang』,後臺回覆“1024”查看更多內容,回覆“加羣”按規則加入技術交流羣。
長按前往圖中包含的公衆號關注