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地址
- 如果验证不通过,则直接终止该过程

- 芯片在BOOT启动之后先判断是否有OTA的请求(判断是否进入User APP)
- 如果有进入OTA app, 没有进入 用户app
- 在User app 中收到OTA request 可通过Reboot service 复位进入到 BOOT
- 在OTA APP中,收到OTA client 的更新请求,接收推送的固件包
- 可以选择更新用户应用固件 或者 协议栈固件 RSS固件

- 应用程序中添加重启的特性。这条特性是官方自定义的特性
- 通过该特性可以切换到BOOT
- 可以设置重启后的进入 APP还是 BOOT

- 在 BOOT中设置OTA服务有三个特性
- 特性1:临时保存文件的基地址(接收固件先保存到临时地址)(可以控制OTA的进行状态)
- 特性2:告知对方固件已经接收完成,将进行重启
- 特性3:进行固件原始数据的传输

- 在BOOT中广播需要配置为 OTA特性
- TX_POWER_LEVEL :广播发射功率等级
- COMPLETE_NAME: 广播设备名称
- MANUF_SPECIFIC:厂商自定义的数据
- FLAGS: 数据标记

- 在APP中建立连接并发现服务
- 接收到Reboot 特性进行重启
- 进入BOOT
- 在BOOT中建立连接并发现服务
- 客户端 写入文件类型和基地址
- 客户端 写入固件原始数据
- 客户端 写入文件更新完成和校验
- 服务器 固件接收完成进行固件的校验和更新
- 服务器 然后发送通知 告知固件更新完成
- 服务器 进行重启
- 进入APP



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




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.
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广播名称是这个
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固件方便为了和升级之前区分,修改广播名称,前文已经提到
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的广播名称

- 现在已经验证升级成功
2238

被折叠的 条评论
为什么被折叠?



