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

基于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
0 L9 Y3 _6 u2 p! w0 x$ @) @- t
4 P" d( y7 |0 }0 _9 m5 n: c4 j

5 W% R, e' ], d/ a# o! z6 G
基于STM32WB的低功耗蓝牙应用(二)RF协议栈的有线和无线更新
8 @% T$ @6 c9 S( a% \
通过USB更新
- b  ?3 p0 Q0 I4 V+ X; d
通过USB更新USBDongle板的FUS、RF Stack
5 X+ i. {& d7 o* ~% _0 ]7 \
11.jpg

* E' H/ E2 |7 f" V# M$ p$ O4 E7 `9 ?
现在我们先使用第一种方式,即通过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里面可以查到。在本节视频,第七页 胶片的表格里有标注。

, |6 a- t: z8 K; s4 h, v8 W' D3 L, m
22.jpg

9 A* \6 O, z& C7 O% B5 Z
现在开始具体操作。USB dongle板子SW2开关拨到如图方向,连接到PC,STM32WB芯片从系统flash启动,开始运行系统bootloader了。它扫描到USB通信口上有信号,进入DFU模式,激活M0+内核让它开始运行,由此可以响应来自上位机PC的STM32CubeProgrammer发出的命令。
1 W( j2 P3 m+ W6 O2 Q/ H- Q+ _; [
33.jpg
& C$ l& }( @% [& s4 w
通过-fwdelete命令,删除USBDongle板子上预装的0.5.1版本的BLE stack。

' o: @. F( x  I3 q
44.jpg
3 }+ w" X2 q- S* o. i) S
刚才为了一次多读几个信息值,从内存 0x2003 0024开始读取出来50个字节;现在我们只要查一下FUS版本,直接读读内存 0x2003 0030处的值即可,0.5.3;
+ P# _4 r  [4 u8 X0 B0 J
55.jpg

% r% b5 i: f- g4 u) c
接着,使用【-fwupgrade】命令升级FUS。由于现在芯片里有老的FUS,因此firstinstall参数是0。在命令行窗口可以看到升级过程中的log信息。

. L4 W/ H: Y2 B- T# k1 [
66.jpg
( A4 H6 u/ K9 {% N, K
FUS新版下载好了之后,再读一下当前版本,是1.0.2了。OK

; n& e5 I+ t( [+ g* C% J* h
77.jpg
7 v* ~, v- P4 G3 ?: ]
FUS已经最新版本了,接下来就是下载通用最新版本的BLE stack了。经过几秒,BLE stack也下载好了。

" n  |5 k7 _# i- S
88.jpg

. M+ v- p6 n4 A* P) G1 f
再次读取一下FUS和BLE stack的版本,分别已经是1.0.2和1.2.0了,符合预期。
现在,USBDongle板子里的FUS和BLE stack都是STM32CubeWB固件包里最新版了,我们在把它恢复成用户flash启动之前,先继续使用当前的DFU模式,来把STM32CubeWB固件包里的TransparentVCP例程下载进去,稍后做BLE空中升级时会用到。最后,才把USB dongle板子的SW2开关拨回到“0”的位置,这样,之后,板子上电就会自动运行虚拟串口的透传功能了。
. t( r7 l4 p) W7 s9 ?  R
FUS

' a: e* P' m4 N) V% s' E$ k0 x
什么是FUS · AN5185

, H. }) w' K4 }- j1 P' G, u7 m1 O, V
99.jpg
; [* u2 @* `# ?0 P9 G4 q3 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的使用,我们在下一期来讲。
) W" o3 U5 @( N/ Q/ s1 P" S
FUS目前有三个版本,一个STM32WB芯片出厂预烧好的,大家拿不到image的0.5.3版本;一个1.0.1和1.0.2版本,可以在STM32CubeWB固件包里可以拿到,这些随WB固件包一起更新并发布的image,都是被ST签名加密过的。
FUS 的版本及升级规则
; h; F4 }1 y7 l" w+ [2 c
10.jpg
5 S  {4 H2 q5 I" f& e, V
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的提示。

8 q/ T7 X% t! [0 f: S* P" }
FUS · RF Stack

. I) g- ^, ^0 V0 I2 J& U
FUS 和 RF Stack 的位置
! t1 R2 [! \; @2 d, y, G3 I
111.jpg
2 Q0 E- S- u; j. \2 [
FUS 和 Rf stack都是由M0+运行,且都运行在安全用户闪存区域,即图中两根虚线之间的位置。它们和用户的应用程序都一样存放在用户flash,但是占据着由Secure option byte(安全选项字节)指定的地址开始的高段空间。高段空间的尾部,是ST预留的和安全feature相关的预留地,不能动,因此如果FUS或者RF stack的新版本尺寸比以前大了,会把上面那根虚线继续往上抬,即挤压用户应用程序的空间,然后secure option byte的值也会被自动修改。

5 y5 i+ e6 O* y8 k2 g2 b/ h
通过SWD更新
% M7 f% g( g0 K/ f
通过SWD更新Nucleo板的FUS、RF Stack
' J3 Q, P; ~* s5 N$ @$ U+ v2 t1 y+ G
222.jpg

' J; G) M9 P. @5 Z! u- n
现在来看第二种进程更新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两个批处理即可。

# d* I7 G8 Z1 I5 m
这个方法的原理是,使用STLINK-Utility的命令行,通过SWD接口,把一段叫做FUS_Operator的代码下载用户flash开始处,再把对应要升级的FUS或者RF stack的image下到用户flash稍后的地方,启动FUS operator运行。FUS operator检查到约定好的用户flash‘地址处有 image 待升级,就调用FUS的API,来把image进行验签和解密,然后烧写。
7 H) g) y: k0 G/ [  v& `- F
目前ST官网上还没有公开对应代码,大家可以找ST的代理或者FAE索要试用。好消息是:今年底之前,会把这个功能集成到STM32CubeProgrammer里,先是命令行支持,随后会是GUI支持。多说一句,关于STM32 PC端的工具,大趋势是:STM32CubeProgrammer会替换掉之前的Flash loader、DFUSe,STLINK-utility、STVP等功能。
5 X# B; U- H7 l  W+ e# f5 W9 {3 v
再次检验当前版本
! T3 [$ ?- G: V  |# Y; V- k! c
333.jpg
- [: r% V" Z( Z! j  [
用同样的方式,读出当前Nucleo板子上的FUS和BLE stack版本,分别是1.0.1和1.1.0,符合预期。
* h6 _0 P3 F2 {$ p; ~- [5 U" }
本期小结
近程升级FUS、RF Stack的小结

- W$ k1 b2 S% Y1 O* R
444.jpg
; n+ e; }& L! z, k) x& {
现在回顾一下,刚才分别对STM32WB套件中两个板子,通过USB接口,一步一步输命令;通过JTAG/SWD调试接口,执行批处理文件,升级了芯片的FUS、和BLEstack版本。USBDongle板的版本一步到位,并且也烧录好了TransparentVCP例程。
0 X0 Y2 O2 R$ j
- j4 {: }2 V, y1 t' q( U: [
大家回想,体会一下,会发现,其上这两种方式本质是一样的,都是跑了一段程序,去调用FUS的API,然后FUS把已经放在用户flash用户区域的image,拿来验签、解密、烧写。不同的仅仅是一个通过usb接口,和系统bootloader里的代码交互,一条命令一条命令的执行;一个是通过jtag调试接口,把代码一口气下到用户flash,一口气跑完,所谓批处理。

& G+ _& w% U6 I0 |; z% [6 c

: ?$ I3 k$ }: J7 _" K) l! {" x2 {2 z0 [1 J/ I" r9 {
收藏 评论2 发布时间:2020-5-27 11:09

举报

2个回答
李康1202 回答时间:2020-5-29 08:42:47
顶一下
蒙奇_超 回答时间:2020-7-25 20:08:47
牛掰plus
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版