STM32F103C8T6蓝牙OTA教程

在这里插入图片描述
在这里插入图片描述

一、准备与简介

1. 准备材料

  文章使用的软硬件并不局限,下述仅作参考,文章的所有使用的工程可在文末获取(百度网盘+Github)

1)STM32F103C8T6核心板

2)下载器(PWLINK)

3)蓝牙透传模块(HC-04)

4)软件:Keil5 MDK+ SecureCRT(支持Ymodem协议传输的终端仿真软件)

在这里插入图片描述

2.OTA简介

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

3. IAP简介

  IAP: In Application Programming,是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级,写到这里,结合上面的OTA,大家可以猜到,我们本次教程就是在IAP的基础上通过蓝牙串口透传实现OTA。

二、IAP升级

1. Bootload

1)简介

  实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序,也就是BOOTLOAD(引导加载程序,),我们不再像以往那样,对MCU进行整片数据的擦除,而是分为Bootload和APP两个部分(内存容量大的可以再划分备份区等,鉴于STM32F103C8T6的资源空间,暂时划分这两个区)。
在这里插入图片描述

2)Bootload工程下载

  首先我们需要下载STM32官网的IAP 升级的Bootload工程: 意法半导体STMicroelectronics:使用USART进行STM32F10xxx应用内编程-下载
在这里插入图片描述
填写自己的相关信息:
在这里插入图片描述
然后在我们的个人邮箱中就可以收到下载连接:
在这里插入图片描述
下载后解压文件,打开MDK工程:
在这里插入图片描述

3)Bootload工程修改

由于我使用的是MDK5,可以点击第一项来适应旧版工程:
在这里插入图片描述
首先是编译检查:
在这里插入图片描述
选择设备为STM32F103C8T6:
在这里插入图片描述
  由于STM32F103C8T6的内存是中等容量大小,我们还需要在下面进行修改,将阴影处的“xxxHD_VL”内容更换为“xxxMD”:

在这里插入图片描述
选择自己的烧录器,比如我使用的是PWLINK,就选择CMSIS-DAP,大家根据自己的LINK填写:
在这里插入图片描述

下面也是根据自己的烧录器选择:在这里插入图片描述
然后将bootload改小一点:
在这里插入图片描述
应用地址也调整一下,注意:这个地址在后面APP工程中会用到,需要对应一致,记住这个0x8005000:
在这里插入图片描述
再次编译:
在这里插入图片描述
然后连接下载器和STM32,编译烧录下载:
在这里插入图片描述
[此步骤可省略]然后我们通过串口助手查看串口信息:波特率选择115200,出现如下界面即可。
在这里插入图片描述
等我们有了APP固件,我们就可以使用SecureCRT进行固件传输了,接下来讲解APP部分。

2. APP

1)简介

  APP区就是我们用户自己自定义的具体功能区,起始地址从Bootload之后,利用bootload将跳转到APP区,这里不过多介绍,只要保证bootload的跳转地址是APP的起始地址即可。

2)工程搭建

  应用层就比较随意,这里我们以串口打印为例,串口打印的方法相信大家也都比较熟悉,这里默认大家有用一个串口打印的工程,或者文末下载我使用的这个工程,是一个基于正点原子标准库协议的一个简单串口发送的工程,大家可以用自己的任意工程,但是工程不要太大,避免超出STM32 APP的存储大小:
在这里插入图片描述

3)APP地址

这里的一个重点就是,地址需要与Bootload中APP的地址一致:
在这里插入图片描述

4)生成bin文件

  还有一个重点是,IAP升级时,我们用SecureCRT软件通过串口利用Ymodem协议传输.bin固件文件,所以首先我们需要在编译后生成bin文件:
在下图添加:

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

在这里插入图片描述
再次编译:

在这里插入图片描述
在这里插入图片描述
接下来我们就可以使用SecureCRT进行IAP升级了。

3.串口IAP升级

在这里插入图片描述

1)安装SecureCRT软件

SecureCRT软件大家自行下载安装,网上资源很多

2)新建串口终端

首先点击快速连接:
在这里插入图片描述
选择串口:
在这里插入图片描述
选择自己的串口以及波特率115200:
在这里插入图片描述
点击连接后,按下STM32F103C8T6的复位按钮:
在这里插入图片描述
然后在键盘中按下数字1(SecureCRT不提供回显)
在这里插入图片描述
然后选择Ymodem传输:
在这里插入图片描述
然后选择上面生成的APP固件bin文件:
在这里插入图片描述
在这里插入图片描述
可以看到传输速度很快,然后按下“3”即可运行APP:
在这里插入图片描述
为了体现APP固件变化,这里我们修改一下APP程序:
在这里插入图片描述
然后编译生成固件:
在这里插入图片描述
按上述操作输入数字1,然后选择固件发送:
在这里插入图片描述
到这里我们就完成了串口IAP的固件升级,接下来我们使用蓝牙完成无线升级,也就是OTA。

三、蓝牙OTA

1. 简介

  在IAP升级中,我们可以看到,实际的bin文件是用串口进行发送的,那么,我们将STM32的串口连接一个蓝牙串口透传模块,然后PC机的蓝牙连接模块的蓝牙,就可以借助蓝牙将数据发送给STM32的串口了。
在这里插入图片描述

2.蓝牙配置

理论上任意支持蓝牙透传的模块均可,我是用的是HC-04蓝牙模块:
在这里插入图片描述
大家也可以选择其他蓝牙模块,这里主要注意的是两点

1) 波特率配置为115200

在这里插入图片描述

2)进入透传模式

我使用的这款HC04,波特率配置的AT指令为“AT+BAUD=115200”

在这里插入图片描述如果大家使用的其他蓝牙模块,请按照自己的模块使用手册进行配置。

3)引脚连接

在这里插入图片描述

4)PC蓝牙配对

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、蓝牙OTA

1)新建连接

在这里插入图片描述
在这里插入图片描述
接下来我们可以重复IAP升级的那些操作,例如,按下数字3直接运行:
在这里插入图片描述
修改MDK工程,更新固件:
在这里插入图片描述

然后按下复位,发送数字1,选择自己的固件并上传:
在这里插入图片描述
在这里插入图片描述
  可以看到固件已经更新,到这里,蓝牙OTA的功能已经实现,我们使用的是SecureCRT软件通过串口以Ymodem协议的方式传输bin文件,感兴趣的大家可以尝试自己编写PC或Android上位机来完成Ymodem固件的发送。


  本期内容就到这里,如果在操作过程中有任何问题,可以在公众号"IOT趣制作"内留言,本期内容所有相关资料已上传,回复关键字“BLEOTA”或“0809”即可。

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

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

相关文章

Linux文件属性查看和修改学习

一、基本属性 1、看懂文件属性: Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性, Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的…

Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch …

Https、CA证书、数字签名

Https Http协议 Http协议是目前应用比较多应用层协议,浏览器对于Http协议已经实现。Http协议基本的构成部分有 请求行 : 请求报文的第一行请求头 : 从第二行开始为请求头内容的开始部分。每一个请求头都是由K-V键值对组成。请求体&#xf…

微服务05-Sentinel流量防卫兵

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以 流量 为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 S…

06-2_Qt 5.9 C++开发指南_自定义对话框及其调用

本篇介绍到的对话框及其调用实例较为复杂但十分详细,如果做了解可以先参考:QT从入门到实战x篇_13_模态和非模态对话框创建。 文章目录 1. 对话框的不同调用方式2. 对话框QWDialogSize 的创建和使用2.1 创建对话框QWDialogSize2.2 对话框的调用和返回值 …

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…

P12-Retentive NetWork-RetNet挑战Transformer

论文地址:https://arxiv.org/abs/2307.08621 目录 Abstract 一.Introduction 二.Retentive Networks 2.1Retention 2.2Gated Multi-Scale Retention 2.3Overall Architecture of Retention Networks 2.4Relation to and Differences from Previous Methods 三.Experime…

Vue 安装开发者工具

1.下载开发者工具,下载地址:http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器,点击扩展,点击管理扩展程序。 3.开启开发者模式,将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中: C10 C10,来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码,可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

pdf怎么压缩?一分钟学会文件压缩方法

PDF文件过大一般主要原因就是内嵌大文件、重复的资源或者图片比较多,随之而来的问题就是占用存储空间、被平台限制发送等等,这时候我们可以通过压缩的方法缩小PDF文件大小,下面就一起来看看具体的操作方法吧。 方法一:嗨格式压缩大…

SQL | 汇总数据

9-汇总数据 9.1-聚集函数 在实际开发过程中,可能会遇到下面这些情况: 确定大于某个值的有多少行数据,比如游戏排行榜,查询玩家排行多少名。 获取表中某些行的和,比如双十一当天,某个用户总订单价格是多少…

Mapbox加载天地图CGCS2000矢量瓦片地图

1.背景 最近在做天地图的项目,要基于MapBox添加CGCS2000矢量切片数据,但是 Mapbox 只支持web 墨卡托(3857)坐标系的数据。Github有专业用户修改了mapbox-gl的相关代码,支持CGCS2000的切片数据加载,并且修改…

一文教你学会Termux+SFTP+远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP(SSH File Transfer Protocol)是一种基于SSH(Secure Shell)安全协议的文件传输协议。与FTP协议相比,SFTP使用了…

docker可视化工具Portainer

1:Portainer简介 Portainer是一个docker可视化管理工具,可以非常方便地管理docker镜像容器。官网地址:https://www.portainer.io/ 注:现在Portainer有BE(收费)和CE(免费)版本,安装的…

Mongodb:业务应用(1)

环境搭建参考&#xff1a;mongodb&#xff1a;环境搭建_Success___的博客-CSDN博客 需求&#xff1a; 在文章搜索服务中实现保存搜索记录到mongdb 并在搜索时查询出mongdb保存的数据 1、安装mongodb依赖 <dependency><groupId>org.springframework.data</groupI…

ICC2如何write_gds写出pr boundary

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球 在数模混合项目中,需要在前期确定pr boundary的尺寸,可以在virtuoso中画一个pr boundary存def给pr,当然,pr这边在前期修改尺寸也需要给负责模拟版图的同事确认,但ICC2 write gds默认是写不出pr bou…

React源码解析18(7)------ 实现事件机制(onClick事件)

摘要 在上一篇中&#xff0c;我们实现了useState的hook&#xff0c;但由于没有实现事件机制&#xff0c;所以我们只能将setState挂载在window上。 而这一篇主要就是来实现事件系统&#xff0c;从而实现通过点击事件进行setState。 而在React中&#xff0c;虽然我们是将事件绑…

jmeter获取mysql数据

JDBC Connection Configuration Database URL: jdbc:mysql:// 数据库地址 /库名 JDBC Driver class&#xff1a;com.mysql.jdbc.Driver Username&#xff1a;账号 Password&#xff1a;密码 JDBC Request 字段含义 字段含义 Variable Name Bound to Pool 数据库连接池配置…

PHP证券交易员学习网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP证券交易员学习网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址https://download.csdn.net/download/qq_41221322/88205549 PHP证券交易员…