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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:15
01协处理器模式概述
! @/ \7 f7 T  n( X, TBlueNRG 系列芯片从最早的一代 BlueNRG-MS 开始就支持协处理器模式。在协处理器模式下,BLE 功能在 BlueNRG 芯片端完成,应用部分在 MCU 端完成。与 AT 指令的模式类似,协处理器方式也具有高内聚、低耦合的特点,但相比于 AT 指令模式,协处理器方式更为强大灵活,而且还兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。
' j. W6 @9 T, q
* [2 W% E% b* {6 w0 k! zBlueNRG 系列的所有芯片都支持协处理器模式。在使用协处理器时,BlueNRG 需要烧录一个 DTM 固件。DTM 原本是指 Direct Test Mode,而 ST 在这个固件的功能上进行了扩充。除了用于 RF 测试(包括 RF 发射功率、接收灵敏度、频偏、谐波等方面的测试),BlueNRG 的 DTM 固件还可以用于协处理器模式。 . E, R' u" r6 w: E% @

% I) E6 x8 u" \BlueNRG GUI 工具是一个针对 BlueNRG 芯片协处理器应用的工具。在使用协处理器时,协处理器可以搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。 $ e! r0 q( ?) v7 x
/ `$ t4 `# A) B( I: Q( q
如下图所示,官方协处理器资料可以通过 SDK 中文档 index.html 进行索引。! C- s) W6 C; Q, m, [; o; g# I

* b5 f% L- ^5 E( ^
微信图片_20240118181351.jpg

" [0 [6 X$ j! Q5 Q
图1.BlueNRG 端协处理器官方资料
) _' x$ r( d$ W9 c3 ~: h2 e6 e7 D
% O5 C. A# a0 J* \* x( E
; C- b( I+ E# ]; W
02协处理器软件分层
5 G- s7 G! w) mBlueNRG GUI 工具的使用属于一个 BlueNRG 芯片协处理器的应用。   n" h# [4 M$ ]3 f! Z
% B! j# m- M3 Z- W1 L$ ^/ i
协处理器可以搭配任意带UART或者 SPI 的 MCU、MPU 或者 PC 端使用。 8 D: H6 M$ |7 ]  F" |
2 R8 d- u% a! J2 t: k$ m& w0 p9 e2 W
软件框架如下图所示。协处理器模式有两种分层。6 ?7 }7 R: F- `5 y5 t
• [处理器] APP <------------> [BlueNRG] (Host+Controller)
. ?) U; F+ [9 C• [处理器](APP+Host) <------------> [BlueNRG] (Controller)6 Y7 u- V9 m$ n

+ b9 {, I! P/ H1 W/ v3 o+ M) D; T: b
微信图片_20240118181348.jpg

; [; Z* L3 P) E
图2.协处理器软件框架

6 l" b" e0 b4 T$ h# k6 g) S! \

% q) D4 |- n: ~$ Z# [% Y4 K大部分应用会采用第一种方式,对应用处理器或者 MCU 只需要关注应用部分,这种方式,处理器和 MCU 之间是通过 ACI 指令进行交互,ACI 是 HCI 指令的扩展。 8 g% A6 a; E- @) F6 K& u
. L/ K# H. i& z& `5 l
第二种方式,BlueNRG 系列运行 Controller 部分,MCU 或者处理器 Host 层协议和应用,使用的场景比较少,双方之间通过 HCI 经行交互。BlueNRG 系列如果需要使用这种方式的协议栈,则编译 DTM 固件的时候,则需要在 Preprocessor Symbols 中使能“LL_ONLY”宏。
* [3 [& }  e& L( e9 ^
3 T0 v: [, ~7 A* {( G9 @9 n03ACI 指令格式
7 Q( `/ O- M! s( `: k- EBluetooth LE 协议栈 ACI 指令利用并扩展了标准 HCI 数据格式。8 X' y; r  F3 y. a% a
9 x8 z  l, J9 z' X5 a  p) B* e
微信图片_20240118181344.jpg

% F0 r; q( C- C+ j' ^0 s, p
图3.HCI 指令格式
8 Q. p7 ]. }- F" Y! J. v
% \# l( T$ n% I1 r! Q( e
根据 Bluetooth 核心规范,标准 HCI 数据包可以是以下几种类型:! e$ y" p  _: w/ @4 t3 E
• HCI 命令数据包(数据包类型:0x01)
* L& h8 l% m6 k- C6 T: a• HCI ACL 数据包(数据包类型:0x02)6 r: Y4 y: O: _
• HCI 同步数据包(数据包类型:0x03)3 t: }, W3 r5 j1 k
• HCI 事件数据包(数据包类型:0x04)
( `1 Q/ q  Z+ t9 {* p• HCI 扩展命令(数据包类型:0x81)+ M# g# K4 n2 B& l& w
• HCI 扩展事件(数据包类型:0x82)
; {6 L! A* e+ |" b
9 K8 x9 [: ^$ Q; r/ }8 M4 ~/ I) T7 v详细的数据包格式可以通过如下方式详细查看:
6 I: b0 M8 J( J+ H& ?5 w2 |
+ _6 U( o  \$ s+ d: O- }打开 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.
. X/ T; s" g  ]0 u% P4 Q" o
3 O  n5 s( R% X4 A2 l
了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。
' a' O( }; Z# v4 ~6 p- H+ ?9 P: q1 P- Q" ?% A: Y
详细的其他协处理器资料可以通过 SDK 中 index.html 中的如下章节进行查找。' b+ T7 g0 y4 `* Q

9 q9 g6 m  U8 N; i: E  N3 d04DTM 相关的工程介绍
- @' o- C8 u( u$ ^5 T$ T. q% QBlueNRG SDK 中提供了很多个不同的 DTM 的工程,用户难以分辨。
$ j5 j! o* G. Q8 ~( T: K- z
/ `* n; j2 `& }' u5 H为了简化,绝大部分应用,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。
9 ]1 n( Y% U8 d, f6 I
8 X" ^' v2 Y5 j4 X: M8 N
微信图片_20240118181341.jpg
& }- C) C$ x) D- y, ^
图4.BlueNRG DTM 相关的工程
. M! t$ y( P! B# M

$ P5 W9 _* C  I其中 SDK 中包含的工程如下 :
; W2 F# K* [" C, \• DTM: // DTM 是 Full Stack! Q) Q$ A! n; G! S1 @
• DTM_basic: // DTM 配置为 Basic stack
2 J' b9 @5 N* W2 p• DTM_Updater: // 带 boot 程序 DTM 的 boot 源码工程% x6 N' r: j3 j7 ]
* }& v- o! u. s( y0 E
其中 DTM 工程和 DTM_basic 工程是实现 DTM 功能的工程,他们之间的差别主要是一个默认是 Full stack,另一个默认为 Basic stack。而 DTM_Updater 只是一个 DTM 的 boot 源码工程。
, I# g2 k9 Q( _0 |9 a5 _
5 h/ f- `9 A$ ~% S7 k. W打开 DTM 或者 DTM_basic 工程可以看到如下不同工程配置:' K  G/ w( f7 h4 i/ A" C: v& b
• UART: DTM 使用 UART 接口(不包含升级代码). l5 o# X6 C" n4 D# h7 J2 `. ]
• UART_WITH_UPDATERTM 使用 UART 接口,DTM 在 Flash 的第一页中包含 DTM_Updater .并且包含 DTM 功能。
7 d2 u/ h% I- B  U• UART_FOR_UPDATER: DTM 使用 UART 接口,DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件,包含 DTM 功能。+ d  Y1 v0 s1 z5 P2 B
• SPI: DTM 使用 SPI 接口(不包含升级代码); _7 U3 n2 t% V/ I7 o3 x
• SPI_WITH_UPDATER: DTM 使用 SPI 接口,DTM 在 Flash 的第一页中包含DTM_Updater .并且包含 DTM 功能。5 @4 U, k* \; N) ?1 j! D; P
• SPI_FOR_UPDATER: DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件。包含 DTM 功能。
! A$ f1 m$ o% |% @5 s7 y6 c5 Y" C$ o* L# A( R0 Y3 c5 V8 n  Q
其中分两大类通信方式,一类是 UART,一类是 SPI。其中 UART 通信方式的第一个“UART”工程配置是单纯的 DTM,使用 UART 通信接口和其他 MCU 或者 MPU 通信作为协处理器功能的代码。而“UART_WITH_UPDATER”工程配置包含了两个程序,其中一个是将 DTM_Updater 工程编译的二进制代码放置编译在数组中,作为启动代码;另外一个程序就是 DTM 程序偏移一定位置的代码。“UART_FOR_UPDATER”工程配置只有一个程序,即 DTM 程序配置偏移了一定位置的代码,它和“DTM”工程配置的差别仅仅是代码偏移不同,实际内容一样。
4 G- q) a: {- y: m; E% F
4 i4 x& A0 [# o% t2 V( `05基于 STM32CubeMX 软件包的协处理器模式( B5 L% P9 d" b" ~# k! g
基于 STM32CubeMX 软件包支持协处理器的有以下几个:
, M& c5 _" t5 {4 H. Z$ ?$ q2 P5 D& a9 O7 q, g% e0 i
微信图片_20240118181338.jpg

4 l$ l3 Y' |# d7 a/ J* G
图5.STM32CubeMX 中的软件包
8 _9 q3 S8 l' R' H: F

! B2 G! m6 S* M( w. o  M$ c# ~

# x! Q. N8 \1 p" {# z2 i$ ^" m
详细的软件配置涉及步骤比较多. o8 D1 L# ^, O
: \" @6 |/ @, A9 v* W# r/ O% F
或者参考官方的帮助文档,如下图右下边的文档。
7 A6 d  }0 O/ }* g* D9 o
! Z! k9 `6 x2 K% Y! m, O
微信图片_20240118181335.jpg

( j& n8 O- K5 h  M' z
图6.X-CUBE-BLE2 软件配置

" T0 D/ [3 E  Y2 M% G/ g2 Q
. f7 r- B- N: Z: ~) x

8 h5 }" X' q+ e8 p( L" ~! e/ n06基于源码移植的协处理器模式1 N: s/ j5 ~; B2 C
如果使用的另外一端的 MCU 并非是 STM32,或者一些 ST 官方还没有适配的型号(如 BlueNRG-LPS)则需要移植协处理器模式源码到 MCU 上。需要移植如下代码:( d9 ~" \, s1 i4 C" E' l/ |

! [( ~$ D" E5 n
微信图片_20240118181332.jpg

- }0 j. _! M0 ~' w, [
图7.非 STM32 使用 BlueNRG 协处理器需要移植的代码
/ g1 c$ \+ R2 x. k0 O

( Y0 N& b( J+ s; t& V. o移植后上去后,需要适配。适配主要是实现 SPI 或者串口初始化部分的代码以及实现这个函数:% c% \" }/ p' Y, m
# N& G5 K6 Q# |% J* h
微信图片_20240118181328.jpg
2 g0 G  w2 i( x. \. W
: e6 P: p7 @8 i( v
可以参考 BlueNRG SDK 工程下协处理器相关的例子:
5 P8 n: U/ S: \5 ^- {BlueNRG-LP/LPS: BlueNRG-LP_LPS_LPF DK x.x.x\Projects\External_Micro0 U! u+ l: W" c' q+ u  U
BlueNRG-1/2: BlueNRG-1_2 DK x.x.x\Project\STM32L4 ], J+ @; {: ^2 L
' v2 \. t  z8 c1 w0 L
07应用处理器(MCU)端软件处理主框架+ N# q' [& F  D4 T8 O1 f1 n
主要处理流程分为两大类:
1 J2 e$ M9 l" y• MCU 或者处理器主动发送数据
6 u! t1 M4 d2 Q7 D. [6 t4 y& S) }4 X• BlueNRG 主动发送数据 % J! x9 ^, e- `2 ^

  e. N) B! ^! T; F5 L% L3 o; gMCU 或者处理器主动发送数据的流程是这样的:当应用端主动调用 aci_xxxx 等函数时,这些函数的处理是同步超时的。最后会调用"hci_send_req()"函数,在这个函数中,会先发送数据到 BlueNRG 端,然后在 while(1)循环中带超时的等待,以查看hciReadPktRxQueue 队列中是否有数据收到。当 BlueNRG 返回数据给应用处理器端(MCU)时,会通过 IO 中断,最后触发调用“hci_tl_lowlevel_isr()”函数。在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。整个执行 aci_xxxx 等函数的过程是同步执行的,直到超时还没有读取到数据放入队列中。 - d. N' y* ]$ h

1 e2 G) F4 m9 E0 q2 ?# ]BlueNRG 主动发送数据的流程如下:当 BlueNRG 发生一些事件,例如蓝牙连接上了设备,这时 BlueNRG 会拉相应的 IO 口,通过应用处理器的外部中断通知应用处理器端(MCU)。这会触发调用“hci_tl_lowlevel_isr()”函数,在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。然后在主循环处理函数“hci_user_evt_proc()”中,会解析接收队列中的函数。最后,如果成功解析,则会触发对应的 xxx_event 事件。这里的 xxx_event 事件如果应用没有定义,则默认执行一个弱定义的空函数。如果应用程序定义了,则执行用户定义的函数。
+ o; v6 w% m  q8 r5 K# y9 M+ S: U! z. c0 U# h$ x! C& @
08交互时序图
- \- Z, Z( J' e# @0 L下文分别描述通过串口和 SPI 交互时的时序图。了解双方通信的时序,有助于理解双发睡眠和唤醒,以及在定位问题时能够更快速准确定位分析问题。
/ f8 u8 Y8 ]  x# p8 S
7 S1 y) _6 r" D; M8.1. UART接口交互时序图1 h3 w% {3 ~) w( e' b7 t" E: X
使用UART接口进行交互时,时序图如下所示:( P3 q0 b% ?% p  Z* h7 @
5 d, K( d* P! [- U& o
微信图片_20240118181325.jpg

; @# X+ e; B  `4 ]5 Y
图8.串口方式交互时序图

% V5 ~' X4 s9 n9 J3 T
0 U% b; r  }! n- F8 E+ O% f
上图时 MCU 主动发送 ACI 指令流程,分为以下几个步骤:! h, O- M3 W( E/ ?" Z$ R
• MCU 发送数据% R( o8 P9 A& ~6 @2 [5 a
    o 1:MCU 唤醒 BlueNRG 芯片* o* s' b& j4 O2 |! W) D; n
    o 2:BlueNRG 芯片被唤醒完成$ C% }4 j1 [: ^
    o 3:MCU 通过串口发送数据
6 p+ k* K- D4 ~$ i5 S8 l0 J           ▪ 如果流控允许( ]$ s( x% T+ @1 W) x2 E1 i
    o 4:MCU 发送完毕数据释放 MCU_RTS3 H6 \) q% `( G8 n; H, X
    o 5:BlueNRG 芯片允许进入睡眠
: ?( J! J2 i8 l8 Z& [+ i•BlueNRG 发送数据9 ^4 Q; W8 z6 v5 \/ l; l6 x3 C
    o A: BlueNRG 唤醒 MCU
' `! M+ ]* |7 F* g- M0 a    o B: MCU 被唤醒% I0 b  w- ]) |; i! H# B( D" f
    o C: BlueNRG 通过串口发送数据
! Q6 ]4 U3 r. O- ^9 U        ▪ 如果串口流控允许
' F! U7 n1 `0 t+ w9 h    o D: BlueNRG 发送完数据释放 MCU_CTS
/ b' f; l2 x) R' W    o E: MCU 允许进入睡眠
' R  Z6 o) w/ h$ x. S: n: h! A5 F
4 T' ^# ?$ O7 d' e" h7 L8.2. SPI 接口操作时序图
6 @( @0 i2 P4 l3 O' B' s0 C- J
SPI 时序图官方文档中描述比较详细,建议查看官方的文档(在 SDK 的帮助文档index.html 中)。8 Q3 d) a) e6 g7 Q% M9 R8 |0 `

: a  A7 C7 Y/ v) m5 z+ _3 P/ F% l
微信图片_20240118181321.jpg

  A- f8 e. H% Z" C( d* Y. A- i" d$ e
图9.协处理器 SPI 通信协议

1 }0 E- n" T7 G4 U( `% c

1 g) a  ^( @' h1 @* w. o' p5 Z
$ B1 m2 H& ]) ^7 v( U- d' k2 _/ C6 G7 t
09小结) z5 m7 k+ S. C- \# m( C5 ^( D
本文介绍了 BlueNRG 系列芯片的协处理器模式、软件分层、ACI 指令格式以及 DTM相关的工程。BlueNRG 芯片的协处理器模式与 AT 指令模式类似,但更为强大灵活,同时兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。BlueNRG 系列的所有芯片都支持协处理器模式,且可搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。在软件框架方面,协处理器模式有两种分层,大部分应用采用第一种方式,对应用处理器或 MCU只需要关注应用部分,处理器和 MCU 之间通过 ACI 指令进行交互。了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。在 DTM 相关的工程介绍方面,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。/ U# K" h" n2 ]3 c  x, k  @
" M& N2 h9 K/ I
转载自: STM32单片机
. S+ i/ ~, g  ^( [+ y如有侵权请联系删除
) b! j& V# O/ K& P$ |( c
9 y# ?+ C- k) @: B) K. s

) b' y; y/ v  p# Z- u* j* [
! P. C! _+ [( g- a" d  Z
收藏 评论0 发布时间:2024-1-18 18:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版