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

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 评论4 发布时间:2020-9-21 10:16

举报

4个回答
wyxy163@126.com 回答时间:2020-9-23 09:01:59
提示: 作者被禁止或删除 内容自动屏蔽
常春藤 回答时间:2023-9-23 09:17:41

官方版本库太旧,移植时候出现大量写保护的相关的寄存器找不到定义

rasingsun 回答时间:2024-2-1 17:59:32

这教程对F0系列App部分有点不适用

我调通了

稍后发个教程

赞宇 回答时间:2024-4-7 10:50:23

不考虑接收方接收异常的情况么

所属标签

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