【BLE】STM32WB55_官方OTA

1. 资料来源

本文根据视频资料总结:

链接地址:
https://www.bilibili.com/video/BV1Ls4y1Y7G2?spm_id_from=333.788.videopod.sections&vd_source=1162555127890799f245b5868d0f6dd1

2. 资料整理

  • RSS:安全认证作用
  • SFSA 是FLASH中安全区和非安全区的起始地址
  • 注意:下载新的加密协议栈首先保存在非安全区的空闲区。
  • 然后RSS验证新版本的协议栈2.0。
  • RSS固件将新协议栈搬运至非安全的FLASH地址
  • 如果验证不通过,则直接终止该过程
  1. 芯片在BOOT启动之后先判断是否有OTA的请求(判断是否进入User APP)
  2. 如果有进入OTA app, 没有进入 用户app
  3. 在User app 中收到OTA request 可通过Reboot service 复位进入到 BOOT
  4. 在OTA APP中,收到OTA client 的更新请求,接收推送的固件包
  5. 可以选择更新用户应用固件 或者 协议栈固件 RSS固件
  • 应用程序中添加重启的特性。这条特性是官方自定义的特性
  • 通过该特性可以切换到BOOT
  • 可以设置重启后的进入 APP还是 BOOT
  • 在 BOOT中设置OTA服务有三个特性
  • 特性1:临时保存文件的基地址(接收固件先保存到临时地址)(可以控制OTA的进行状态)
  • 特性2:告知对方固件已经接收完成,将进行重启
  • 特性3:进行固件原始数据的传输
  • 在BOOT中广播需要配置为 OTA特性
  • TX_POWER_LEVEL :广播发射功率等级
  • COMPLETE_NAME: 广播设备名称
  • MANUF_SPECIFIC:厂商自定义的数据
  • FLAGS: 数据标记
  1. 在APP中建立连接并发现服务
  2. 接收到Reboot 特性进行重启
  1. 进入BOOT
  2. 在BOOT中建立连接并发现服务
  3. 客户端 写入文件类型和基地址
  4. 客户端 写入固件原始数据
  5. 客户端 写入文件更新完成和校验
  6. 服务器 固件接收完成进行固件的校验和更新
  7. 服务器 然后发送通知 告知固件更新完成
  8. 服务器 进行重启
  9. 进入APP


  • BOOT起始地址 :0x0800 0000 FLASH起始地址
  • APP起始地址 : 0x0800 7000 (0x7000 = 28K)
  • RAM1起始地址: 0x2000 0004 ,前面四字节的数据被Reboot Request特性用来重启的时候保存OTA的请求


3. 测试验证

3.1 APP

stm32cubewb-v1-20-0\STM32Cube_FW_WB_V1.20.0\Projects\STM32WB_Copro_Wireless_Binaries\STM32WB5x

  • 读取协议栈版本
  • 这是官方 APP的例程

stm32cubewb-v1-20-0\STM32Cube_FW_WB_V1.20.0\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BLE_p2pServer_ota\EWARM

  • 修改优化等级
  • 输出为bin文件
  • 链接文件中配置为【资料整理】章节修改点
  • APP起始地址已经偏移

  • RAM 起始地址已经偏移

  • 开启OTA

    /******************************************************************************

    • Over The Air Feature (OTA) - STM Proprietary
      ****************************************************************************/
      #define BLE_CFG_OTA_REBOOT_CHAR 1/
      < REBOOT OTA MODE CHARACTERISTIC */
  • 关于收到Reboot 特性的操作,详细看官方代码

    /* USER CODE BEGIN P2PS_STM_App_Notification_P2P_Evt_Opcode */
    #if(BLE_CFG_OTA_REBOOT_CHAR != 0)
    case P2PS_STM_BOOT_REQUEST_EVT:
    APP_DBG_MSG("-- P2P APPLICATION SERVER : BOOT REQUESTED\n");
    APP_DBG_MSG(" \n\r");

    复制代码
        *(uint32_t*)SRAM1_BASE = *(uint32_t*)pNotification->DataTransfered.pPayload;
        NVIC_SystemReset();
        break;

    #endif
    /* USER CODE END P2PS_STM_App_Notification_P2P_Evt_Opcode */

  • 全部编译完成看到生成的bin固件

  • 直接下载 APP固件

  • 下面可以修改广播名为SRV2 ,用于区分升级前APP还是升级后APP

  • 升级前广播名SRV1, 升级后广播名SRV2.

c 复制代码
static const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME , 'P', '2', 'P', 'S', 'R', 'V', '1'};
修改为:
static const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME , 'P', '2', 'P', 'S', 'R', 'V', '2'};
这里纠正一下广播名改成其他的,ST BLE sensor可能识别不到
  • 编译生成一个升级用的APP固件,

3.2 Bootloader

  • 官方BOOT地址

\stm32cubewb-v1-20-0\STM32Cube_FW_WB_V1.20.0\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BLE_Ota\EWARM

  • BOOT 起始地址
  • BOOT空间大小
  • RAM 起始地址

  • BOOT广播名称是这个
c 复制代码
static const char a_LocalName[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'S', 'T', 'M','_', 'O', 'T', 'A' };
  • 具体的实现看代码
  • 编译后直接下载
  • 到这里单片机已经下载了APP和BOOT的固件了,

3.3 测试工具-上位机

  • 将上述烧录固件的单片机复位后运行
  • 使用【nRF Connect】蓝牙工具可以扫描到APP运行程序
  • 安装[ST BLE Sensor]工具,官方视频教程里是旧版本,新的版本不好用
  • 链接地址
    https://www.st.com.cn/zh/embedded-software/stblesensor.html#
  • 打开软件后可以扫描识别到我们设备
  • 点击后连接
  • 点击FUOTA
  • 选择这个APP固件
  • 注意这个APP固件方便为了和升级之前区分,修改广播名称,前文已经提到
c 复制代码
static const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME , 'P', '2', 'P', 'S', 'R', 'V', '2'};


  • 显示升级进度
  • 升级成功
  • 可以看到扫描到的APP广播名称已经为 SRV2,说明固件已经成功替换
  • 再次验证一下,把flash全片擦除,只烧录BOOT,复位运行可以看到BOOT广播名为STM_OTA
  • 连接并升级APP

  • APP升级成功后,扫描到APP的广播名称
  • 现在已经验证升级成功
相关推荐
List<String> error_P19 小时前
STM32 Systick定时器介绍
stm32·定时器·systick
蓑衣客VS索尼克19 小时前
STM32G4针对串口通信异常的操作
stm32·单片机·嵌入式硬件
小康小小涵20 小时前
STM32F103RCT6编写iNav1.7.3飞控固件底层开发
stm32·单片机·嵌入式硬件
物联网牛七七1 天前
stm32内核寄存器和外设寄存器
stm32·单片机·嵌入式硬件
嗯嗯=1 天前
STM32单片机学习篇3
stm32·单片机·学习
m0_555762901 天前
STM32H7 + VS Code + OpenOCD + STLink 完整配置教程
stm32·单片机·嵌入式硬件
为何创造硅基生物1 天前
STM32 串口的中断,空闲中断DMA
stm32·单片机·嵌入式硬件
youcans_1 天前
【动手学STM32G4】(5)STM32G431之ADC采样
stm32·单片机·嵌入式硬件·adc
炸膛坦客1 天前
FreeRTOS 学习:(二十四)任务状态与信息查询 API 函数
stm32·操作系统·freertos
Y1rong1 天前
STM32之GPIO
stm32·单片机·嵌入式硬件