[应用相关] 基于STM32WB低功耗蓝牙应用二 RF协议栈的有线和无线更新

[复制链接]
1383|26
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:44 | 显示全部楼层 |阅读模式
通过USB更新

通过USB更新USBDongle板的FUS、RF Stack

882086080f120dc9a4.png


 楼主| 花间一壶酒sd 发表于 2021-4-22 11:46 | 显示全部楼层
现在我们先使用第一种方式,即通过USB接口,使用STM32CubeProgrammer的命令行来升级FUS和BLE stack了。一共有7个步骤,首先确保自己电脑上装有v2.0版本及以上的STM32CubeProgrammer,当前2019.10月初,ST官网上最新版本是2.1,都可以。然后把板子设置成从系统flash启动,对于USB dongle板,很简单,就是直接把SW2这个开关拨到BOOT0这边,就是远离标准USB-A插口那个方向。然后使用STM32CubeProgrammer的命令行,分别通过fwdelete删掉预装的0.5.1的BLE stack,再通过fwupgrade来分别升级最新版的FUS和BLE stack。绿色的是我们将要升级的新版本FUS、RF stack image,在自己PC上的存放地址,以及将要烧到目标芯片里的位置。这些地址,在STM32CubeWB固件包里,专门存放最新版M0+内核运行的image的文件夹里,和各个image放在一起的一个release note里面可以查到。在本节视频,第七页 胶片的表格里有标注。
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:46 | 显示全部楼层
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:47 | 显示全部楼层
现在开始具体操作。USB dongle板子SW2开关拨到如图方向,连接到PC,STM32WB芯片从系统flash启动,开始运行系统bootloader了。它扫描到USB通信口上有信号,进入DFU模式,激活M0+内核让它开始运行,由此可以响应来自上位机PC的STM32CubeProgrammer发出的命令。
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:47 | 显示全部楼层
705606080f1d02ccc5.png
通过-fwdelete命令,删除USBDongle板子上预装的0.5.1版本的BLE stack。
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:48 | 显示全部楼层
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:49 | 显示全部楼层
刚才为了一次多读几个信息值,从内存 0x2003 0024开始读取出来50个字节;现在我们只要查一下FUS版本,直接读读内存 0x2003 0030处的值即可,0.5.3;
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:50 | 显示全部楼层
829546080f2569f97b.png 接着,使用【-fwupgrade】命令升级FUS。由于现在芯片里有老的FUS,因此firstinstall参数是0。在命令行窗口可以看到升级过程中的log信息。
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:51 | 显示全部楼层
598556080f28d7c8da.png FUS新版下载好了之后,再读一下当前版本,是1.0.2了。OK
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:52 | 显示全部楼层
883106080f2cdecfb3.png FUS已经最新版本了,接下来就是下载通用最新版本的BLE stack了。经过几秒,BLE stack也下载好了。

 楼主| 花间一壶酒sd 发表于 2021-4-22 11:55 | 显示全部楼层
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:55 | 显示全部楼层
再次读取一下FUS和BLE stack的版本,分别已经是1.0.2和1.2.0了,符合预期。
现在,USBDongle板子里的FUS和BLE stack都是STM32CubeWB固件包里最新版了,我们在把它恢复成用户flash启动之前,先继续使用当前的DFU模式,来把STM32CubeWB固件包里的TransparentVCP例程下载进去,稍后做BLE空中升级时会用到。最后,才把USB dongle板子的SW2开关拨回到“0”的位置,这样,之后,板子上电就会自动运行虚拟串口的透传功能了。

 楼主| 花间一壶酒sd 发表于 2021-4-22 11:56 | 显示全部楼层
FUS

什么是FUS · AN5185

508086080f3e802612.png
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:57 | 显示全部楼层
实际操作体验告一段落,再演示第二种近程方式,即通过JTAG/SWD来更新FUS、RF stack之前,我们来正式看一下什么是FUS。

FUS,是firmware upgrade service的简称,是一段跑在安全用户flash上的,由M0+内核运行的程序。所有和STM32WB新引入的安全功能,都要通过它来操作。比如安装或者升级,由ST签名加密过的FUS、RF stack image;比如要存储和使用应用秘钥,所谓CKS, CTM key service,都是通过FUS service暴露给M4内核的API来调用、执行的。关于应用key和客户key的使用,我们在下一期来讲。
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:58 | 显示全部楼层
FUS目前有三个版本,一个STM32WB芯片出厂预烧好的,大家拿不到image的0.5.3版本;一个1.0.1和1.0.2版本,可以在STM32CubeWB固件包里可以拿到,这些随WB固件包一起更新并发布的image,都是被ST签名加密过的。 178726080f4434a4d3.png
 楼主| 花间一壶酒sd 发表于 2021-4-22 11:59 | 显示全部楼层
1.0.1版本的FUS,是在STM32CubeWB固件包1.1.0中发布的,它适用于1M flash的WB芯片,即STM32WB4xG。
支持256K flash和512K flash的WB芯片,即STM32WB5xC/E的FUS,是版本1.0.2,在STM32CubeWB固件包的1.1.1中发布。


注意,如果拿到手上的STM32WB芯片是5xC/E,请直接升到1.0.2版本的FUS,不要升到1.0.1,否则芯片会被不可逆的锁定。
而,如果手上的是5xG,1.0.1和1.0.2的FUS都适用。只是,无需再从1.0.1升到1.0.2,因为功能上并无大变化,实在要升,会返回Image _Not_Authetic的提示。
 楼主| 花间一壶酒sd 发表于 2021-4-22 12:00 | 显示全部楼层
FUS · RF Stack
504506080f4f31c3a4.png
FUS 和 RF Stack 的位置

 楼主| 花间一壶酒sd 发表于 2021-4-22 12:01 | 显示全部楼层
FUS 和 Rf stack都是由M0+运行,且都运行在安全用户闪存区域,即图中两根虚线之间的位置。它们和用户的应用程序都一样存放在用户flash,但是占据着由Secure option byte(安全选项字节)指定的地址开始的高段空间。高段空间的尾部,是ST预留的和安全feature相关的预留地,不能动,因此如果FUS或者RF stack的新版本尺寸比以前大了,会把上面那根虚线继续往上抬,即挤压用户应用程序的空间,然后secure option byte的值也会被自动修改。

 楼主| 花间一壶酒sd 发表于 2021-4-22 12:02 | 显示全部楼层
通过SWD更新

通过SWD更新Nucleo板的FUS、RF Stack
6576080f5439cd56.png
现在来看第二种进程更新FUS和RF stack的方式,通过JTAG/SWD这样的调试接口。刚才使用的USB dongle板,这次我们使用Nucleo板。nucleo板这次升级,不准备一步到位,先 把FUS和RF stack分别升级到1.0.1和1.1.0;留着点空间,后面演示空中升级。因此只要双击FLASH_BLE_stack_V1.1.0.bat和FLASH_FUS_V1.0.1.bat两个批处理即可。
 楼主| 花间一壶酒sd 发表于 2021-4-22 12:03 | 显示全部楼层
这个方法的原理是,使用STLINK-Utility的命令行,通过SWD接口,把一段叫做FUS_Operator的代码下载用户flash开始处,再把对应要升级的FUS或者RF stack的image下到用户flash稍后的地方,启动FUS operator运行。FUS operator检查到约定好的用户flash‘地址处有 image 待升级,就调用FUS的API,来把image进行验签和解密,然后烧写。


目前ST官网上还没有公开对应代码,大家可以找ST的代理或者FAE索要试用。好消息是:今年底之前,会把这个功能集成到STM32CubeProgrammer里,先是命令行支持,随后会是GUI支持。多说一句,关于STM32 PC端的工具,大趋势是:STM32CubeProgrammer会替换掉之前的Flash loader、DFUSe,STLINK-utility、STVP等功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1219

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部