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

news2024/11/15 13:38:21

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PLC】三菱FX3U下载程序通讯中断问题解决方法之一

博主最近买了一个三菱PLC FX3U,然后随意在GX Works中编写了一段带有子程序的程序,后来发现刷写程序过程中,会突然出现通讯中断的情况,然后切断PLC电源,变更COM口,重启PLC后,通讯才可以连接上&am…

鸿蒙OpenHarmony Native API【drawing_pen.h】 头文件

drawing_pen.h Overview Related Modules: [Drawing] Description: 文件中定义了与画笔相关的功能函数 Since: 8 Version: 1.0 Summary Enumerations Enumeration NameDescription[OH_Drawing_PenLineCapStyle] { [LINE_FLAT_CAP], [LINE_SQUARE_CAP], [LINE_ROUND_…

PMP考试难度大吗?

由于目前的PMP考试主要以新大纲为主,许多内容都已经发生了变化,因此学习新内容以适应这些变化仍然是非常必要的。 一、新版考试题量和答题时间有何变化? 题量由200道减少到180道,因此答题时间相对更充裕。 二、新版考试的整体难…

洛谷 P1035 [NOIP2002 普及组] 级数求和 题解

思路1&#xff08;68分&#xff0c;测3&#xff0c;测5TLE&#xff09; &#xff1a; #include<bits/stdc.h> using namespace std; int a[100005]; int main() {int k,i;cin >> k;for(i1;;i){double sum0;//要在这里初始化for(int j1;j<i;j){double s1*1.0/j;…

php接口返回的json字符串,json_decode()失败,原来是多了红点

问题&#xff1a; 调用某个接口返回的json&#xff0c;json_decode()失败&#xff0c;返回数据为null&#xff0c; echo json_last_error();返回错误码 4 经过多次调试发现&#xff1a;多出来一个红点&#xff0c;预览是看不到的。 解决&#xff1a;要去除BOM头部 $resul…

Pytorch transforms 的研究

绝对路径与相对路径差别 transforms的使用 from torchvision import transforms from PIL import Imageimg_path "dataset/train/bees/16838648_415acd9e3f.jpg" img Image.open(img_path) tensor_trans transforms.ToTensor() tensor_img tensor_trans(img) prin…

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…

防爆智能手机如何助力电气行业保驾护航?

在电气行业的智能化转型浪潮中&#xff0c;防爆智能手机以其强大的数据处理能力、实时通讯功能及高度集成的安全特性&#xff0c;正成为保障电力网络稳定运行、预防安全隐患的得力助手。 防爆智能手机在电气行业中发挥着重要的保驾护航作用&#xff0c;主要体现在以下几个方面&…

【性能测试-登录时密码加密存储如何传参】

目的】 登录接口&#xff0c;密码加密传输&#xff0c;开发不做处理的情况下&#xff0c;密码如何加密传输 【方案】 使用前置处理器&#xff1a;JSR223 预处理程序&#xff0c;主要是在执行登录接口前将密码按照加密算法获得对应的加密密码&#xff0c;并传入接口 【说明】前…

天工Godwork AT 5.2.6 GodWork2D 2.1.5 GodWork EOS 2.1实景三维建模软件

天工Godwork AT 5.2.6/GodWork2D 2.1.5/GodWork EOS 2.1实景三维建模软件 获取安装包联系邮箱:2895356150qq.com 本介绍用于学习使用&#xff0c;如有侵权请您联系删除&#xff01; 1.自主研发的平差技术&#xff0c;平差模块不依赖PATB、Bingo等国外技术 2.采用特征匹配&…

系统架构师考点--设计模式

大家好。今天来总结一下设计模式的相关考点。这部分考点也有可能在论文中出现&#xff0c;这里总结的可能不够全面&#xff0c;大家自己可以翻一下教材好好了解一下。 架构模式&#xff1a;软件设计中的高层决策&#xff0c;例如C/S结构就属于架构模式&#xff0c;架构模式反…

【第5章】Spring Cloud之Nacos服务注册和服务发现

文章目录 前言一、提供者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 二、消费者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 三、服务列表四、服务发现1. 获取服务列表2. 测试2.1 获取所有服务2.2 根据服务名获取服务信息 五、更多配置项总结 前言 本节通过…

mysql对数据库的增删改

目录 DML语句&#xff1a; 增加数据&#xff08;insert语句&#xff09; 增加数据&#xff08;insert into select&#xff09; 修改数据&#xff08;update语句&#xff09; 【where 子句条件】 删除数据&#xff08;delete语句&#xff09; 删除数据&#xff08;trunca…

内网隧道——Earthworm(EW)

文章目录 一、EW介绍二、一层网络2.1 一层正向代理2.2 一层反向代理 三、两层网络3.1 二层正向代理3.2 二层反向代理 一、EW介绍 下载地址&#xff1a;EW 常用的命令格式&#xff1a; 参数作用Ssocksd正向代理Rcsock反向代理客户端Rssocks反向代理服务端Lcx_slave一侧通过反弹…

基于SpringBoot的矩形范围面时空分析-以震中附近历史地震为例

目录 前言 1、分析的必要性 2、分析的紧迫性 一、数据库物理模型及空间分析实现 1、数据库物理模型 2、空间数据库中的空间查询分析 二、Java后台程序开发 1、模型层设计 2、业务层的设计与实现 三、WebGIS功能设计与实现 1、同时展示4幅地图 2、初始化地图 3、展示…

算法日记day 18(二叉树的所有路径|左叶子之和)

一、二叉树的所有路径 题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->…

福州高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着制造业的转型升级&#xff0c;智能制造已成为行业发展的重要趋势。福州高校大学智能制造实验室作为该领域的重要研究基地&#xff0c;积极响应国家发展战略&#xff0c;不断探索和创新智能制造技术。数字孪生技术作为智能制造领域的前沿技术&#xff0c;通过将物理世界的实…

基于ansible进行运维自动化的研究以及相关的属性

一、ansible-简介 介绍 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c; 实现了批量系统配置、批量程序部署、批量运行命令等功能。 无客户端。 …

基于区块链技术的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…

【数据结构】链表(单链表实现 + 详解 + 原码)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…