你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32WB的低功耗蓝牙应用(二)RF协议栈的有线和无线...

[复制链接]
STMCU-管管 发布时间:2020-5-27 11:09
1、STM32 生态系统|基于STM32WB的低功耗蓝牙应用(一):https://www.stmcu.org.cn/module/forum/thread-621995-1-1.html
2、基于STM32WB的低功耗蓝牙应用(三)用户应用程序的无线更新(OTA空中升级):https://www.stmcu.org.cn/module/forum/thread-625175-1-1.html
4 X+ \/ y  x# X9 T) }

( F8 P: y0 K6 o- S* D* O/ F3 I4 U
基于STM32WB的低功耗蓝牙应用(二)RF协议栈的有线和无线更新

7 Y* [# _; c+ B: T4 b6 D
通过USB更新
7 Y$ W/ ]4 x3 G5 |- B' i( G0 p
通过USB更新USBDongle板的FUS、RF Stack

5 ?- b. E7 s  S, u, A5 M; h
11.jpg
5 u' X: B' o' c: e+ s, d1 n* P
现在我们先使用第一种方式,即通过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的BLEstack,再通过fwupgrade来分别升级最新版的FUS和BLE stack。绿色的是我们将要升级的新版本FUS、RF stack image,在自己PC上的存放地址,以及将要烧到目标芯片里的位置。这些地址,在STM32CubeWB固件包里,专门存放最新版M0+内核运行的image的文件夹里,和各个image放在一起的一个release note里面可以查到。在本节视频,第七页 胶片的表格里有标注。
5 F0 |& W2 K9 d: O, g3 E; u% b
22.jpg

3 `5 \" ~4 p/ t% \* W  C
现在开始具体操作。USB dongle板子SW2开关拨到如图方向,连接到PC,STM32WB芯片从系统flash启动,开始运行系统bootloader了。它扫描到USB通信口上有信号,进入DFU模式,激活M0+内核让它开始运行,由此可以响应来自上位机PC的STM32CubeProgrammer发出的命令。

+ e% J( Q- U0 t0 @' I0 F
33.jpg

0 _. S& b! p9 m- k; h1 P
通过-fwdelete命令,删除USBDongle板子上预装的0.5.1版本的BLE stack。
7 d" n* R# P, n- \+ q( W
44.jpg

$ c: g3 y5 h9 f& N& y, Q; N
刚才为了一次多读几个信息值,从内存 0x2003 0024开始读取出来50个字节;现在我们只要查一下FUS版本,直接读读内存 0x2003 0030处的值即可,0.5.3;

- ~* K9 E7 U) n- b- R
55.jpg

* O. ^- G* V6 {
接着,使用【-fwupgrade】命令升级FUS。由于现在芯片里有老的FUS,因此firstinstall参数是0。在命令行窗口可以看到升级过程中的log信息。
3 w4 k2 u$ G) d
66.jpg

! i3 M0 B1 t9 S6 \" g
FUS新版下载好了之后,再读一下当前版本,是1.0.2了。OK
  f$ R( C4 {: J6 |  U+ ^
77.jpg

/ ^  `  ]' @% r  S* \& C  j$ X
FUS已经最新版本了,接下来就是下载通用最新版本的BLE stack了。经过几秒,BLE stack也下载好了。
+ f- l$ j0 P; @, T* E# E6 c6 V
88.jpg
6 i7 `; p& f2 t
再次读取一下FUS和BLE stack的版本,分别已经是1.0.2和1.2.0了,符合预期。
现在,USBDongle板子里的FUS和BLE stack都是STM32CubeWB固件包里最新版了,我们在把它恢复成用户flash启动之前,先继续使用当前的DFU模式,来把STM32CubeWB固件包里的TransparentVCP例程下载进去,稍后做BLE空中升级时会用到。最后,才把USB dongle板子的SW2开关拨回到“0”的位置,这样,之后,板子上电就会自动运行虚拟串口的透传功能了。
# X) }$ n  D: p. A' \+ S  c6 G! R) `
FUS

4 I. C# z1 ]7 H
什么是FUS · AN5185
+ O' ]( Z, D$ V8 p! D) o. s; m
99.jpg
# ^: D, E- @1 G0 w
实际操作体验告一段落,再演示第二种近程方式,即通过JTAG/SWD来更新FUS、RF stack之前,我们来正式看一下什么是FUS。
FUS,是firmwareupgrade service的简称,是一段跑在安全用户flash上的,由M0+内核运行的程序。所有和STM32WB新引入的安全功能,都要通过它来操作。比如安装或者升级,由ST签名加密过的FUS、RF stackimage;比如要存储和使用应用秘钥,所谓CKS, CTMkey service,都是通过FUS service暴露给M4内核的API来调用、执行的。关于应用key和客户key的使用,我们在下一期来讲。
% f& a7 d( m. m1 I  b' C
FUS目前有三个版本,一个STM32WB芯片出厂预烧好的,大家拿不到image的0.5.3版本;一个1.0.1和1.0.2版本,可以在STM32CubeWB固件包里可以拿到,这些随WB固件包一起更新并发布的image,都是被ST签名加密过的。
FUS 的版本及升级规则

7 T7 u6 G% O1 y
10.jpg

1 r, ^8 z6 S3 P7 l4 A: |
1.0.1版本的FUS,是在STM32CubeWB固件包1.1.0中发布的,它适用于1M flash的WB芯片,即STM32WB4xG。
支持256K flash和512Kflash的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的提示。
! h3 ^; @( `' R, u" ^  d* p$ I
FUS · RF Stack

- l  m3 D! G9 [& ]. d
FUS 和 RF Stack 的位置

% I. D; u( O' U' t7 N
111.jpg
: r: m( ]* `% X6 G! T" ~; i
FUS 和 Rf stack都是由M0+运行,且都运行在安全用户闪存区域,即图中两根虚线之间的位置。它们和用户的应用程序都一样存放在用户flash,但是占据着由Secure option byte(安全选项字节)指定的地址开始的高段空间。高段空间的尾部,是ST预留的和安全feature相关的预留地,不能动,因此如果FUS或者RF stack的新版本尺寸比以前大了,会把上面那根虚线继续往上抬,即挤压用户应用程序的空间,然后secure option byte的值也会被自动修改。

0 m" v$ d2 n. [
通过SWD更新

( {4 x  h$ H. l. [" T- G
通过SWD更新Nucleo板的FUS、RF Stack

5 m& p# A3 M- }5 f
222.jpg

) Z" q( l' C. A7 G/ E3 [- d; H8 C% W
现在来看第二种进程更新FUS和RFstack的方式,通过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两个批处理即可。
3 c+ z' Z5 M8 W& n; |: C
这个方法的原理是,使用STLINK-Utility的命令行,通过SWD接口,把一段叫做FUS_Operator的代码下载用户flash开始处,再把对应要升级的FUS或者RF stack的image下到用户flash稍后的地方,启动FUS operator运行。FUS operator检查到约定好的用户flash‘地址处有 image 待升级,就调用FUS的API,来把image进行验签和解密,然后烧写。

2 S8 X4 q: X' X( R4 D% R, M; {+ U
目前ST官网上还没有公开对应代码,大家可以找ST的代理或者FAE索要试用。好消息是:今年底之前,会把这个功能集成到STM32CubeProgrammer里,先是命令行支持,随后会是GUI支持。多说一句,关于STM32 PC端的工具,大趋势是:STM32CubeProgrammer会替换掉之前的Flash loader、DFUSe,STLINK-utility、STVP等功能。
/ Q" w4 l: J) B* s8 C$ g+ S5 m
再次检验当前版本

6 A; _* m; E2 D! w! v
333.jpg
' M9 V5 r5 _3 r# d7 K
用同样的方式,读出当前Nucleo板子上的FUS和BLE stack版本,分别是1.0.1和1.1.0,符合预期。

1 i( U! b% @; a% K2 p0 }
本期小结
近程升级FUS、RF Stack的小结

8 V4 p0 ]! m& |+ ~
444.jpg
6 C6 R% b, A$ x/ g6 |4 O, V& {
现在回顾一下,刚才分别对STM32WB套件中两个板子,通过USB接口,一步一步输命令;通过JTAG/SWD调试接口,执行批处理文件,升级了芯片的FUS、和BLEstack版本。USBDongle板的版本一步到位,并且也烧录好了TransparentVCP例程。
0 M' s8 c/ {) H- z/ D, E) N# `) G

) I' u% o6 b6 X+ n* b
大家回想,体会一下,会发现,其上这两种方式本质是一样的,都是跑了一段程序,去调用FUS的API,然后FUS把已经放在用户flash用户区域的image,拿来验签、解密、烧写。不同的仅仅是一个通过usb接口,和系统bootloader里的代码交互,一条命令一条命令的执行;一个是通过jtag调试接口,把代码一口气下到用户flash,一口气跑完,所谓批处理。

. g) e7 \% n3 J  R- \8 d% a. P4 R
7 m" B8 t& t/ {3 ]3 P4 ^
; C% [, y% G+ l5 v; k
赞 收藏 评论2 发布时间:2020-5-27 11:09

举报

2个回答
李康1202 回答时间:2020-5-29 08:42:47
顶一下
蒙奇_超 回答时间:2020-7-25 20:08:47
牛掰plus

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版