STM32F103C8T6基于YMODEM协议的串口IAP升级实践

一.为什么要做IAP升级

1.不易拆卸的设备,可以使用IAP升级,方便用户升级固件
2.YMODEM协议是串口传输协议,传输速率较高,传输文件较大时,传输时间较短
3.不想给别人源代码,但是项目有bug,需要修复,总不能跑几千公里去升级对吧,所以使用IAP升级

总结下来就是实用,所以就做IAP升级

如果觉得这篇文章对您有所帮助,请点赞关注,您的支持是我坚持的动力

墨小羽ovo个人主页

二.既然要做IAP升级,为什么要用YMODEM协议

1 开发板的原因

我用的是STM32F103C8T6,RAM空间只有20kB,Flash空间只有128kB,不能直接串口直接接收完bin文件,如果bin文件稍微大点,那不就GG了要是用的ZET6,那直接定义个55K的串口缓冲接收区,直接接收完bin文件,那不就美滋滋了,但是ZET6太贵了,所以只能用STM32F103C8T6了

总结下来就几个字,穷,用不起zet6,所以只能用STM32F103C8T6了

2.搜网上的资料的原因

第一种方法 直接串口分包接收,然后写入Flash

1 直接串口接收1kB数据,然后写入Flash,这种方法呢确实可以实现,但是有个缺点,就是万一接收错误了,万一丢包了,那不是GG了

2.我看网上大佬都是手搓的代码,搓了一个上位机,写了一个串口环形队列分包接收bin文件(使用环形队列接收串口数据非常稳定,不会丢包),接收一包bin文件,校验正确,发送ACK应答信息给上位机
,校验错误,发送NAK应答信息给上位机,上位机收到NAK应答信息,重新发送。

这个呢,可以实现,没问题,问题是我菜啊
,我写不出来,我也搓不出来上位机代码,我还急着用。

第二种方法 使用YMODEM协议

YMODEM协议呢,就是分包接收,但是接收完一包数据,会校验,如果校验错误,会要求重新发送,所以这种方法就避免了丢包的问题,所以推荐使用YMODEM协议

3.差点当怨种的原因

1.别人主动加我推销IAP

自己水平不够,写不出来,后来qq群求助,发现有个大佬用YMODEM协议实现IAP升级,再加上有吊毛自己主动加我推销他的IAP,还是F4的,问我要600,WTM的,问他看我是怨种吗,直接删除拉黑。后来就自己搜YMODEM协议
YMODEM协议详解

资料链接

本项目用到的资料已经全部放到QQ群,需要的可以自行下载
在这里插入图片描述在这里插入图片描述

三、必备知识储备

1.1 Code RO-data RW-data ZI-data

Code:代码区,存放程序代码,只读,程序运行时不能修改

RO-data:只读数据区,存放程序中需要用到的常量,只读,程序运行时不能修改

RW-data:可读写数据区,存放程序中需要用到的变量,可读写,程序运行时可以修改

ZI-data:零初始化数据区,存放程序中需要用到的变量,可读写,程序运行时可以修改,但是初始化为0,程序运行时可以修改,但是初始化为0
FLASH = Code + RO-data + RW-data
RAM = RW-data + ZI-data
在这里插入图片描述

1.2 IAP ICP ISP 区别

可以参考这篇文章
ICP ISP IAP 区别

1、ISP(‌In-System Programming,‌在系统编程)‌ 是一种通过芯片内置的bootloader进行程序更新的方式。‌用户无法修改。就是向通过FLYMCU对STM32下载程序的方式

2、ICP(‌In-Circuit Programming,‌在电路编程)‌ 是一种无需占用程序空间的编程方法,‌由硬件实现。
想STLINK,DAP那种下载方式的
3、IAP(‌In-Application Programming,‌在应用中编程)‌ 提供了最大的灵活性和自定义空间,‌适用于需要用户自定义烧录格式、‌烧录方式和升级流程的场景

1.3 一般程序的执行流程

在这里插入图片描述

执行流程:

1.STM32F1 的内部闪存(FLASH)地址起始于 0X0800 0000

2.STM32F103 在复位后,先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;

3.在复位中断服务程序执行完之后,会跳转到我们的 main 函数,如图标号②所示;而我们的 main 函数一般都是一个死循环,在 main 函数执行

3.过程中,如果收到中断请求(发生了中断),此时 STM32F103 强制将 PC 指针指回中断向量表处,如图标号③所示;

4…然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行
完中断服务程序以后,程序再次返回 main 函数执行,如图标号⑤所示。

1.4 IAP程序的执行流程

在这里插入图片描述

执行流程:
在这里插入图片描述

也可以参考下这篇文章

STM32启动流程

四、实现过程(YMODEM协议)(详细实现的步骤)

1.IAP升级过程

在这里插入图片描述

升级过程

1.准备好应用程序bin文件

2.ICP方式烧录Bootloader到STM32F103C8T6

3.上位机发送bin文件给单片机

4.APP应用程序跳转软复位(这里还没做,这里就简单了,接收特定指令就跳转呗)

5.在这里插入图片描述

2.BOOTLoader程序配置和实现

2.1 ST官网下载IAP升级例程

使用USART进行STM32F10xxx应用内编程(AN2557)

2.2 修改IAP程序

1.首先这个项目用的开发板是STM32F100ZE的,我们需要切换成STM32F103C8T6的

2.启动文件换成STM32F103C8T6的startup_stm32f10x_md.s

在这里插入图片描述

3.define 宏定义声明

在这里插入图片描述

改成

USE_STM32100E_EVAL, STM32F10X_MD, USE_STDPERIPH_DRIVER

4.修改程序

首先配置完后,编译一下
在这里插入图片描述

发现flash占用的大小约为7k多,但是后面可能要加程序,所以可能会大点,就估计为12k左右,0x3000.

APP的起始地址就为0x8003000
在这里插入图片描述

在这里插入图片描述

ROM的地址修改为
START:0x8000000
SIZE:0X2FFF
(size应小于于APP的起始地址)

在这里插入图片描述

5.配置下载器

除了Debug那里要配置,utilities也要配置,不然下载不了
在这里插入图片描述

6. 修改APP程序

这里仅用LED闪烁作为测试,所以APP程序就很简单了,就是LED闪烁
在这里插入图片描述

6.1 修改ROM的起始地址和SIZE大小

在这里插入图片描述

为啥是0x1D000
因为flsah大小是128k,0x1D000 = 0x20000 - 0x8000

6.2.修改向量表偏移地址

打开system_stm32f10x.c文件,向量表偏移地址默认为0,修改为0x3000
在这里插入图片描述

五、APP程序生成bin文件

具体可以参考我的上一篇文章
Keil5深度探索:高效生成hex、bin与lib文件全攻略

六、IAP升级应用操作步骤(详细步骤)

1.串口配置,项目中用到的是USART1,PA9(TX),PA10(RX)

2.设置参数

在这里插入图片描述

3. 设置完后,下载bootloader到单片机

在这里插入图片描述

4.输入1,发送 1 给单片机

在这里插入图片描述

5.等待接收到"C"后,发送bin文件

在这里插入图片描述

6.发送bin文件,单片机接收完成后打印信息

在这里插入图片描述

在这里插入图片描述

7.输入3,跳出Bootloader,进入APP区

在这里插入图片描述

8. 跳转成功,LED灯闪烁

在这里插入图片描述

七、参考资料

stm32 Bootloader设计(YModem协议)
STM32_通过Ymodem协议进行蓝牙OTA升级固件教程

七、总结

本博客介绍了基于STM32F103C8T6使用YMODEM协议实现串口IAP升级的实践。鉴于资源限制和传输可靠性需求,YMODEM协议成为理想选择。我们学习了IAP、ISP、ICP的区别。通过实践,我们成功在STM32F103C8T6上实现了固件升级功能,提升了项目的便捷性和稳定性。本次实践不仅加深了对嵌入式固件升级的理解,也为后续项目提供了宝贵经验。最后呢,在编写博客的过程中,我尽量保持内容的准确性和完整性,但也难免会有疏漏或错误之处。欢迎各位读者指出其中的问题,帮助我不断进步。谢谢大家的阅读,希望这篇博客能够帮助到大家。点点关注,不迷路哦!
墨小羽ovo个人主页

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在STM32F103C8T6上实现XModem在线升级,你可以按照以下步骤进行: 1. 首先,了解XModem协议的基本原理。XModem是一种通信传输协议,用于在串口上进行文件传输。每个数据包的大小为128字节,通信过程中需要进行校验和确认,以确保数据的正确传输。 2. 在你的程序中实现XModem协议。你可以参考XModem协议的具体代码实现,根据你的需求进行相应的修改。根据引用,你可以在之前实现的YModem协议的基础上进行修改,这样你对XModem协议的原理就会有更深入的理解。 3. 在STM32F103C8T6的固件中添加XModem协议的支持。你需要在固件中添加相应的功能和接口,以便与串口进行通信,并实现XModem协议的数据传输。 4. 在你的应用程序中调用XModem协议的函数,以实现在线升级。你可以使用串口与外部设备进行通信,并通过XModem协议传输固件文件。 需要注意的是,实现XModem协议可能需要一定的编程和硬件知识,因此建议你在进行之前对相关知识进行学习和了解。你可以参考引用和引用中的链接,以获取更多关于XModem协议的详细信息和代码示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32F103代码远程升级(四)基于Xmodem协议串口升级程序的实现](https://blog.csdn.net/gin_love/article/details/82020423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨小羽ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值