STM32F103/429串口IAP+Ymodem升级

发布者:MysticMoon最新更新时间:2025-02-17 来源: cnblogs关键字:STM32F103  串口  IAP 手机看文章 扫描二维码
随时随地手机看文章

起因:


串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转。但是这种方法在实际项目中并不实用,因为没用文件校验,不能保证bin文件的完整性,如果贸然跳转,将会是设备陷入到永远无法正常工作的状态,除非返厂,重新烧写程序;

因为项目需要,但是又不想自己写上位机(偷懒),因此就是用成熟软件自带Ymodem协议进行数据传输。

回到顶部

Ymodem协议简介:

 参考:https://blog.csdn.net/qingzhuyuxian/article/details/80769163

Xmodem、Ymodem和Zmodem协议是最常用的三种通信协议

  1. Xmodem协议是最早的,传输128字节信息块。

  2. Ymodem是Xmodem的改进版协议,具有传输快速稳定的优点。它可以一次传输1024字节的信息块,同时还支持传输多个文件。

  3. 平常所说的Ymodem协议是指的Ymodem-1K,除此还有Ymodem-g(没有CRC校验,不常用)。

  4. YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回

起始帧的数据格式

1.起始帧的数据格式

YModem的起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=33字节。它的数据结构如下:

SOH 00 FF  filename  filezise NUL  CRCH CRCL

其中SOH=0x01,表示这个数据帧中包含着128个字节的数据(STX表示1024字节,初始帧只有128个),00表示数据帧序号,初始是0,依次向下排,FF是帧序号的取反,filename是要传输的文件名,如USTB_V3_1.0.1.26_NMEA.Bin,它在数据帧中的格式为:55 53 54 42 5F 56 33 5F 31 2E 30 2E 31 2E 32 36 5F 4E 4D 45 41 2E 42 69 6E 00,也就是把ASCII码转成十六进制,但是最后一定要在文件名后加上00,表示文件名的结束;filesize表示文件的大小,如上面的USTB_V3_1.0.1.26_NMEA.Bin大小是132KB,也就是135168Byte,转换成十六进制就是0x21000,它在数据帧中的格式就是32 31 30 30 30 00,也就是ASCII的“21000”,同样最后要加上00表示结束,NUL就是数据部分的128字节中除去文件名和文件大小占据的剩下的字节都用00填充,CRCH和CRCL分别表示16位CRC校验码的高8位与低8位。

2.数据帧的数据格式

YModem的数据帧中会预留1024字节空间用来传输文件数据,它跟起始帧接收差不多,如下:

       STX 01 FEdata[1024] CRCH CRCL

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;01是表示帧序号,FE是它的取反,再下一帧数据就是02 FD,以此类推;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A填充,如下结构:

STX 01 FE data[1024] 1A 1A……… CRCH CRCL

有一种特殊的情况:如果文件大小小于等于128字节或者文件数据最后剩余的数据小于128字节,则YModem会选择SOH数据帧用128字节来传输数据,如果数据不满128字节,剩余的数据用0x1A填充这是数据帧的结构就变成了:

文件大小小于128字节:               SOH 01 FE data[ ] 1A ...1A CRCH CRCL  

文件最后剩余数据小于128字节:  SOH 01 FE data[ ] 1A...1A CRCH CRCL

3.结束帧数据结构

YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

SOH 00 FF NUL[128] CRCH CRCL

结束帧同样以SOH开头,表示后面跟着128字节大小的数据;结束帧的帧序也认为是00 FF;结束帧的128字节的数据部分不存放任何信息,即NUL[128]全部用00填充。

4.文件传输过程

文件的传输过程,以具体的例子说明。把foo.c,大小为4196Byte(16进制为0x1064)的文件作为传输的对象,则它的传输过程如下:

 发送端                                                                                         接收端

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        C

SOH 00 FF 'foo.c' '1064'' NUL[118] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        C

STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>  

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

SOH 05 FA data[100]  1A[28] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        NAK

EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        C

SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        ACK

 

YModem的传输过程就是上面所示。但是上面传输过程中存在许多通信信号,它们的数值与意义如下表所示:

还是有几点需要说明:

  1. EOT信号由发送端发送

  2. CA中止传输信号也有发送端发送

  3. C的含义在英文的数据手册上的意思有点难以理解,我个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!

5.CRC的计算

YModem的采用的是CRC16-CCITT欧洲版本的CRC校验,它的生成多项式为:x16+x12+x5+1,具体的CRC的计算算法见我的《CRC16校验的C代码实现》一文。


环境:

单片机:正点原子STM32F103ZET6开发板、正点原子STM32F429IGT6开发板

工具:STM32CubeMX 5.1;  Pack:stm32cube_fw_f4_v1240、STM32Cube_FW_F1_V1.7.0; SecureCRT 8.5.3

IDE:Keil_MDK 5.26.2

项目搭建(F429):

使用cubemax 配置 CRC、USART2、LED1;

BootLoader的IAP文件移植:

在STM32Cube_FW_F4_V1.24.0ProjectsSTM324x9I_EVALApplicationsIAPIAP_MainSrc目录中,将ymodem.c、menu.c、flash_if.c、common.c 及相关头文件一直到项目中。


修改main.c文件

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

      JumpToApplication();

    }

  }

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {


    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }


更改项目中的所有串口句柄:


UART_HandleTypeDef huart2;

更改bin文件下载地址:在flash_if.h中将下载地址改为:0x08010000 


#define APPLICATION_ADDRESS   (uint32_t)0x08010000 


APP文件修改

1、更改下载地址和文件大小,APP的起始地址 = BootLoader起始地址 + BootLoader的文件大小

2、更改中断向量偏移地址(system_stm32f4xx.c),中断向量偏移地址 = APP的起始地址

回到顶部

实验验证:

开机界面如下图所示:

输入数字1(界面不会回显数字),提示下载程序,如果长时间未下载,则会打印‘C’,这是因为Ymodem协议,在等待接收数据;

 

将文件以Ymodem协议发送成功后,会显示文件名、文件大小等提示信息,并且重新进入到Main Menu 菜单界面

输入数字 3 后,提示程序开始运行

 

总结

app的运行地址 = BootLoader运行地址 + BootLoader大小;

BootLoader跳转时,需关闭所有外设;

程序软复位函数:HAL_NVIC_SystemReset(),实现程序的复位;

 

stm32f103源码链接:https://download.csdn.net/download/fanrwx/11092371

stm32f429源码链接:https://download.csdn.net/download/fanrwx/11092205


关键字:STM32F103  串口  IAP 引用地址:STM32F103/429串口IAP+Ymodem升级

上一篇:STM32CubeMX学习笔记(18)——DAC接口使用(输出电压)
下一篇:STM32407+LAN8720A+LWIP 实现TCP Client

推荐阅读最新更新时间:2026-03-20 18:41

第30章 STM32F429的系统bootloader之串口IAP固件升级
30.1 初学者重要提示 学习本章节前,务必优先学习第28章。 本章用到的相关软件和文档下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573 。 本章节的串口IAP下载软件使用STM32CubeProg,此软件实现了之前的DfuSe,STLINK小软件和Flashloader三合一,并且支持外部EEPROM,NOR Flash,SPI Flash,NAND Flash等烧写,也支持OTA编程。 使用系统bootloader做串口IAP升级时,MicroUSB接口不要接线到电脑端,因为这会导致系统bootloader工作在USB DFU模式,无法再使用串口I
[单片机]
第30章 STM32F<font color='red'>429</font>的系统bootloader之<font color='red'>串口</font><font color='red'>IAP</font>固件<font color='red'>升级</font>
STM32F103代码远程升级(二)基于串口IAP的简单实现
一、确定需要解决的问题 这里我就记录一下我的学习过程。 首先确定几个问题: 实现IAP编程需要着手编写两个程序,一个是Bootloader程序,一个是APP应用程序。 需要对STM32的Flash进行擦除和写入操作。 需要根据APP应用程序开始地址设置中断向量表的偏移 需要改变代码存放的地址空间(因为BootLoader要存放在0x08000000处,用户程序要存放在0x08005000处,而默认的代码存放的地址空间为0x08000000)。 在下载完更新文件之后需要进行PC指针的强制跳转,跳转时需要做什么 串口接收的用户代码数据是什么样的代码数据,是一种什么样的文件,该如何得到该格式文件 然后我开始一个一个解决问题。 二
[单片机]
<font color='red'>STM32F103</font>代码远程<font color='red'>升级</font>(二)基于<font color='red'>串口</font><font color='red'>IAP</font>的简单实现
STM32F103实现IAP在线升级应用程序
一、环境介绍 MCU: STM32F103ZET6 编程IDE: Keil5.25 工程附加源码包下载地址: CSDN https://download.csdn.net/download/xiaolong1126626497/25652410 二、 IAP介绍 IAP,全称是“In-Application Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的更新的技术(注意这完全有别于ICP或者ISP技术)。 ICP(In-Circuit Programming)技
[单片机]
<font color='red'>STM32F103</font>实现<font color='red'>IAP</font>在线<font color='red'>升级</font>应用程序
STM32F103VET6利用片内FLASH虚拟U盘,使用文件复制方式实现IAP
在原子论坛偶尔搜到一篇 利用STM32片内FLASH虚拟U盘,使用文件复制方式实现IAP的帖子http://www.openedv.com/forum.php?mod=viewthread&tid=39012&extra=page%3D1 按照楼主提供的代码修改了一下发现不能用,仔细阅读相关zizi资料(《5 分钟用 STM32的内置 Flash 做一个超小 U 盘》)发现了我用的是STM32F103VET6属于大容量的,片内FLASH是2K一页,所以要修改相关代码,贴出来修改的相关代码 一.修改memory.c 文件 修改Data_Buffer数组为2K,BULK_MAX_PACKET_SIZE宏定义为64,所以BULK
[单片机]
<font color='red'>STM32F103</font>VET6利用片内FLASH虚拟U盘,使用文件复制方式实现<font color='red'>IAP</font>
STM32F103C8T6在线升级 IAP
stm32程序每次执行都会从基地址0x800 0000开始执行。IAP程序升级的执行是在bootloader引导文件执行后,进行加载、跳转APP程序。所以每次上电后进入BootLoader判断是否需要升级,如果升级则接受bin文件,如果不升级则直接跳转app程序。 BootLoader和app程序的FLASH大小需要根据自己的程序情况自由的分配大小就可以了。 代码:根据正点原子的例程进行修改的 1、由于BootLoader引导程序比较小,我设置的flash大小为0x1800 2、iap函数:由于STM32F103C8T6程序存储容量是64KB,每页的大小为1K字节即1024,所以iapbuf数组设置为512。
[单片机]
<font color='red'>STM32F103</font>C8T6在线<font color='red'>升级</font> <font color='red'>IAP</font>
串口进行STM32F0的IAP移植手记(包括RAM&ROM地址设置)
1 前言 STSW-STM32116是ST官网基于标准库的针对STM32F0的USART进口IAP示例程序,下载链接:http://www.stmcu.org/document/detail/index/id-213120 工程原本是针对STM32F051,本文将介绍如何移植到STM32F070,并针对移植的过程中的问题逐个处理。 2 KEIL下移植 IAP程序一般分为两个,一个是IAP,一个是APP,IAP存放在内置FLASH的0x8000000的起始位置,而APP则存放在离这个位置一定距离的位置,这个距离一定是大于或等于IAP本身所占空间大小,本例子为0x8003000。 下载资源后,打开STM32F0xx_AN4065_F
[单片机]
45.串口IAP基本原理
学习这个教程前首先需要了解Flash的编程原理。 一。stm32 IAP介绍 1. stm32的编程方式 2. stm32的启动模式选择 BOOT1置0,BOOT0置1,程序从系统存储器中执行启动程序BootLoader代码,也就是从串口中下载程序到主存储器中。 BOOT0置0,BOOT1不管是置0还是置1,主闪存存储器被选为启动区域,即执行写入的应用程序。 3. IAP下载程序流程 注:自己写的BootLoader程序与系统的BootLoader程序是不同的。需要先通过ICP下载到BootLoader存储区域中。然后跳转到应用程序执行。 4.一般程序的执行流程 0x08000000中存放栈顶
[单片机]
45.<font color='red'>串口</font><font color='red'>IAP</font>基本原理
STM32串口IAP
让STM32的应用程序能够通过串口在线升级,这就是STM32的串口IAP。要实现串口升级,简单来说,就是给STM32编写一个bootloader引导程序,就想计算机的BIOS一样,在这段代码中接收串口的数据,然后将数据固化到STM32内部指定的flash地址空间中,接着再跑到这段代码执行。 接触过Linux uboot的应该会注意到,除了功能的实现外,bootloader的界面设计也非常重要。通过串口在计算机的串口软件中实现一个简洁的界面,列出bootloader的各项功能,并支持用户选择。实现这样一个人际交互的界面也是一个优秀的bootloader必不可少的一部分。 本文就要讲讲如何设计这个有功能有界面的bootloader程
[单片机]
STM32<font color='red'>串口</font><font color='red'>IAP</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved