基于STM32WB的低功耗蓝牙应用(二)
RF协议栈的有线和无线更新
基于STM32WB的低功耗蓝牙应用(一) STM32WB概览
基于STM32WB的低功耗蓝牙应用(二) RF协议栈的有线和无线更新
基于 STM32WB 的低功耗蓝牙应用(三) 用户应用程序的无线更新(OTA空中升级)
STM32WB蓝牙设计开发汇总(RF天线,PA,功耗测试,OTA等)
通过USB更新USBDongle板的FUS、RF Stack
现在我们先使用第一种方式,即通过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里面可以查到。在本节视频,第七页 胶片的表格里有标注。
现在开始具体操作。USB dongle板子SW2开关拨到如图方向,连接到PC,STM32WB芯片从系统flash启动,开始运行系统bootloader了。它扫描到USB通信口上有信号,进入DFU模式,激活M0+内核让它开始运行,由此可以响应来自上位机PC的STM32CubeProgrammer发出的命令。
通过-fwdelete命令,删除USBDongle板子上预装的0.5.1版本的BLE stack。
刚才为了一次多读几个信息值,从内存 0x2003 0024开始读取出来50个字节;现在我们只要查一下FUS版本,直接读读内存 0x2003 0030处的值即可,0.5.3;
接着,使用【-fwupgrade】命令升级FUS。由于现在芯片里有老的FUS,因此firstinstall参数是0。在命令行窗口可以看到升级过程中的log信息。
FUS新版下载好了之后,再读一下当前版本,是1.0.2了。OK
FUS已经最新版本了,接下来就是下载通用最新版本的BLE stack了。经过几秒,BLE stack也下载好了。
再次读取一下FUS和BLE stack的版本,分别已经是1.0.2和1.2.0了,符合预期。
现在,USBDongle板子里的FUS和BLE stack都是STM32CubeWB固件包里最新版了,我们在把它恢复成用户flash启动之前,先继续使用当前的DFU模式,来把STM32CubeWB固件包里的TransparentVCP例程下载进去,稍后做BLE空中升级时会用到。最后,才把USB dongle板子的SW2开关拨回到“0”的位置,这样,之后,板子上电就会自动运行虚拟串口的透传功能了。
什么是FUS · AN5185
实际操作体验告一段落,再演示第二种近程方式,即通过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的使用,我们在下一期来讲。
FUS目前有三个版本,一个STM32WB芯片出厂预烧好的,大家拿不到image的0.5.3版本;一个1.0.1和1.0.2版本,可以在STM32CubeWB固件包里可以拿到,这些随WB固件包一起更新并发布的image,都是被ST签名加密过的。
FUS 的版本及升级规则
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的提示。
FUS 和 RF Stack 的位置
FUS 和 Rf stack都是由M0+运行,且都运行在安全用户闪存区域,即图中两根虚线之间的位置。它们和用户的应用程序都一样存放在用户flash,但是占据着由Secure option byte(安全选项字节)指定的地址开始的高段空间。高段空间的尾部,是ST预留的和安全feature相关的预留地,不能动,因此如果FUS或者RF stack的新版本尺寸比以前大了,会把上面那根虚线继续往上抬,即挤压用户应用程序的空间,然后secure option byte的值也会被自动修改。
通过SWD更新Nucleo板的FUS、RF Stack
现在来看第二种进程更新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两个批处理即可。
这个方法的原理是,使用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等功能。
再次检验当前版本
用同样的方式,读出当前Nucleo板子上的FUS和BLE stack版本,分别是1.0.1和1.1.0,符合预期。
近程升级FUS、RF Stack的小结
现在回顾一下,刚才分别对STM32WB套件中两个板子,通过USB接口,一步一步输命令;通过JTAG/SWD调试接口,执行批处理文件,升级了芯片的FUS、和BLEstack版本。USBDongle板的版本一步到位,并且也烧录好了TransparentVCP例程。
大家回想,体会一下,会发现,其上这两种方式本质是一样的,都是跑了一段程序,去调用FUS的API,然后FUS把已经放在用户flash 用户区域的image,拿来验签、解密、烧写。不同的仅仅是一个通过usb接口,和系统bootloader里的代码交互,一条命令一条命令的执行;一个是通过jtag调试接口,把代码一口气下到用户flash,一口气跑完,所谓批处理。