当前位置: 首页 > news >正文

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并且实践成功了,以上就是本次分享内容,若对你有帮助,那最好不过,共勉!

http://www.dtcms.com/a/265869.html

相关文章:

  • laravel基础:隐式模型绑定的用法和介绍
  • 【AI】大语言模型(LLM) NLP
  • STM32-第二节-GPIO输入(按键,传感器)
  • [科普]UART、RS232、RS422、RS485、TTL:深入解析串行通信家族
  • uniapp 使用ffmpeg播放rtsp
  • 网络基础(1)
  • 铁血联盟3 中文 免安 离线运行版
  • 基于路径质量的AI负载均衡异常路径检测与恢复策略
  • HAL库(Hardware Abstraction Layer,硬件抽象层)核心理解
  • 遇到该问题:kex_exchange_identification: read: Connection reset`的解决办法
  • VBA初学3----实战(VBA实现Excel转csv)
  • 《2025年攻防演练必修漏洞清单》
  • C++11 shared_ptr 原理与详细教程
  • uniapp打包微信小程序主包过大问题_uniapp 微信小程序时主包太大和vendor.js过大
  • C++ 实现简单二叉树操作:插入节点与数据打印
  • 【playwright篇】教程(十七)[html元素知识]
  • 【NLP入门系列四】评论文本分类入门案例
  • 设计模式-观察者模式、命令模式
  • Java连接阿里云MaxCompute例
  • Qt宝藏库:20+实用开源项目合集
  • NV133NV137美光固态闪存NV147NV148
  • Git协作开发:feature分支、拉取最新并合并
  • 这才叫窗口查询!TDEngine官方文档没讲透的实战玩法
  • ModbusRTU转Profinet网关在工业自动化中的应用与价值
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DragNDrop(拖拽占用组件)
  • 力扣 hot100 Day33
  • 快速搭建大模型web对话环境指南(open-webUI)
  • 双向链表的实现
  • [创业之路-468]:企业经营层 - 使用“市场-需求-竞争”三维模型筛选细分市场(市场维度、客户需求维度、竞争维度)
  • JavaEE-Linux环境部署