【BLE】STM32WB55_OTA(二)

张开发
2026/4/21 3:46:06 15 分钟阅读

分享文章

【BLE】STM32WB55_OTA(二)
1. 资料来源本文根据视频资料总结链接地址https://www.bilibili.com/video/BV1Ls4y1Y7G2?spm_id_from333.788.videopod.sectionsvd_source1162555127890799f245b5868d0f6dd12. 资料整理RSS:安全认证作用SFSA 是FLASH中安全区和非安全区的起始地址注意下载新的加密协议栈首先保存在非安全区的空闲区。然后RSS验证新版本的协议栈2.0。RSS固件将新协议栈搬运至非安全的FLASH地址如果验证不通过则直接终止该过程芯片在BOOT启动之后先判断是否有OTA的请求(判断是否进入User APP)如果有进入OTA app 没有进入 用户app在User app 中收到OTA request 可通过Reboot service 复位进入到 BOOT在OTA APP中收到OTA client 的更新请求接收推送的固件包可以选择更新用户应用固件 或者 协议栈固件 RSS固件应用程序中添加重启的特性。这条特性是官方自定义的特性通过该特性可以切换到BOOT可以设置重启后的进入 APP还是 BOOT在Boot中初始化判断在 BOOT中设置OTA服务有三个特性特性1临时保存文件的基地址接收固件先保存到临时地址可以控制OTA的进行状态特性2告知对方固件已经接收完成将进行重启特性3进行固件原始数据的传输在BOOT中广播需要配置为 OTA特性TX_POWER_LEVEL :广播发射功率等级COMPLETE_NAME: 广播设备名称MANUF_SPECIFIC:厂商自定义的数据FLAGS: 数据标记【APP中】在APP中建立连接并发现服务接收到Reboot 特性进行重启【BOOT中】进入BOOT在BOOT中建立连接并发现服务客户端 写入文件类型和基地址客户端 写入固件原始数据客户端 写入文件更新完成和校验服务器 固件接收完成进行固件的校验和更新服务器 然后发送通知 告知固件更新完成服务器 进行重启进入APPBOOT起始地址 0x0800 0000 FLASH起始地址APP起始地址 0x0800 7000 (0x7000 28K)RAM1起始地址 0x2000 0004 ,前面四字节的数据被Reboot Request特性用来重启的时候保存OTA的请求下面这个图示是旧版本APP的界面3. 测试验证3.1 APP使用官方的例程验证官方Cube包地址https://www.st.com.cn/zh/embedded-software/stm32cubewb.html使用1.20.0的版本验证先烧录协议栈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.staticconstcharlocal_name[]{AD_TYPE_COMPLETE_LOCAL_NAME,P,2,P,S,R,V,1};修改为staticconstcharlocal_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\EWARMBOOT 起始地址BOOT空间大小RAM 起始地址BOOT广播名称是这个staticconstchara_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/stblesensclassic.htmlhttps://www.st.com.cn/zh/embedded-software/stblesensor.html#https://www.st.com.cn/zh/embedded-software/stbletoolbox.html打开软件后可以扫描识别到我们设备点击后连接点击FUOTA选择这个APP固件注意这个APP固件方便为了和升级之前区分修改广播名称前文已经提到staticconstcharlocal_name[]{AD_TYPE_COMPLETE_LOCAL_NAME,P,2,P,S,R,V,2};显示升级进度升级成功可以看到扫描到的APP广播名称已经为 SRV2说明固件已经成功替换再次验证一下把flash全片擦除只烧录BOOT复位运行可以看到BOOT广播名为STM_OTA连接并升级APPAPP升级成功后扫描到APP的广播名称现在已经验证升级成功使用官方的例程跑通整个流程注意官方的Bootloader功能逻辑不严谨无断点续传异常重新开始无校验写入逻辑效率不高仅供参考

更多文章