你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级

[复制链接]
STMCU 发布时间:2020-9-21 10:16

学习了一下使用Ymodem协议串口IAP程序升级的功能,移植的是ST的工程文件。附上下载链接http://www.st.com/content/st_com/en/search.html#q=IAP-t=tools-page=1;ST官网提供的各种IAP,其方法和原理其实都类似:就是将程序文件(二进制文件)写入FLASH。



1_meitu_1.jpg


1、Ymodem协议简介

  Xmodem、Ymodem和Zmodem协议是最常用的三种通信协议。Xmodem协议是最早的,传输128字节信息块。Ymodem是Xmodem的改进版协议,具有传输快速稳定的优点。它可以一次传输1024字节的信息块,同时还支持传输多个文件。以下协议内容的简介,顺便添加了一点自己的见解。


2_meitu_2.jpg


  YModem,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。


  1. SENDER:发送方。
  2. RECEIVER:接收方。
  3. 第一步先由接收方,发送一个字符'C'
  4. 发送方收到'C'后,发送第一帧数据包,内容如下:
  5. **SOH 00 FF  filename  filezise NUL  CRCH CRCL**
  6. 帧长=3字节数据首部+128字节数据+2字节CRC16校验码=133字节
  7. 如下所示:
  8.      SOH 00 FF Foo.c NUL[123] CRCH CRCL
  9.         第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024字节。
  10.        
  11.         第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续**从0循环递增**。这样就会出现一个BUG,那就是文件在传输大小上有限制,256x128 = 32768 字节 **32K的限制**。
  12.        
  13.         第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。
  14.        
  15.         第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。在文件名和文件大小之后,如果不满128字节,以0补满。最后两字节:这里需要注意,只有数据部分参与了效CRC验,不包括头和编码部分。
  16.        
  17.         CRCH和CRCL分别表示16位CRC校验码的高8位与低8位,高字节在前,低字节在后。
  18.        
  19.         接收方收到第一帧数据包后,发送ACK正确应答。
  20.        
  21.         然后再发送一个字符'C'。
  22.        
  23.         发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。
  24.        
  25.         接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。
  26.        
  27.         数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。
  28.        
  29.         发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。
  30.        
  31.         最后接收方再发送一个'C',发送方在没有第二个文件要传输的情况下,
  32.         发送如下数据:
  33.                SOH 00 FF 00~00(共128个) CRCH CRCL
  34.         接收方应答ACK后,正式结束数据传输。
复制代码

2、Boodload程序

下面所示的部分是移植的文件,移植完成后的工程文件截图:


3_meitu_3.jpg


main.c 文件修改添加:
4_meitu_4.jpg



  1. /* USER CODE BEGIN Includes */
  2. #include "menu.h"
  3. #include "flash_if.h"
  4. /* USER CODE END Includes */
复制代码


5_meitu_5.jpg


  1. /* USER CODE BEGIN 0 */
  2. extern pFunction JumpToApplication;
  3. extern uint32_t JumpAddress;
  4. /* USER CODE END 0 */
复制代码

6_meitu_6.jpg




  1. /* USER CODE BEGIN 2 */
  2.   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
  3.   if (1)
  4.     {
  5.       /* Execute the IAP driver in order to reprogram the Flash */
  6.       FLASH_If_Init();
  7.       /* Display main menu */
  8.       Main_Menu();
  9.     }
  10.     /* Keep the user application running */
  11.     else
  12.     {
  13.       /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
  14.       if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)  检查栈顶地址是否合法.
  15.       {
  16.         /* Jump to user application */
  17.         JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); //用户代码区第二个字为程序开始地址(复位地址)
  18.         JumpToApplication = (pFunction) JumpAddress;
  19.         /* Initialize user application's Stack Pointer */
  20.         __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  21.         JumpToApplication();  //跳转到APP.
  22.       }
  23.     }
复制代码

还要修改flash_if.h 头文件里面的地址。


7_meitu_7.jpg


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))



8_meitu_8.jpg


111.png


3、APP程序

App需要修改内容:


编译链接其实地址


9_meitu_9.jpg

中断向量修改。
10_meitu_10.jpg


4、升级测试

软件使用secureCRT发送文件。

11_meitu_11.jpg


12_meitu_12.jpg



13_meitu_13.jpg





收藏 1 评论1 发布时间:2020-9-21 10:16

举报

1个回答
数码小叶 回答时间:2020-9-23 09:01:59
三个工程只有一个可以打开,而且这个能实现目的么,启动地址居然一模一样
Snipaste_2020-09-23_08-59-42.jpg

Snipaste_2020-09-23_09-00-00.jpg

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版