STM32_通过Ymodem协议进行蓝牙OTA升级固件教程

目录标题

  • 前言
  • 1、OTA升级的重要性和应用场景
  • 2、理论基础
    • 2.1、单片机的启动流程
    • 2.2、什么是IAP?
    • 2.3、什么是OTA?
    • 2.4、什么是BootLoader?
    • 2.5、Ymodem协议是什么?
    • 2.6、IAP是如何实现的?
  • 3、具体操作
    • 3.1、软硬件工具准备
    • 3.2、下载ST官方IAP升级的BootLoader工程
      • 3.2.1、下载示例工程
      • 3.2.2、修改配置信息
      • 3.2.3、下载观看现象
    • 3.3、修改APP工程
      • 3.3.1、打开APP工程
      • 3.3.2、修改APP工程启动地址
      • 3.3.3、生成bin文件
    • 3.4、串口IAP
      • 3.4.1、超级终端软件使用
      • 3.4.2、串口传输bin文件
    • 3.5、蓝牙IAP
  • 附录
    • 1、hypertrm下载

前言

作为单片机进阶能力,IAP升级固件的学习是非常重要的。
想直接看如何操作的从第三条开始看。

1、OTA升级的重要性和应用场景

蓝牙OTA(Over-The-Air)升级是指通过蓝牙无线技术,对设备中的固件或软件进行远程升级和更新的过程。蓝牙OTA升级在现代物联网和智能设备领域有着重要的应用和意义。

重要性:

  • 便捷性和灵活性: 蓝牙OTA升级可以通过无线传输方式,避免了传统有线连接的束缚,用户可以随时随地进行设备升级,无需专门的连接线和设备。
  • 用户体验优化: 设备制造商可以随时通过OTA升级向设备部署新功能、修复bug或增强安全性,从而提升用户体验。
  • 降低维护成本: 通过OTA升级,设备制造商可以避免召回设备或用户手动升级的成本,大大降低了维护的成本和提高了维护效率。降低维护成本: 通过OTA升级,设备制造商可以避免召回设备或用户手动升级的成本,大大降低了维护的成本和提高了维护效率。
  • 安全性和稳定性: 通过OTA升级,设备可以及时获取最新的固件和安全补丁,提高了设备的安全性和稳定性,减少了潜在的安全漏洞。

应用场景:

  • 智能家居设备: 智能灯具、智能插座、智能音箱等设备可以通过OTA升级获取新功能和改善体验。
  • 工业物联网设备: 工业自动化设备、传感器节点等需要定期更新固件来适应生产环境变化和修复漏洞。
  • 可穿戴设备: 智能手表、健康监测设备等需要定期在不影响用户使用的情况下更新软件和驱动。
  • 智能交通: 智能汽车、无人机等需要通过OTA升级来更新地图、调整性能和增强安全性。

2、理论基础

2.1、单片机的启动流程

链接: STM32_启动流程详解

2.2、什么是IAP?

IAP,全称是“In-Application-Programming”,中文解释为“在程序中编程”。
IAP是一种对通过微控制器的对外接口如:USART,IIC,CAN,USB,以太网接口甚至是无线射频通道等对正在运行程序的微控制器进行内部程序的更新的技术。
与IAP同级的其它两种下载方式是ISP和ICP。
ICP:使用SWD接口进行烧录,如J-Link烧录器和J-Flash软件配合使用。
ISP:使用引导程序(Bootload)加上外围UART/USB等接口进行烧录。

2.3、什么是OTA?

OTA:Over-The-Air,即通过无线通信网络进行固件或件的升级和更新的技术手段。通过OTA,用户可以通过无线网络直接下载和安装最新的软件版本,而无需连接到电脑或使用数据线进行更新[数据来源:CSDN-C知道模型训练的大型语言模型]。对单片机而言,简单的说就是我们无需使用各种下载器进行程序下载,借助无线的方式,我们可以实现远程升级MCU的固件。

2.4、什么是BootLoader?

BootLoader就是一段单片机的引导加载程序,单片机出厂时就已经写好了,用户是无法访问更改的,但是我们可以在用户代码区域再自己写一个BootLoader程序用于更新固件。
“Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行”。

2.5、Ymodem协议是什么?

关于Ymodem协议具体是怎么实现的,我们这里暂时不做过多了解。只需要知道我们这里IAP传输bin文件使用的是Ymodem协议就可以了。在超级终端、SecureCRT等软件中都是支持这个协议的。
如果想深入了解,看可以去看下面这几个文章:
分享我的项目必需品:IAP+YMODEM+CRC16+AES256+PC端软件+hex合并
stm32 Bootloader设计(YModem协议)
YModem协议简介
Ymodem协议-接收

2.6、IAP是如何实现的?

实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序,也就是BOOTLOAD(引导加载程序),我们不再像以往那样,对MCU进行整片数据的擦除,而是分为BootloadAPP两个部分(内存容量大的可以再划分备份区等,鉴于STM32F103C8T6的资源空间,暂时划分这两个区)。BootLoader程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。

这个教程写的很好,可以看这个:
【IAP】IAP在线升级流程

3、具体操作

3.1、软硬件工具准备

硬件:两个HC-05蓝牙透传模块、STM32单片机、USB-TTL串口模块、PWLINK(下载器,STLINK、JLINK等均可)
软件keil5 MDKhypertrm(超级终端)(支持Ymodem协议传输的终端仿真软件)

注:1、终端软件除了hypertrm,还可以用SecureCRTteraterm等。
2、hypertrm(超级终端)软件下载安装可看下面的附录1

3.2、下载ST官方IAP升级的BootLoader工程

3.2.1、下载示例工程

点这个链接进入ST官网下载:使用USART进行STM32F10xxx应用内编程(AN2557)
第一次下载会让你填写你的邮箱,之后就会收到下载链接,下载后解压就可以了。
解压后的文件目录是这样的。
在这里插入图片描述

3.2.2、修改配置信息

依次打开“Project”->“IAP”->“MDK-ARM”,打开此工程。
会弹出下面的对话框,我们点击“Migrate to Device Pack”。
在这里插入图片描述
进入工程后,我们先编译。
因为我使用的单片机是STM32F103C8T6,所以需要点击魔法棒修改一些配置信息。
在这里插入图片描述
因为STM32F103C8T6的内存是中等容量大小,我们还需要在下面阴影处的“xxxHD_VL”内容更换为“xxxMD”:
在这里插入图片描述
然后就是根据自己使用的下载器类型修改
在这里插入图片描述
在这里插入图片描述
将工程使用的IROM1的内存调小一些:
在这里插入图片描述
在之后,进入common.h修改ApplicationAddress(应用程序启动起始地址)为0x0800 4000
在这里插入图片描述

3.2.3、下载观看现象

然后就是,编译下载到板子上。

随便打开一个串口助手,将波特率设置为115200,按下方表格连线。

单片机(以STM32F103C8T6为例)USB-TTL模块
5V5V
GNDGND
PA9(USART1_TX)RXD
PA10(USART1_RX)TXD

就可以看到串口1打印的调试信息了。
在这里插入图片描述
这样BootLoader的程序就下载好了,等我们有了APP工程,就可以利用超级终端远程烧录固件了。

3.3、修改APP工程

APP区就是我们用户自己自定义的具体功能区,起始地址从Bootload之后,利用bootload将跳转到APP区。

3.3.1、打开APP工程

打开一个自己需要更新到板子上的工程即可。但是要注意工程不要超出STM32 APP的存储区大小:

3.3.2、修改APP工程启动地址

在这里插入图片描述
这里的值需要与上面第3.3.2步BootLoader工程中修改的ApplicationAddress的值一致。

3.3.3、生成bin文件

我们在做远程更新时,所发送过去的文件类型为bin,所以我们需要输出一个bin文件。
按下面的操作即可,复制到框中的内容为:

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L

在这里插入图片描述
然后再编译工程,我们在工程目录下就能看到一个bin文件了。
在这里插入图片描述

3.4、串口IAP

3.4.1、超级终端软件使用

还是上面那样,利用USB-TTL模块连接到单片机的串口1。

双击打开下载的hypertrm.exe(超级终端)。
在这里插入图片描述
随便输入一个名称点击确定。
在这里插入图片描述
如果线连对了,并且电脑有相应的驱动,它会自动检测到相应的COM口,点击确定即可。
在这里插入图片描述
之后我们配置波特率为115200(BootLoader工程中配置的串口波特率为115200),数据流控制我们选无。点击确定。
在这里插入图片描述

3.4.2、串口传输bin文件

之后我们点击单片机的复位,可以看到打印的信息。
在这里插入图片描述
在电脑上,输入“1”,单片机会不断打印“C”,这是在等待bin文件传输。
在这里插入图片描述
我们按下面的流程利用Ymodem协议传输发送bin文件。
在这里插入图片描述
我们可以看到进度条,
在这里插入图片描述
待传输完成后,单片机的串口一会打印接收到的文件名称和大小信息。并且重新等待用户操作,输入1:更新固件。输入3:跳出BootLoader,进入APP区。
在这里插入图片描述
我们输入3,就可以看到我们APP工程开始运行了。

3.5、蓝牙IAP

其实使用两个蓝牙和上面的使用串口基本一样,因为蓝牙在这里只是取代了杜邦线的作用。
我们可以看下面这个文章将两个HC-05蓝牙模块分别配置为主从模式,波特率115200。
可以看下面的文章进行蓝牙匹配。
两个蓝牙模块HC-05的主从机匹配

当两个蓝牙匹配成功,都上电后,两个蓝牙很快就会从灯频闪变为慢闪。这时就连接成功了。

此时按上面3.4的步骤走就可以。

附录

1、hypertrm下载

使用下面的链接下载即可: hypertrm网盘下载链接
下载压缩版后解压会有下面三个版本的hypertrm,都是免安装的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类加载机制

1.类加载的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为…

计算机中msvcr120.dll丢失怎样修复,这5个方法可以搞定

几乎在所有操作系统中,可分为两种库,一种是静态库(.lib),另一种是动态库(.dll)。 为什么很多小伙伴在打开软件的时候会弹出“由于找不到XXX.dll文件,无法继续执行代码、、、、、、”…

大数据技术之 Kettle(PDI)

Kettle 第一章 Kettle概述1.1、ETL简介1.2、Kettle简介1.3、作业 和 转换 概念1.4、核心组件1.5、下载安装 第二章 控件使用2.1、初体验:csv 转换 excel 示例2.2、转换2.2.1、输入控件2.2.1.1、表输入 2.2.2、输出控件2.2.2.1、表输出2.2.2.2、更新&插入/更新2.…

分享66个Java源码总有一个是你想要的

分享66个Java源码总有一个是你想要的 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1hKlZJB3KrHcOuKWyV1xjKw?pwd6666 提取码:6666 项目名称 ava web个人网站项目 ea…

【C++11特性篇】C++11中の【override】【final】关键字——帮助用户检测是否重写

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.【override】【final】关键字——帮…

软件测试之鲁棒性测试

文章目录 前言一、鲁棒性测试是什么?二、鲁棒性测试的目的三、测试原理3.1 错误数据处理3.2 异常情况处理 前言 Bootloader软件刷写鲁棒性(Robustness)测试是指对Bootloader软件进行连续多次的刷写测试,且一次Fail都没发生,以此验证Bootload…

基于java+swing+mysq学生成绩管理系统(含课程报告)

基于javaswingmysq学生成绩管理系统_含课程报告 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统? 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统使用 Swing MySQL IntelliJ IDEA 开发。为管理人员提供…

【精选】计算机网络教程(第3章数据链路层)

目录 前言 第3章数据链路层 1、差错检测(CRC) 2、点对点协议(了解应用场景) 3、什么是碰撞域,什么是广播域 碰撞域(Collision Domain): 广播域(Broadcast Domain&a…

Linux驱动开发学习笔记4《设备树下的LED驱动实验》

目录 一、设备树LED驱动原理 二、硬件原理图分析 三、实验程序编写 1.修改设备树文件 2.LED 灯驱动程序编写 3.编写测试APP 四、运行测试 1. 编译驱动程序和测试APP (1) 编译驱动程序 (2) 编译测试APP ​ 2.运行测试 一、…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数(1)substring 截取字符串(2)replace 替换(3)regexp_replace 正则替换(4)regexp 正则匹配(5&#xff…

open3d.core导入失败问题

官网的例子中需要导入o3c但是我的代码提示导入失败,百度一下没有找到问题所在 多次测试后发现。 可以不用import open3d.core as o3c 使用的时候直接 o3d.core.tensor就可以了 import open3d as o3d #import open3d. as o3c import numpy as np import matplotl…

Java之Clonable接口和深浅拷贝

Clonable接口 我们船舰了一个人的对象,想要克隆一个一模一样的对象,可以用到object类里面的克隆方法 object不是所有类的父类吗?那为什么用person1点不出这个方法呢?可以看一下源码 这是Object类里面的clone方法的声明&#xff0…

flask简单应用-1

目标: 做一个搜索网页,搜索当前路径下是否含有指定关键字的文件,如果有就列出来,没有返回消息 第一步:我们需要先显示一个搜索页面,页面上需要有一个可以输入的对话框,一个按钮执行搜索 建立ht…

软件测试找了两个月了,简历投了10万多次,找不到工作怎么办?

是行情不好吗?我觉得不是,为什么别人可以找到,而你找了两个月还找不到。 只能说明一个原因,你学的东西和企业需要有些差距。 现在,软件测试已经不是过去那样只会点点点就可以找到一个合适的工作。 首先因为大环境原…

使用 Timm 库替换 RT-DETR 主干网络 | 1000+ 主干融合RT-DETR

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

Java入门学习笔记一

一、Java语言环境搭建 1、JAVA语言的跨平台原理 1.1、什么是跨平台性? 跨平台就是说,同一个软件可以在不同的操作系统(例如:Windows、Linux、mad)上执行,而不需要对软件做任务处理。即通过Java语言编写的…

【C语言】操作符详解(三)

目录 逗号表达式 下标访问[ ],函数调用( ) 下标引用操作符[ ] 函数调用操作符() 逗号表达式 exp1,exp2,exp3,...expN 逗号表达式,就是用逗号隔开的多个表达式…

C语言第四十六弹---最快方法找到杨氏矩阵中的数下标

C语言实现最快方法找到杨氏矩阵中数下标。 定义:杨氏矩阵是一种用于描述Young 表和表示论的工具,它在代数几何和组合数学中有广泛的应用。一个杨氏矩阵是一个以若干个正整数构成的矩形表格,且每行和每列的元素单调递增。 从定义中可获得条件…

管理类联考——英语二——考点+记忆篇——小作文——按行应战

题目要求100字 Dear Mr/Ms.XX, 空两格 I am writing this letter in order to express my sincere gratitude感谢/congratulation祝贺/introduction介绍/invitation邀请/application申请/opinion观点/comfort安慰/complaint抱怨/apology道歉 about sth to you for sth(doing s…

C# DotNetCore AOP简单实现

背景 实际开发中业务和日志尽量不要相互干扰嵌套,否则很难维护和调试。 示例 using System.Reflection;namespace CSharpLearn {internal class Program{static void Main(){int age 25;string name "bingling";Person person new(age, name);Conso…