stm32f103c8t6---ymodem协议串口IAP升级(只教怎么操作,略讲原理,100%成功!)
这次来分享一下IAP串口升级,想必这个是让大家很头疼且又很渴望学会的,这次详细的描述和丝滑的操作,来带大家走一遍这个流程!
本文参考这位大佬的内容:STM32---IAP升级
置顶!!!!
代码放到百度网盘:自取 百度网盘代码链接,提取密码:1111
一.为什么要做IAP升级
1.不易拆卸的设备,可以使用IAP升级,方便用户升级固件
2.YMODEM协议是串口传输协议,传输速率较高,传输文件较大时,传输时间较短
3.不想给别人源代码,但是项目有bug,需要修复,总不能跑几千公里去升级对吧,所以使用IAP升级
总结下来就是实用,所以就做IAP升级
二.既然要做IAP升级,为什么要用YMODEM协议
1 开发板的原因
我用的是STM32F103C8T6,RAM空间只有20kB,Flash空间只有128kB,不能直接串口直接接收完bin文件,如果bin文件稍微大点,那不就GG了要是用的ZET6,那直接定义个55K的串口缓冲接收区,直接接收完bin文件。
三、必备知识储备
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 ok 重点来了 重点来了 重点来了
iap的核心思想就是划分flash空间,看我是如何划分且他们的用途是什么,FLASH总得大小是64K(实际上是128K)大家都这说,我也不知道为什么。
1.3 boot地址(需要修改中断偏移地址)
ROM的地址修改为
START:0x8000000
SIZE:0X2FFF(size应小于于APP的起始地址)
1.4 app地址(这里也需要修改中断偏移地址)
1.5 所以最后1K大小地址的 起始地址是0x0800FC00
四、一般执行流程
STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文 件就从此地址开始写入。此外 STM32 是基于 Cortex-M3 内核的微控制器,其内 部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表” 取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地 址是 0x08000004,当中断来临,STM32 的内部硬件机制亦会自动将 PC 指针定 位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。 在上图中,STM32 在复位后,先从 0X08000004 地址取出复位中断向量的地 址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完 之后,会跳转到我们的 main 函数,如图标号②所示;而我们的 main 函数一般 都是一个死循环,在 main 函数执行过程中,如果收到中断请求(发生重中断), 此时 STM32 强制将 PC 指针指回中断向量表处,如图标号③所示;然后,根据 中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后, 程序再次返回 main 函数执行,如图标号⑤所示。
五、当加入 IAP 程序之后,程序运行流程如下图所示:
在该流程图中,STM32 复位后,还是从 0X08000004 地址取出复位中断向量 的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,如图标号①所示,此部分同前面 STM32 正常流程图一样;在 执行完 IAP 以后(即将新的 APP 代码写入 STM32 的 FLASH,灰底部分。新程 序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向 量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程 序,随后跳转至新程序的 main 函数,如图标号②和③所示,同样 main 函数为 一个死循环,并且注意到此时 STM32 的 FLASH,在不同位置上,共有两个中断 向量表。 在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍强制跳 转到地址 0X08000004 中断向量表处,而不是新程序的中断向量表,如图标号④ 所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回 main 函数继 续运行,如图标号⑥所示。 通过以上两个过程的分析,我们知道 IAP 程序必须满足两个要求: ①新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; ②必须将新程序的中断向量表相应的移动,移动的偏移量为 x; 本章,我们有 2 个 APP 程序,一个为 FLASH 的 APP,程序在 FLASH 中运 行,另外一个位 SRAM 的 APP,程序运行在 SRAM 中,上图虽然是针对 FLASH APP 来说的,但是在 SRAM 里面运行的过程和 FLASH 基本一致,只是需要设置向量 表的地址为 SRAM 的地址
上面字有点多,但是一定得看!
上面字有点多,但是一定得看!
上面字有点多,但是一定得看!
六、APP程序生成bin文件
具体可以参考我的上一篇文章传送门:keil5生成bin文件
总结:ok 经过上面一顿操作,现在就来到实践环节了。
七、IAP升级应用操作步骤(详细步骤)
1.串口配置,项目中用到的是USART1,PA9(TX),PA10(RX)
2.设置参数
八、设置完成后,将boot程序烧录到开发板,这时候上位机会显示如下图
1.输入1,发送 1 给单片机
2.等待接收到"C"后,发送bin文件
3..发送bin文件,单片机接收完成后打印信息
这时候重新按复位,或者掉电 重新上电,程序还是会执行到app这个程序,主要是在boot和app做了升级标志位。这个很关键
主要代码看下图
boot判断是否要进入升级模式的关键
app代码,每次要更新,都先把boot上面那个地址的值修改,这样boot程序就不需要修改了,每次都用同一个,只需要修改app程序即可,因为boot会一直判断
如果全程跟着步骤到这里,恭喜你,你肯定学会了iap并且实践成功了,以上就是本次分享内容,若对你有帮助,那最好不过,共勉!