STMCU小助手
发布时间:2024-1-18 18:15
|
01协处理器模式概述 BlueNRG 系列芯片从最早的一代 BlueNRG-MS 开始就支持协处理器模式。在协处理器模式下,BLE 功能在 BlueNRG 芯片端完成,应用部分在 MCU 端完成。与 AT 指令的模式类似,协处理器方式也具有高内聚、低耦合的特点,但相比于 AT 指令模式,协处理器方式更为强大灵活,而且还兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。 ' x/ R* P1 ], M+ A BlueNRG 系列的所有芯片都支持协处理器模式。在使用协处理器时,BlueNRG 需要烧录一个 DTM 固件。DTM 原本是指 Direct Test Mode,而 ST 在这个固件的功能上进行了扩充。除了用于 RF 测试(包括 RF 发射功率、接收灵敏度、频偏、谐波等方面的测试),BlueNRG 的 DTM 固件还可以用于协处理器模式。 5 z; u8 B7 a) N+ U( B1 m BlueNRG GUI 工具是一个针对 BlueNRG 芯片协处理器应用的工具。在使用协处理器时,协处理器可以搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。 如下图所示,官方协处理器资料可以通过 SDK 中文档 index.html 进行索引。5 }1 V) u; W1 i! n; }) X6 T2 n 2 z: L. K$ G- y) H9 R7 t
图1.BlueNRG 端协处理器官方资料 ; _, K6 ~" q% w6 r: B, B3 e02协处理器软件分层: }2 L, G' h/ I BlueNRG GUI 工具的使用属于一个 BlueNRG 芯片协处理器的应用。 协处理器可以搭配任意带UART或者 SPI 的 MCU、MPU 或者 PC 端使用。 + B9 } p9 R( U& L" _, _ 软件框架如下图所示。协处理器模式有两种分层。 • [处理器] APP <------------> [BlueNRG] (Host+Controller) • [处理器](APP+Host) <------------> [BlueNRG] (Controller)
图2.协处理器软件框架 大部分应用会采用第一种方式,对应用处理器或者 MCU 只需要关注应用部分,这种方式,处理器和 MCU 之间是通过 ACI 指令进行交互,ACI 是 HCI 指令的扩展。 * e) e8 Y* f. T, Y 1 T4 Y: K, Z' ?4 p' R4 N3 h# Q 第二种方式,BlueNRG 系列运行 Controller 部分,MCU 或者处理器 Host 层协议和应用,使用的场景比较少,双方之间通过 HCI 经行交互。BlueNRG 系列如果需要使用这种方式的协议栈,则编译 DTM 固件的时候,则需要在 Preprocessor Symbols 中使能“LL_ONLY”宏。& B) S0 r6 v% C/ X# i# X. x : S9 X, s7 E" U! ] 03ACI 指令格式. J# r; R' n5 e1 q( G3 L \( T Bluetooth LE 协议栈 ACI 指令利用并扩展了标准 HCI 数据格式。 : o# K# b, [ R2 N" C5 s5 I
图3.HCI 指令格式 ; j% i( ~1 \7 c# D0 W, _# L% A2 I M! c2 E" q1 H# {- {6 ^$ g 根据 Bluetooth 核心规范,标准 HCI 数据包可以是以下几种类型:) \" P; W) y- @/ d; l) C • HCI 命令数据包(数据包类型:0x01): O; P" b) n" L0 B8 m# i • HCI ACL 数据包(数据包类型:0x02) • HCI 同步数据包(数据包类型:0x03) • HCI 事件数据包(数据包类型:0x04) • HCI 扩展命令(数据包类型:0x81)& V' a, z9 M5 M! S • HCI 扩展事件(数据包类型:0x82)0 K4 J# g: \7 B; r ) q7 z7 C$ z$ ?4 | 详细的数据包格式可以通过如下方式详细查看: & q( }* l# v: i" [ 打开 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.# @8 b4 W; g m1 ]0 I7 X- X. ^ + v; `: d G3 {9 U; ~ 了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。 详细的其他协处理器资料可以通过 SDK 中 index.html 中的如下章节进行查找。 3 A+ ~$ h% N+ J 04DTM 相关的工程介绍 BlueNRG SDK 中提供了很多个不同的 DTM 的工程,用户难以分辨。 L1 j `# n. }' K j/ v+ ^/ f; ]8 T! x) j- b a 为了简化,绝大部分应用,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。) |. W |% M2 n 2 O% y2 H4 O8 _6 h. k
图4.BlueNRG DTM 相关的工程 其中 SDK 中包含的工程如下 : • DTM: // DTM 是 Full Stack • DTM_basic: // DTM 配置为 Basic stack; D' N/ d( f3 ] • DTM_Updater: // 带 boot 程序 DTM 的 boot 源码工程) Y" Q# O0 R% J) y j* _* f/ B! m. T1 S 其中 DTM 工程和 DTM_basic 工程是实现 DTM 功能的工程,他们之间的差别主要是一个默认是 Full stack,另一个默认为 Basic stack。而 DTM_Updater 只是一个 DTM 的 boot 源码工程。6 ?! K* ]4 Y0 d 打开 DTM 或者 DTM_basic 工程可以看到如下不同工程配置: • UART: DTM 使用 UART 接口(不包含升级代码) • UART_WITH_UPDATER TM 使用 UART 接口,DTM 在 Flash 的第一页中包含 DTM_Updater .并且包含 DTM 功能。9 x+ h, ^4 a. U. \/ R• UART_FOR_UPDATER: DTM 使用 UART 接口,DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件,包含 DTM 功能。 • SPI: DTM 使用 SPI 接口(不包含升级代码)/ u& a s) }4 A' R% w/ E; @ • SPI_WITH_UPDATER: DTM 使用 SPI 接口,DTM 在 Flash 的第一页中包含DTM_Updater .并且包含 DTM 功能。+ K, N: h; b' A- h7 k- C' B5 L' T • SPI_FOR_UPDATER: DTM 固件在 Flash 第一页中留空不填充 (偏移 0x2000). 用户制作升级固件。包含 DTM 功能。 6 [) R# x8 g+ b; U 其中分两大类通信方式,一类是 UART,一类是 SPI。其中 UART 通信方式的第一个“UART”工程配置是单纯的 DTM,使用 UART 通信接口和其他 MCU 或者 MPU 通信作为协处理器功能的代码。而“UART_WITH_UPDATER”工程配置包含了两个程序,其中一个是将 DTM_Updater 工程编译的二进制代码放置编译在数组中,作为启动代码;另外一个程序就是 DTM 程序偏移一定位置的代码。“UART_FOR_UPDATER”工程配置只有一个程序,即 DTM 程序配置偏移了一定位置的代码,它和“DTM”工程配置的差别仅仅是代码偏移不同,实际内容一样。 05基于 STM32CubeMX 软件包的协处理器模式) Q9 A2 A- ?9 [8 h* M 基于 STM32CubeMX 软件包支持协处理器的有以下几个:
图5.STM32CubeMX 中的软件包 ' C, F" n6 P# j- [7 u6 d( v详细的软件配置涉及步骤比较多) S% Y, j0 ^5 ?% j ^. @1 f 或者参考官方的帮助文档,如下图右下边的文档。
图6.X-CUBE-BLE2 软件配置 2 F$ l/ t3 `7 ^! g c2 a 06基于源码移植的协处理器模式 如果使用的另外一端的 MCU 并非是 STM32,或者一些 ST 官方还没有适配的型号(如 BlueNRG-LPS)则需要移植协处理器模式源码到 MCU 上。需要移植如下代码:
图7.非 STM32 使用 BlueNRG 协处理器需要移植的代码 ' R: b, D* r( u6 E" g/ \( l7 S; r* h. K5 f/ y 移植后上去后,需要适配。适配主要是实现 SPI 或者串口初始化部分的代码以及实现这个函数:: Q) ?2 i; n* A4 X# {5 e, ` 5 H% j, \ O7 U& P4 f6 o0 U
8 Y& c- H% z0 d( \+ Z( K 可以参考 BlueNRG SDK 工程下协处理器相关的例子:: W- M* P$ e: v8 w' o# b* j BlueNRG-LP/LPS: BlueNRG-LP_LPS_LPF DK x.x.x\Projects\External_Micro/ N+ P% o0 I" K- H* L BlueNRG-1/2: BlueNRG-1_2 DK x.x.x\Project\STM32L ) i% e) x- {- u8 n' v. P. D 07应用处理器(MCU)端软件处理主框架4 ^! p2 d6 h8 t, g( z8 a 主要处理流程分为两大类:) G. f. e) E5 T • MCU 或者处理器主动发送数据 • BlueNRG 主动发送数据 . Q) f! F2 `4 t& V% Z ; u0 b5 w1 T+ @ MCU 或者处理器主动发送数据的流程是这样的:当应用端主动调用 aci_xxxx 等函数时,这些函数的处理是同步超时的。最后会调用"hci_send_req()"函数,在这个函数中,会先发送数据到 BlueNRG 端,然后在 while(1)循环中带超时的等待,以查看hciReadPktRxQueue 队列中是否有数据收到。当 BlueNRG 返回数据给应用处理器端(MCU)时,会通过 IO 中断,最后触发调用“hci_tl_lowlevel_isr()”函数。在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。整个执行 aci_xxxx 等函数的过程是同步执行的,直到超时还没有读取到数据放入队列中。 - G( O3 e$ r8 n% l c0 q3 q . ?, h1 _! ]+ h% ?+ n BlueNRG 主动发送数据的流程如下:当 BlueNRG 发生一些事件,例如蓝牙连接上了设备,这时 BlueNRG 会拉相应的 IO 口,通过应用处理器的外部中断通知应用处理器端(MCU)。这会触发调用“hci_tl_lowlevel_isr()”函数,在这个函数中执行读取数据的操作。如果成功读取数据,将数据压入 hciReadPktRxQueue 队列中。然后在主循环处理函数“hci_user_evt_proc()”中,会解析接收队列中的函数。最后,如果成功解析,则会触发对应的 xxx_event 事件。这里的 xxx_event 事件如果应用没有定义,则默认执行一个弱定义的空函数。如果应用程序定义了,则执行用户定义的函数。 0 t6 }8 t% _) ^/ H5 r7 o 08交互时序图 下文分别描述通过串口和 SPI 交互时的时序图。了解双方通信的时序,有助于理解双发睡眠和唤醒,以及在定位问题时能够更快速准确定位分析问题。" L* C# ] \! H/ H8 f 5 }) N- W( l1 g M, x1 }0 d) Z 8.1. UART接口交互时序图 使用UART接口进行交互时,时序图如下所示:% v+ ]1 h$ H2 \: f( Z, |
图8.串口方式交互时序图 3 Q3 k& B9 e, U' p$ Y4 ` 上图时 MCU 主动发送 ACI 指令流程,分为以下几个步骤:$ J! }0 ^# H. h, ?% A3 r$ X3 M • MCU 发送数据 o 1:MCU 唤醒 BlueNRG 芯片' k+ s3 `% B/ t o 2:BlueNRG 芯片被唤醒完成# S6 ?6 v4 I2 r: H$ c( W$ n. r) b* e o 3:MCU 通过串口发送数据7 W. h% F1 W, C) t, R& Z ▪ 如果流控允许9 j2 r% }+ m; i% _: K$ j o 4:MCU 发送完毕数据释放 MCU_RTS! s; o, f# k! ~, f8 Z# H2 B* t o 5:BlueNRG 芯片允许进入睡眠 •BlueNRG 发送数据 o A: BlueNRG 唤醒 MCU! f6 V& F3 f1 ^% W# o$ {0 n- P o B: MCU 被唤醒 o C: BlueNRG 通过串口发送数据. l! o$ Q% H9 Q1 }" Z u# k ▪ 如果串口流控允许- b& o( b0 r% N- e1 A8 M o D: BlueNRG 发送完数据释放 MCU_CTS- @' a: ^3 z( P6 y: i/ Q! y o E: MCU 允许进入睡眠4 N3 s! {! s; \ 8.2. SPI 接口操作时序图4 v, P' o4 l1 H5 ]/ b' y SPI 时序图官方文档中描述比较详细,建议查看官方的文档(在 SDK 的帮助文档index.html 中)。
图9.协处理器 SPI 通信协议 09小结 本文介绍了 BlueNRG 系列芯片的协处理器模式、软件分层、ACI 指令格式以及 DTM相关的工程。BlueNRG 芯片的协处理器模式与 AT 指令模式类似,但更为强大灵活,同时兼顾了 MCU 间通信的睡眠和相互唤醒等方面的需求。BlueNRG 系列的所有芯片都支持协处理器模式,且可搭配任何带有串口或 SPI 接口的 MCU、MPU 或 PC 端使用。在软件框架方面,协处理器模式有两种分层,大部分应用采用第一种方式,对应用处理器或 MCU只需要关注应用部分,处理器和 MCU 之间通过 ACI 指令进行交互。了解 ACI 指令格式有助于在实际调试双通信部分时遇到问题时分析定位问题。在 DTM 相关的工程介绍方面,建议选择功能最齐全的 DTM 工程下,“UART_WITH_UPDATER”工程配置或者“SPI_WITH_UPDATER”工程配置。 转载自: STM32单片机 如有侵权请联系删除8 P; ]6 [* a! M + c' ]0 K) m/ B; O) j9 v |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版