打印
[应用相关]

基于STM32WB的低功耗蓝牙应用(三)OTA空中升级

[复制链接]
1367|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

基于STM32WB的低功耗蓝牙应用(三)

用户应用程序的无线更新(OTA空中升级)


无线/空中升级

无线/空中升级(FOTA)

接下来,我们看看无线的,空中升级的原理。升级对象是Nucleo板子。它的FUS已经是1.0.1,可以不用在升级了;我们把BLE stack从1.1.0升到最新的1.2.0;用户程序就更加直观了,从心跳 profile,升级成P2P server profile。上位机采用PC上的STM32CubeProgrammer,并搭配运行TransparentVCP(虚拟串口透传功能)的USB dongle板,一起工作。


使用特权

评论回复
沙发
花间一壶酒sd|  楼主 | 2021-4-22 12:19 | 只看该作者
使用 STM32CubeMonitorRF 触发 BLE 连接的 OTA


左边是上位机,FOTA客户端,通过BLE,发起OTA请求,并提供新版本image;右边是Nucleo板,FOTA server端,通过BLE,接收OTA请求,并接收新版本的image。可以升级用户程序本身,也可升级RF stack,如图中两个红色箭头所示。

使用特权

评论回复
板凳
花间一壶酒sd|  楼主 | 2021-4-22 12:20 | 只看该作者
升级用户应用

使用特权

评论回复
地板
花间一壶酒sd|  楼主 | 2021-4-22 12:25 | 只看该作者
我们先来升级用户应用,目标是从当前的心跳profile,升级到P2P server,升级成功后,效果非常直接,运行手机app, ST BLE sensor,连接设备,界面完全不同。为了达到这个目标,使用STM32CubeWB固件包中的三个项目。先把BLE_OTA和BLE_HeartRate_ota下载到nucleo板子上;把BLE_heartrate_ota下载到0x0800 7000处。ble_ota是编译链接在0x0800,0000地址处,是Nucleo板子上电就运行的;它要是没有查到ota请求标志,并且0x0800,7000处有有效代码,则跳转到0x800,7000运行,执行heart rate的心跳profile了。否则继续执行ota本身,开始准备接收来自FOTA 客户端的新固件。 这样看下来,整个过程,逻辑上跟我们以前的IAP by USB, IAP by Ethernet没有什么区别。

使用特权

评论回复
5
花间一壶酒sd|  楼主 | 2021-4-22 12:27 | 只看该作者

使用特权

评论回复
6
花间一壶酒sd|  楼主 | 2021-4-22 12:27 | 只看该作者

使用特权

评论回复
7
花间一壶酒sd|  楼主 | 2021-4-22 12:28 | 只看该作者
对于Nucleo板,要把两个分别链接在两个不同flash地址的项目下载下去,可以使用IAR里的Download active application功能;当然STM32CubeProgrammer也有类似功能,大家按照自己的喜好使用不同工具都可以。

使用特权

评论回复
8
花间一壶酒sd|  楼主 | 2021-4-22 12:29 | 只看该作者
对于Dongle板,它只有USB口,没有jtag/swd调试口暴露出来,因此要使用它的系统bootloader,使用DFU的形式,把透传VCP的程序下载下去,上位机,就用我们的STM32CubeProgrammer即可。烧写好了之后,dongle板记得恢复到从用户flash启动。连到PC会看到一个虚拟串口。

使用特权

评论回复
9
花间一壶酒sd|  楼主 | 2021-4-22 12:29 | 只看该作者
启动 STM32CubeMonitorRF,并连接 Dongle 设备

使用特权

评论回复
10
花间一壶酒sd|  楼主 | 2021-4-22 12:30 | 只看该作者
打开STM32CubeMonitor-RF,在首页选择BLE协议;然后在Select device这里的下拉菜单中,选择Dongle板子对应的COM口,这里是COM14,然后点击connect。这个连接动作,实际是上位机发一条“获取版本信息”的命令给到dongle板。如果它正常工作,就会返回信息,如图右上角。

使用特权

评论回复
11
花间一壶酒sd|  楼主 | 2021-4-22 12:31 | 只看该作者
启动 OTA Updater,更新用户应用程序

使用特权

评论回复
12
花间一壶酒sd|  楼主 | 2021-4-22 12:31 | 只看该作者
启动OTA Update功能,搜寻OTA设备,找到之后选中它;


我们现在先来更新用户应用程序,因此Target CPU,使用默认的CPU1:M4即可;固件下载目标地址,使用默认的0x7000即可,这个值是和待更新的用于程序P2P_server_ota的链接地址保存一致的。然后通过browse按钮,给出新应用程序p2pserver_ota的bin文件地址。最后点击update即可。


升级完成后,会显示done的提示。nucleo板子当前已经是P2P sever了。使用手机app的ST BLE Sensor可以连接并控制它上面的LED灯。

使用特权

评论回复
13
花间一壶酒sd|  楼主 | 2021-4-22 12:32 | 只看该作者
启动 OTA Updater,更新 BLE 协议栈

使用特权

评论回复
14
花间一壶酒sd|  楼主 | 2021-4-22 12:32 | 只看该作者
更新BLE stack也是一样的操作。现在我们要把nucleo板子上的BLE stack1.1.0更新到最新的1.2.0。


也是启动OTA Update功能,搜寻OTA设备,找到之后选中它;因为要更新BLE协议栈,因此Target CPU,选择CPU2:M0+;image下载目标地址,使用默认的0xF000即可。这个地址是和OTA bootloader的代码搭配好的。然后指定1.2.0 版本BLE stack image的地址,点击Update即可。

使用特权

评论回复
15
花间一壶酒sd|  楼主 | 2021-4-22 12:33 | 只看该作者
再次检验当前版本

使用特权

评论回复
16
花间一壶酒sd|  楼主 | 2021-4-22 12:34 | 只看该作者
最后,为了验证,我们按照之前的方式,把Nucleo板子设置到系统bootloader启动,通过STM32CubeProgrammer的命令行,读出当前Nucleo板子上的BLE stack版本,已经从1.1.0升级到了1.2.0,符合预期。

使用特权

评论回复
17
花间一壶酒sd|  楼主 | 2021-4-22 12:34 | 只看该作者
架构:用户bootloader – 用户application

使用特权

评论回复
18
花间一壶酒sd|  楼主 | 2021-4-22 12:35 | 只看该作者
通过BLE接口,空中无线升级用户应用程序,和BLE 协议栈,体验完毕后,我们现在来讨论一下BLE FOTA的原理和实现。和普通的IAP一样,STM32CubeWB固件包里的ota例子,也是采用“用户bootloader和用户应用程序这种架构”。板子上电,先运行用户bootloader,即图中绿色OTA部分。因为之前没有收到来自外界的fota请求,并且0x0800,7000这里也已经烧好了用户应用,就跳到蓝色部分执行,heart rate profile。heart rate心跳应用,除了常规的把测量到的心跳值,这里用的是一个模拟值,定期通过BLE发出去。我们使用手机app,ST BLE sensor可以连接该设备,看到心跳的界面。除了这个常规业务功能,为了实现OTA功能,需要在现有的BLE service中,比如现在这个heart rate service里,增加一个名为OTA reboot request的characteristic。它用来接受发自OTA client,比如手机app,或者这里的CubeMonitor-RF上位机的固件升级请求。并且用户应用程序,在收到OTA请求后,在SRAM1的起始位置打上标记并复位。

使用特权

评论回复
19
花间一壶酒sd|  楼主 | 2021-4-22 12:36 | 只看该作者
复位后,先运行绿色的ota bootloader。这次它检查到了ota请求标志,于是就不跳转到蓝色的用户应用执行了,而是继续运行ota bootloader的接收新固件程序。这是通过一个ST自定义的BLE service实现的。


也就是说,这个BLE FOTA,相比以往传统的IAP,就是分别在bootloader和用户application,各自增加了一个自定义BLE service,和一个自定义的的characteristics。我们来看一下细节。

使用特权

评论回复
20
花间一壶酒sd|  楼主 | 2021-4-22 12:36 | 只看该作者
自定义BLE service/char.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

1129

帖子

2

粉丝