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

news2024/10/7 12:19:33

目录标题

  • 前言
  • 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、设置中断向量表的偏移
      • 3.3.4、生成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在线升级流程
STM32 IAP升级程序设计详解-IAR环境

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、设置中断向量表的偏移

当APP工程的main函数中发生中断请求时,硬件仍然会强制PC指针指向BootLoader程序的中断向量表处(这是硬件决定的),然后跳转执行BootLoader程序中的中断服务函数。这就会导致APP程序中的中断服务程序无法执行。
所以我们需要在APP程序的启动文件中设置好中断向量向量表的偏移地址,当在APP程序中产生中断请求时,PC指针会强制指向:原中断向量地址+偏移地址。
打开system_stm32f10x.c文件,可以看到向量表偏移地址默认为0,我们根据上面设置的值,将其改为0x4000.
在这里插入图片描述
这样,app工程就能在中断触发时,去执行自己的中断服务函数了。

注:system_stm32f10x.c文件一般是只读的,我们可以将内容复制到一个自己新建的.c文件中,并用自己新建的.c代替原来只读的.c文件,这样就可以对其进行修改了。

3.3.4、生成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,都是免安装的。
在这里插入图片描述

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

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

相关文章

链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)

目录 一、双向链表的概念 二、 双向链表的优缺点分析​与对比 2.1双向链表特点: 2.2双链表的优劣: 2.3循环链表的优劣 2.4 顺序表和双向链表的优缺点分析​ 三、带头双向循环链表增删改查实现 3.1SList.c 3.2创建一个新节点、头节点 3.3头插 3.…

互联网加竞赛 python+opencv+深度学习实现二维码识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 pythonopencv深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 该项目较为新颖&…

libxls - 编译

文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译 概述 想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在…

C# WPF上位机开发(进度条操作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 软件上面如果一个操作比较缓慢,或者说需要很长的时间,那么这个时候最好添加一个进度条,提示一下当前任务的进展…

Kubernetes - 超简单手动安装 Dashboard WebUI

相关链接 ​​​​​​版本对照:Releases kubernetes/dashboard GitHubKubernetes - 一键卸载 Kubernetes-Dashboard-CSDN博客Kubernetes - Dashboard Token 访问登录永不过期配置-CSDN博客 版本推荐 Kubernetes Dashboard:2.0.3Kubernetes&#xff…

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

DSP芯片行业分析:预计2029年将达到57亿美元

DSP芯片用在工业机器人领域,相当于起着关节的作用,有了DSP的控制,机器人反应更迅速,行动更精准。工业机器人在工作中需要处理大量的数据,随着工业机器人的应用日益广泛和普及,DSP芯片在这方面的应用越来越多…

为什么在Android中需要Context?

介绍 在Android开发中,Context是一个非常重要的概念,但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念,并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…

java21特性学习

jdk21下载地址 JDK21文件 JDK21是javaSE平台最新的长期支持版本。 Java SE Java Archive | Oracle JDK21版本说明 JDK 21 Release Notes, Important Changes, and Information JavaSE 版本字符串格式 Version-String Format JavaSE平台采用了基于时间的发布模型,JDK每六个…

抖店怎么快速起店?不掺杂汤汤水水,全是干货!

我是电商珠珠 我做抖店也已经有三年的时间了,团队也从原来的几人扩大到了70。对于抖店的玩法已经完全摸透熟通,在做店的同时也会带着学生一起做店,他们经常问的问题就是抖店怎么快速起店。 今天,我就来给大家做个分享。根据我的…

适用于 Windows 和 Mac 的 10 款最佳照片恢复软件(免费和付费)

丢失照片很容易。这里点击错误,那里贴错标签的 SD 卡,然后噗的一声,一切都消失了。值得庆幸的是,在技术领域,你可以纠正一些错误。其中包括删除数据或格式化错误的存储设备。 那么,让我们看看可用于从 SD …

提升广东省水泥行业效率的MES解决方案

广东省水泥行业作为我国重要的基础建设材料生产领域之一,提高其生产效率和降低能源消耗具有重要意义。而随着技术的发展,我国的MES系统技术发展,通过引入MES系统成为了实现降本增效目标的必要且有效的手段。MES是一种基于计算机技术的管理工具…

人工智能超分辨率重建:揭秘图像的高清奇迹

导言 人工智能超分辨率重建技术,作为图像处理领域的一项重要创新,旨在通过智能算法提升图像的分辨率,带来更为清晰和细致的视觉体验。本文将深入研究人工智能在超分辨率重建方面的原理、应用以及技术挑战。 1. 超分辨率重建的基本原理 …

Java原来可以这么玩!CV视频合成处理,视频前后拼接,画面合并

前言 本章内容教会你如何用java代码实现 两个视频的画面合并 或者前后拼接。原理是使用了javacv开源jar包,代码经过反复修改,已经实现我能想到的最优最快的实现,如果你有更好更快的实现,欢迎评论区留言!!&…

YXLON高压发生器维修XRG160/160/GA

依科视朗YXLON高压发生器维修型号包括XRG100/110/120/130/160/225/320/450等。 维修包括:仪器高压发生器维修 X射线机高压发生器维修 CT高压发生器维修 安检设备高压发生器维修等。 高压发生器原理: 简单的说就是直流电震荡后升压,比如说1个小功率,利用…

MetaSploit工具的使用

在命令行输入:msfconsole 启动msf msfconsole 另外的方式 msfdb init msfdb run 查看数据库连接状态 db_status 扫描端口并存储 db_nmap 查看扫描到的数据信息 services MSF常用的模式和命令 搜索模块 search 模块名字 使用模块 use 编号 查看模块使用 sho…

目标检测应用场景—数据集【NO.19】车辆目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

✺ch5——纹理贴图

目录 加载纹理图像文件纹理坐标在着色器中使用纹理:采样器变量和纹理单元纹理贴图:示例程序多级渐远纹理贴图各向异性过滤环绕和平铺透视变形材质——更多OpenGL细节补充说明 纹理贴图是在栅格化的模型表面上覆盖图像的技术。 它是为渲染场景添加真实感的…

Python三级 每周练习题31

如果你感觉有收获,欢迎给我微信扫打赏码 ———— 以激励我输出更多优质内容 练习一: 作业1:编写程序,在下面的字典中找出身高137的同学并输出姓名,如果没找到, 输出没有 a{‘小赵’:136,‘小钱’:141,‘小孙’:146,‘小李’:13…

操作系统基础知识

本文用于记录学习W3schools的操作系统教程,该教程的部分内容比较难懂,所以也参考了其他文章。 操作系统基础知识 一、操作系统概括二、操作系统的8个组件1 流程管理2 I/O设备管理3 文件管理4 网络管理5 内存管理6 磁盘管理(辅助存储管理)7 安全管理8 命令…