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

基于STM32的BlueNRG 系列协处理器简介经验分享

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:15
01协处理器模式概述/ s, @; h+ ~2 d9 v& j
BlueNRG 系列芯片从最早的一代 BlueNRG-MS 开始就支持协处理器模式。在协处理器模式下,BLE 功能在 BlueNRG 芯片端完成,应用部分在 MCU 端完成。与 AT 指令的模式类似,协处理器方式也具有高内聚、低耦合的特点,但相比于 AT 指令模式,协处理器方式更为强大灵活,而且还兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。
! h! L9 u; D5 K% W/ z
1 b+ Z* h& d  ]5 x/ U, Q+ IBlueNRG 系列的所有芯片都支持协处理器模式。在使用协处理器时,BlueNRG 需要烧录一个 DTM 固件。DTM 原本是指 Direct Test Mode,而 ST 在这个固件的功能上进行了扩充。除了用于 RF 测试(包括 RF 发射功率、接收灵敏度、频偏、谐波等方面的测试),BlueNRG 的 DTM 固件还可以用于协处理器模式。
) @4 w! K4 s0 d: b, m* \0 z
3 p/ F& }6 K* r! A" a) c3 VBlueNRG GUI 工具是一个针对 BlueNRG 芯片协处理器应用的工具。在使用协处理器时,协处理器可以搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。
. y/ ?4 ^4 r9 h1 ~+ Y$ S2 p: P3 k5 V, M7 p3 ^
如下图所示,官方协处理器资料可以通过 SDK 中文档 index.html 进行索引。* C$ J0 U! U1 v  {

/ c- {# G0 @6 q" f$ U) ^8 Z; Q
微信图片_20240118181351.jpg

, x/ Z& R  B4 O1 g' L# {  `
图1.BlueNRG 端协处理器官方资料
. n" k4 Q% `+ P
' G- h5 \5 Z0 Q; L& p8 c8 L! G- {& F
! o8 B% H* X" Z: K0 X! b, z
02协处理器软件分层" B# N5 I0 _, _$ @' T. X% d0 ?
BlueNRG GUI 工具的使用属于一个 BlueNRG 芯片协处理器的应用。 5 F0 i: Y# m( D) A

. R; J$ k$ g, B9 |4 R& h: p协处理器可以搭配任意带UART或者 SPI 的 MCU、MPU 或者 PC 端使用。
  R& n7 X* O) G9 G  \: j2 D$ U% l2 h6 i
软件框架如下图所示。协处理器模式有两种分层。# ^: @$ I. z* {9 g& a. |
• [处理器] APP <------------> [BlueNRG] (Host+Controller)9 u3 n1 |. o/ H  s
• [处理器](APP+Host) <------------> [BlueNRG] (Controller)- e4 {: R4 ]- G/ Z, P! G

5 x) k6 g- `. T7 d' \' u
微信图片_20240118181348.jpg

& ^( E, l2 @" f' n. k! d6 I
图2.协处理器软件框架

& L* y9 u3 G5 ^4 R1 I9 p
! _% e' A( U. k' z
大部分应用会采用第一种方式,对应用处理器或者 MCU 只需要关注应用部分,这种方式,处理器和 MCU 之间是通过 ACI 指令进行交互,ACI 是 HCI 指令的扩展。
& K+ l& O) m; P# s
7 T/ ?' X6 Z1 A: p% l4 d" }) s& M第二种方式,BlueNRG 系列运行 Controller 部分,MCU 或者处理器 Host 层协议和应用,使用的场景比较少,双方之间通过 HCI 经行交互。BlueNRG 系列如果需要使用这种方式的协议栈,则编译 DTM 固件的时候,则需要在 Preprocessor Symbols 中使能“LL_ONLY”宏。
  Z9 y# t) u9 X" n- `0 m. w2 r" \! T, P0 ]0 ]( ?8 M
03ACI 指令格式
+ O* m. V% B8 JBluetooth LE 协议栈 ACI 指令利用并扩展了标准 HCI 数据格式。
* Z! y. R# A& l
# x, j2 u& |2 ^) j: c
微信图片_20240118181344.jpg
. w" d' `6 t& H0 [& U
图3.HCI 指令格式

4 o; r2 \7 h' M* @8 x
  O' K) A; R& k1 L0 ]
根据 Bluetooth 核心规范,标准 HCI 数据包可以是以下几种类型:* k* j' s' Y/ m9 g
• HCI 命令数据包(数据包类型:0x01)
" v2 ?( Q% J* ^+ H; C• HCI ACL 数据包(数据包类型:0x02)
( L4 {! V+ k7 X8 a  q  T5 ]( A• HCI 同步数据包(数据包类型:0x03)1 ^& D) V6 m) `
• HCI 事件数据包(数据包类型:0x04); w7 ^: M% F! j) m
• HCI 扩展命令(数据包类型:0x81)6 k/ P1 W+ i% C( p
• HCI 扩展事件(数据包类型:0x82)
* j& n9 c+ \. ]! o* b1 [9 e0 g: s; Q; z; x& g
详细的数据包格式可以通过如下方式详细查看: 5 d9 K/ x5 A7 g8 l* X6 t0 O

1 P6 f7 c9 b/ t* ]. e( [, B打开 BlueNRG-LP 或者 BlueNRG-LPS SDK 中 index.html ------->Network Coprocessor (UART, SPI mode)章节中的 Bluetooth LE stack v3.x ACI Data format -----------> Bluetooth LE stack v3.x ACI commands data format.
3 }) Z4 N2 G% V+ L8 F% o" l
2 e; N+ Y% ~+ v/ {; w2 s: S1 _
了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。 $ a- w4 w7 n! \7 K% E2 X0 p1 \) a, l

- \, @0 |9 W4 l# v8 H: m; u/ v8 B详细的其他协处理器资料可以通过 SDK 中 index.html 中的如下章节进行查找。
5 X3 u8 y' f, t, d
! n# X5 F! C4 z2 K
04DTM 相关的工程介绍
5 |  }, S2 {0 |7 ?. c) KBlueNRG SDK 中提供了很多个不同的 DTM 的工程,用户难以分辨。
! X# h& |% h6 K8 M9 I# z" e& y" V" |" s" R1 G- _
为了简化,绝大部分应用,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。
! N% h  |( V: ~- F2 o

$ u' h3 f! v5 t4 r. f
微信图片_20240118181341.jpg
3 {* N6 V( k& o0 }* B
图4.BlueNRG DTM 相关的工程

# S& s) `& `) w5 j0 c

! _/ f* `; ?1 Y9 r' f* x其中 SDK 中包含的工程如下 :
) Z. J  }5 I9 a2 v1 p; T' u• DTM: // DTM 是 Full Stack
( E, w: _. K. \8 d• DTM_basic: // DTM 配置为 Basic stack
. c! @. F6 R4 }/ D) d• DTM_Updater: // 带 boot 程序 DTM 的 boot 源码工程: l6 ?- I. n6 p

8 R! w5 `( G' p9 z其中 DTM 工程和 DTM_basic 工程是实现 DTM 功能的工程,他们之间的差别主要是一个默认是 Full stack,另一个默认为 Basic stack。而 DTM_Updater 只是一个 DTM 的 boot 源码工程。
% _9 Z/ ^( q) h% p9 Y# ~1 {" @# a4 T% \9 l3 |
打开 DTM 或者 DTM_basic 工程可以看到如下不同工程配置:% F6 ]% e' k9 r  R
• UART: DTM 使用 UART 接口(不包含升级代码)
8 W8 q/ H) u5 C% i' O& f5 l+ H• UART_WITH_UPDATERTM 使用 UART 接口,DTM 在 Flash 的第一页中包含 DTM_Updater .并且包含 DTM 功能。
  M0 |  Y( `/ d• UART_FOR_UPDATER: DTM 使用 UART 接口,DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件,包含 DTM 功能。
$ _$ ~+ B1 c7 f7 h1 w, \8 n! L• SPI: DTM 使用 SPI 接口(不包含升级代码)
5 r1 ^0 \  Q. g) u6 t5 T1 h• SPI_WITH_UPDATER: DTM 使用 SPI 接口,DTM 在 Flash 的第一页中包含DTM_Updater .并且包含 DTM 功能。
4 S) J, P- p9 J0 A: r8 ?# _• SPI_FOR_UPDATER: DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件。包含 DTM 功能。  G9 Z) ^) J& E/ i: U- G3 U, E
6 p: g9 Y, g( d6 j
其中分两大类通信方式,一类是 UART,一类是 SPI。其中 UART 通信方式的第一个“UART”工程配置是单纯的 DTM,使用 UART 通信接口和其他 MCU 或者 MPU 通信作为协处理器功能的代码。而“UART_WITH_UPDATER”工程配置包含了两个程序,其中一个是将 DTM_Updater 工程编译的二进制代码放置编译在数组中,作为启动代码;另外一个程序就是 DTM 程序偏移一定位置的代码。“UART_FOR_UPDATER”工程配置只有一个程序,即 DTM 程序配置偏移了一定位置的代码,它和“DTM”工程配置的差别仅仅是代码偏移不同,实际内容一样。
+ d" w$ k3 V, G2 R7 l  u; A: O; _
6 U" g# G2 X- C$ D8 U/ x4 z05基于 STM32CubeMX 软件包的协处理器模式# ^% @7 I0 k8 y9 y5 r/ b! G
基于 STM32CubeMX 软件包支持协处理器的有以下几个:. M+ B  Q( p, o0 Q

, V- W( o2 }% U! Y
微信图片_20240118181338.jpg
* M6 `$ P8 A- t2 Y
图5.STM32CubeMX 中的软件包
/ P; D$ p3 C' U/ ]

/ ?. G! M- ~& H/ c# f, ]2 m1 I( Y) [6 S

: u& X: q% w4 e4 X: [
详细的软件配置涉及步骤比较多2 n: ?% I4 S) _. B( N% Y

! X3 `) i  C, ]或者参考官方的帮助文档,如下图右下边的文档。
' W5 }$ `) j' f. h4 G, M* j6 x9 {7 V, _. N8 T- v+ ?7 ]2 d
微信图片_20240118181335.jpg
) [4 X2 P8 e) q2 x: o- b+ D& N, U& X
图6.X-CUBE-BLE2 软件配置
1 Z/ s( j+ _4 R) D3 ?

/ p) T  \. w" G

2 S! \2 w9 f% U# t) y06基于源码移植的协处理器模式
+ B) Q$ M6 a" e( L6 f如果使用的另外一端的 MCU 并非是 STM32,或者一些 ST 官方还没有适配的型号(如 BlueNRG-LPS)则需要移植协处理器模式源码到 MCU 上。需要移植如下代码:
" U  L$ P3 `5 b3 s) i$ P+ e7 @
) H6 T7 x' X. j" A5 b* d
微信图片_20240118181332.jpg

1 U: W' P5 P  d
图7.非 STM32 使用 BlueNRG 协处理器需要移植的代码
9 |  h- A- T7 t- [, s

  ~; m2 n6 S+ [/ q8 ~. c1 C: M/ A移植后上去后,需要适配。适配主要是实现 SPI 或者串口初始化部分的代码以及实现这个函数:
# X( I5 J1 k1 G  Y+ n- h4 a+ `
9 b  _  @  w# Z5 x+ Z: T
微信图片_20240118181328.jpg 9 D7 K$ Z2 K0 H, {+ y
: t% h. A) N' u( P2 H
可以参考 BlueNRG SDK 工程下协处理器相关的例子:
9 i' `! K; f% T$ v1 ?$ yBlueNRG-LP/LPS: BlueNRG-LP_LPS_LPF DK x.x.x\Projects\External_Micro
! R! N0 }- |& B# Z) o7 }" ~BlueNRG-1/2: BlueNRG-1_2 DK x.x.x\Project\STM32L
5 j2 d0 v, ~: W/ `/ _. P+ W7 j% j( K* N# |9 _
07应用处理器(MCU)端软件处理主框架, _6 }, Q. @. }; F- G" x( E) y
主要处理流程分为两大类:
0 d  K# F: K8 W• MCU 或者处理器主动发送数据
* J- A5 h& `9 A' b6 N5 I( P" @• BlueNRG 主动发送数据
3 B) ^/ S; K: C& r+ c
2 b1 Q' h( K" U6 bMCU 或者处理器主动发送数据的流程是这样的:当应用端主动调用 aci_xxxx 等函数时,这些函数的处理是同步超时的。最后会调用"hci_send_req()"函数,在这个函数中,会先发送数据到 BlueNRG 端,然后在 while(1)循环中带超时的等待,以查看hciReadPktRxQueue 队列中是否有数据收到。当 BlueNRG 返回数据给应用处理器端(MCU)时,会通过 IO 中断,最后触发调用“hci_tl_lowlevel_isr()”函数。在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。整个执行 aci_xxxx 等函数的过程是同步执行的,直到超时还没有读取到数据放入队列中。
7 d* N  R# [; g) z+ F3 L  l% E) b6 L5 Y8 E3 r9 |( c& f
BlueNRG 主动发送数据的流程如下:当 BlueNRG 发生一些事件,例如蓝牙连接上了设备,这时 BlueNRG 会拉相应的 IO 口,通过应用处理器的外部中断通知应用处理器端(MCU)。这会触发调用“hci_tl_lowlevel_isr()”函数,在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。然后在主循环处理函数“hci_user_evt_proc()”中,会解析接收队列中的函数。最后,如果成功解析,则会触发对应的 xxx_event 事件。这里的 xxx_event 事件如果应用没有定义,则默认执行一个弱定义的空函数。如果应用程序定义了,则执行用户定义的函数。
5 c  b- O, q; C: @. t( c4 u4 {7 H* k
08交互时序图% m* }: r# Q1 n/ J9 o" A8 v
下文分别描述通过串口和 SPI 交互时的时序图。了解双方通信的时序,有助于理解双发睡眠和唤醒,以及在定位问题时能够更快速准确定位分析问题。* L  P- A& \) J; @+ a
6 w0 l1 q$ R4 b! K8 C5 X
8.1. UART接口交互时序图" U0 |% ]: c3 b
使用UART接口进行交互时,时序图如下所示:
/ @- A4 f/ v. [0 a
0 ?- ^/ E) H: m6 |1 D
微信图片_20240118181325.jpg

& P9 e  ]7 M) M
图8.串口方式交互时序图
+ C/ o; h( q' v3 C* P

  q4 P3 o$ a9 l& q0 w9 K/ K6 r上图时 MCU 主动发送 ACI 指令流程,分为以下几个步骤:' g5 n+ U; A0 I0 u& b
• MCU 发送数据
, U' e( p0 h+ I; ~/ z- e    o 1:MCU 唤醒 BlueNRG 芯片7 O, c  K3 t4 S6 z" f2 W
    o 2:BlueNRG 芯片被唤醒完成6 j5 ^1 J! V# R8 @5 Z1 N* L' n( X
    o 3:MCU 通过串口发送数据
- l$ w) \& m0 k$ E* P% \/ t, O           ▪ 如果流控允许
2 H* q7 h; t+ O    o 4:MCU 发送完毕数据释放 MCU_RTS
- i; }  N% u7 S0 ~+ o    o 5:BlueNRG 芯片允许进入睡眠
4 K( \" Z& J# C3 P" R* M, F; R1 K8 w•BlueNRG 发送数据
/ i" R1 J& o4 Y  h4 G3 x    o A: BlueNRG 唤醒 MCU" M# m3 A0 w9 Z8 J
    o B: MCU 被唤醒
" Y; F/ z5 h' _  B: f    o C: BlueNRG 通过串口发送数据  [2 b+ B/ S& r
        ▪ 如果串口流控允许9 I! `" T& V8 X" [' ]. l8 a: q
    o D: BlueNRG 发送完数据释放 MCU_CTS1 _0 e6 a- k% [3 o4 x6 Q, _
    o E: MCU 允许进入睡眠% s/ t; K  N$ d' p, ]+ U" x. t
& Y! ^9 s9 B0 o$ ^
8.2. SPI 接口操作时序图
: i( i& }- v4 Q5 f' ?5 I- v5 k' L
SPI 时序图官方文档中描述比较详细,建议查看官方的文档(在 SDK 的帮助文档index.html 中)。$ }! U# t" B% p" K* J9 L

* c% ?$ }* M; v7 ]9 K0 b
微信图片_20240118181321.jpg

9 W* k; H4 m4 ?0 J  W, S/ p
图9.协处理器 SPI 通信协议
) W. I, x2 b9 q$ E7 H) q
/ O6 g" ?4 d- o( L+ Z0 c& B
% D/ j$ B* G% n' J5 J2 s& w
09小结  ^( h  \1 k! z  _; p$ _
本文介绍了 BlueNRG 系列芯片的协处理器模式、软件分层、ACI 指令格式以及 DTM相关的工程。BlueNRG 芯片的协处理器模式与 AT 指令模式类似,但更为强大灵活,同时兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。BlueNRG 系列的所有芯片都支持协处理器模式,且可搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。在软件框架方面,协处理器模式有两种分层,大部分应用采用第一种方式,对应用处理器或 MCU只需要关注应用部分,处理器和 MCU 之间通过 ACI 指令进行交互。了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。在 DTM 相关的工程介绍方面,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。: K: z+ Q. R% ^3 P
; K, g3 W' |) X" @2 e2 q% h+ O
转载自: STM32单片机" D; M+ ^; S8 b6 M& i" f
如有侵权请联系删除3 i8 i. N! p1 k5 b$ _% m
. k$ b/ g' ~% J) A- Z
; f3 h1 I* O# |/ O3 J2 R* u2 r6 F

; D8 o; v: F: u) S* ?+ T
收藏 评论0 发布时间:2024-1-18 18:15

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版