STM32 CUbeIDE 使用Ymodem協議進行串口IAP升級
- 1、Ymodem協議簡介
- 2、Boodload程式
- 2.1 傳輸32K限制解決
- 3、APP程式
- 4、升級測驗
- 5、工程檔案下載
??學習了一下使用Ymodem協議串口IAP程式升級的功能,移植的是ST的工程檔案,附上下載鏈接https://www.st.com/content/st_com/en/search.html#q=IAP-t=tools-page=1;ST官網提供的各種IAP,其方法和原理其實都類似:就是將程式檔案(二進制檔案)寫入FLASH,

1、Ymodem協議簡介
??Xmodem、Ymodem和Zmodem協議是最常用的三種通信協議,Xmodem協議是最早的,傳輸128位元組資訊塊,Ymodem是Xmodem的改進版協議,具有傳輸快速穩定的優點,它可以一次傳輸1024位元組的資訊塊,同時還支持傳輸多個檔案,以下協議內容的簡介,來源https://blog.csdn.net/lijing198997/article/details/29839505,順便添加了一點自己的見解,

??YModem,資料的發送回使用CRC校驗,保證資料傳輸的正確性,它每傳輸一個資訊塊資料時,就會等待接收端回應ACK信號,接收到回應后,才會繼續傳輸下一個資訊塊,保證資料已經全部接收,
SENDER:發送方,
RECEIVER:接收方,
第一步先由接收方,發送一個字符'C'
發送方收到'C'后,發送第一幀資料包,內容如下:
**SOH 00 FF filename filezise NUL CRCH CRCL**
幀長=3位元組資料首部+128位元組資料+2位元組CRC16校驗碼=133位元組
如下所示:
SOH 00 FF Foo.c NUL[123] CRCH CRCL
第1位元組SOH:表示本包資料區大小有128位元組,如果頭為STX表示本包資料區大小為1024位元組,
第2位元組00: 編號,第一包為00,第二包為01,第三包為02依次累加,到FF后繼續**從0回圈遞增**,這樣就會出現一個BUG,那就是檔案在傳輸大小上有限制,256x128 = 32768 位元組 **32K的限制**,
第3位元組FF: 編號的反碼, 編號為00 對應FF,為01對應FE,以此類推,
第4位元組到最后兩位元組:若第1位元組為SOH時有128位元組,為STX時有1024位元組,這部分為資料區,“Foo.c” 檔案名, 超級終端下,在檔案名后還有檔案大小,官方dome也是因為使用了這個檔案大小進行比對,這就是為什么用SecureCRT中的YMODEM協議而無法正確傳輸的原因,在檔案名和檔案大小之后,如果不滿128位元組,以0補滿,最后兩位元組:這里需要注意,只有資料部分參與了效CRC驗,不包括頭和編碼部分,
CRCH和CRCL分別表示16位CRC校驗碼的高8位與低8位,高位元組在前,低位元組在后,
接收方收到第一幀資料包后,發送ACK正確應答,
然后再發送一個字符'C',
發送方收到'C'后,開始發送第二幀,第二幀中的資料存放的是第一包資料,
接收方收到資料后,發送一個ACK然后等待下一包資料傳送完畢,繼續ACK應答,直到所有資料傳輸完畢,
資料傳輸完畢后,發送方發EOT,第一次接收方以NAK應答,進行二次確認,
發送方收到NAK后,重發EOT,接收方第二次收到結束符,就以ACK應答,
最后接收方再發送一個'C',發送方在沒有第二個檔案要傳輸的情況下,
發送如下資料:
SOH 00 FF 00~00(共128個) CRCH CRCL
接收方應答ACK后,正式結束資料傳輸,
2、Boodload程式
下面所示的部分是移植的檔案,移植完成后的工程檔案截圖:

main.c 檔案修改添加:

/* USER CODE BEGIN Includes */
#include "menu.h"
#include "flash_if.h"
/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
extern pFunction JumpToApplication;
extern uint32_t JumpAddress;
/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
if (1)
{
/* Execute the IAP driver in order to reprogram the Flash */
FLASH_If_Init();
/* Display main menu */
Main_Menu();
}
/* Keep the user application running */
else
{
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) 檢查堆疊頂地址是否合法.
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); //用戶代碼區第二個字為程式開始地址(復位地址)
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //初始化APP堆疊指標(用戶代碼區的第一個字用于存放堆疊頂地址)
JumpToApplication(); //跳轉到APP.
}
}
還要修改flash_if.h 頭檔案里面的地址,

APPLICATION_ADDRESS 是偏移的地址,可以根據自己程式Boodload檔案大小自己設定,USER_FLASH_SIZE 是 APP檔案的大小,
2.1 傳輸32K限制解決
??secureCRT每包只傳輸128個位元組的有效資料,而每個幀的標號由一個位元組表示,所以等到標號到達0xFF之后,下一個幀的標號又變為0,而官方Ymodem程式是判斷幀標號為0則認為是傳輸檔案的第一個幀,即檔案名和檔案大小,所以等到標號由0x00-0xff再到0x00的時候,它認為是一個新的檔案,所以出錯,只要加一個標志標明第一次出現的幀標號為0的幀為第一幀就OK了,
packets_received 宣告為U32型別的資料,判斷的時候修改如下
if (aPacketData[PACKET_NUMBER_INDEX] != (packets_received & 0xff))


3、APP程式
App需要修改內容:
編譯鏈接其實地址

中斷向量修改,

4、升級測驗
軟體使用secureCRT發送檔案,



5、工程檔案下載
我自己使用的工程檔案,有需要自己下載:https://www.lanzoui.com/iWiM9gk0i1a密碼:g8ab
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/35847.html
標籤:其他
上一篇:UBI檔案系統-----UBI檔案系統概念、UBI檔案系統開銷、UBI檔案系統使用方法
下一篇:關于嵌入式軟體分層設計
