作为单片机进阶能力,IAP升级固件的学习是非常重要的。
想直接看如何操作的从第三条开始看。
蓝牙OTA(Over-The-Air)升级是指通过蓝牙无线技术,对设备中的固件或软件进行远程升级和更新的过程。蓝牙OTA升级在现代物联网和智能设备领域有着重要的应用和意义。
重要性:
应用场景:
链接: STM32_启动流程详解
IAP,全称是“In-Application-Programming”,中文解释为“在程序中编程”。
IAP是一种对通过微控制器的对外接口如:USART,IIC,CAN,USB,以太网接口甚至是无线射频通道等对正在运行程序的微控制器进行内部程序的更新的技术。
与IAP同级的其它两种下载方式是ISP和ICP。
ICP:使用SWD接口进行烧录,如J-Link烧录器和J-Flash软件配合使用。
ISP:使用引导程序(Bootload)加上外围UART/USB等接口进行烧录。
OTA:Over-The-Air,即通过无线通信网络进行固件或件的升级和更新的技术手段。通过OTA,用户可以通过无线网络直接下载和安装最新的软件版本,而无需连接到电脑或使用数据线进行更新[数据来源:CSDN-C知道模型训练的大型语言模型]。对单片机而言,简单的说就是我们无需使用各种下载器进行程序下载,借助无线的方式,我们可以实现远程升级MCU的固件。
BootLoader就是一段单片机的引导加载程序,单片机出厂时就已经写好了,用户是无法访问更改的,但是我们可以在用户代码区域再自己写一个BootLoader程序用于更新固件。
“Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行”。
关于Ymodem协议具体是怎么实现的,我们这里暂时不做过多了解。只需要知道我们这里IAP传输bin文件使用的是Ymodem协议就可以了。在超级终端、SecureCRT等软件中都是支持这个协议的。
如果想深入了解,看可以去看下面这几个文章:
分享我的项目必需品:IAP+YMODEM+CRC16+AES256+PC端软件+hex合并
stm32 Bootloader设计(YModem协议)
YModem协议简介
Ymodem协议-接收
实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序,也就是BOOTLOAD(引导加载程序),我们不再像以往那样,对MCU进行整片数据的擦除,而是分为Bootload和APP两个部分(内存容量大的可以再划分备份区等,鉴于STM32F103C8T6的资源空间,暂时划分这两个区)。BootLoader程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。
这个教程写的很好,可以看这个:
【IAP】IAP在线升级流程
硬件:两个HC-05蓝牙透传模块、STM32单片机、USB-TTL串口模块、PWLINK(下载器,STLINK、JLINK等均可)
软件:keil5 MDK 、hypertrm(超级终端)(支持Ymodem协议传输的终端仿真软件)
注:1、终端软件除了hypertrm,还可以用SecureCRT、teraterm等。
2、hypertrm(超级终端)软件下载安装可看下面的附录1。
点这个链接进入ST官网下载:使用USART进行STM32F10xxx应用内编程(AN2557)
第一次下载会让你填写你的邮箱,之后就会收到下载链接,下载后解压就可以了。
解压后的文件目录是这样的。
依次打开“Project”->“IAP”->“MDK-ARM”,打开此工程。
会弹出下面的对话框,我们点击“Migrate to Device Pack”。
进入工程后,我们先编译。
因为我使用的单片机是STM32F103C8T6,所以需要点击魔法棒修改一些配置信息。
因为STM32F103C8T6的内存是中等容量大小,我们还需要在下面阴影处的“xxxHD_VL”内容更换为“xxxMD”:
然后就是根据自己使用的下载器类型修改
将工程使用的IROM1的内存调小一些:
在之后,进入common.h修改ApplicationAddress(应用程序启动起始地址)为0x0800 4000
然后就是,编译下载到板子上。
随便打开一个串口助手,将波特率设置为115200,按下方表格连线。
单片机(以STM32F103C8T6为例) | USB-TTL模块 |
---|---|
5V | 5V |
GND | GND |
PA9(USART1_TX) | RXD |
PA10(USART1_RX) | TXD |
就可以看到串口1打印的调试信息了。
这样BootLoader的程序就下载好了,等我们有了APP工程,就可以利用超级终端远程烧录固件了。
APP区就是我们用户自己自定义的具体功能区,起始地址从Bootload之后,利用bootload将跳转到APP区。
打开一个自己需要更新到板子上的工程即可。但是要注意工程不要超出STM32 APP的存储区大小:
这里的值需要与上面第3.3.2步BootLoader工程中修改的ApplicationAddress的值一致。
我们在做远程更新时,所发送过去的文件类型为bin,所以我们需要输出一个bin文件。
按下面的操作即可,复制到框中的内容为:
$K\ARM\ARMCC\bin\fromelf.exe --bin [email protected] !L
还是上面那样,利用USB-TTL模块连接到单片机的串口1。
双击打开下载的hypertrm.exe(超级终端)。
随便输入一个名称点击确定。
如果线连对了,并且电脑有相应的驱动,它会自动检测到相应的COM口,点击确定即可。
之后我们配置波特率为115200(BootLoader工程中配置的串口波特率为115200),数据流控制我们选无。点击确定。
之后我们点击单片机的复位,可以看到打印的信息。
在电脑上,输入“1”,单片机会不断打印“C”,这是在等待bin文件传输。
我们按下面的流程利用Ymodem协议传输发送bin文件。
我们可以看到进度条,
待传输完成后,单片机的串口一会打印接收到的文件名称和大小信息。并且重新等待用户操作,输入1:更新固件。输入3:跳出BootLoader,进入APP区。
我们输入3,就可以看到我们APP工程开始运行了。
其实使用两个蓝牙和上面的使用串口基本一样,因为蓝牙在这里只是取代了杜邦线的作用。
我们可以看下面这个文章将两个HC-05蓝牙模块分别配置为主从模式,波特率115200。
可以看下面的文章进行蓝牙匹配。
两个蓝牙模块HC-05的主从机匹配
当两个蓝牙匹配成功,都上电后,两个蓝牙很快就会从灯频闪变为慢闪。这时就连接成功了。
此时按上面3.4的步骤走就可以。
使用下面的链接下载即可: hypertrm网盘下载链接
下载压缩版后解压会有下面三个版本的hypertrm,都是免安装的。