一.为什么要做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个人主页