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

STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级相关推荐

  1. gcc编译-hal库-stm32f4xx串口IAP升级

    gcc编译-hal库-stm32f4xx串口IAP升级 gcc编译hal库方式实现STM32F4系列芯片IAP升级 1.Bootloader程序: 调用iap_load_app函数即可,输入参数为ap ...

  2. stm32 Bootloader设计(YModem协议)

    相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...

  3. 安装Xshell并使用其进行Ymodem协议的串口传输

    文章目录 引言 介绍 Xshell Ymodem协议 Xshell免费版安装下载 下载 安装Xshell 通过Xshell使用Ymodem传输文件 后续 引言 我们在嵌入式开发中,往往会进行各种各样的 ...

  4. HC32L130基于Xmodem协议实现IAP串口在线升级

    在开始写文章之前,要先吐槽一下国产单片机,不对是国产单片机厂家,他们的技术支持实在太烂了,烂的让你怀疑等技术支持还不如自己啃手册,尤其是那种中间有代理商的厂家,技术支持更是良莠不齐,时效性也不行,问个 ...

  5. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  6. STM32 USB HID IAP升级

    找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...

  7. (实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】

    文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化程序 代码讲解 文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化 ...

  8. STM32 USB IAP升级

    上一篇记录了串口IAP升级,其实不管通过什么介质进行IAP升级,其核心都是不变的,都是通过iap代码和App代码控制相互跳转,iap核心代码是没有区别的. 今天记录一下自己在原子的探索者上实现的通过U ...

  9. iap升级问题 stm32f103r8_STM32在线升级OTA,看这一篇就够啦~

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 本帖最后由 Ber_thaw99 于 2020-12-3 13:33 编辑 " \; [( t3 j4 {&qu ...

最新文章

  1. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries......
  2. java反序列化weblogic_[Todo]Java反序列化-weblogic
  3. 2021常用单细胞数据库整理汇总
  4. Windows如何自定义U盘盘符、文件夹图标、文件夹背景
  5. 君威u0073故障码解决_顽疾修复过程,君威没倒挡的变速箱故障就是这样修好
  6. leetcode236 二叉树的最近公共祖先
  7. 高性能Web服务器Nginx使用指南
  8. SCPPO(二十二):读取配置文件---程序猿必不可少的技能
  9. php编写九九乘法表隔行换色,JavaScript实现99乘法表及隔行变色实例代码
  10. 协议栈处理中的conntrack HASH查找/Bloom过滤/CACHE查找/大包与小包/分层处理风格
  11. 让Oracle跑得更快 ——博文视点大讲堂34期活动圆满结束
  12. 常见的几种网络抓包及协议分析工具
  13. 文件下载,搞懂这9种场景就够了
  14. 花式打印菱形图案!!
  15. HTML和CSS实现京东首页(附GitHub地址)
  16. 浅谈cookie跨域的解决方案——document.domain
  17. break语句和continue语句的区别
  18. python opencv单目测距 小孔成像原理
  19. JavaWeb-狂神系列
  20. SEO学习笔记二:在搜索引擎竞价排名环境下,个人网站将何去何从?

热门文章

  1. 室内设计计算机考试题,12秋计算机班3dsMax室内设计期末考试试题
  2. CASToR安装以及使用
  3. 前端 Leader 如何做好团队规划?阿里内部培训总结公开
  4. CISP-PTE培训主要内容!
  5. 联想e550笔记本怎么样_联想e550测评及价格
  6. 【软件与系统安全笔记】三、基础技术
  7. 常用电子元件基础知识(图解)
  8. const int *p 和 int *const p
  9. Python解析二维码、条形码
  10. Zookeeper客户端ZkClient、Curator的使用,史上最详细的教程来啦~