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

基于STM32 快速入门 BlueNRG SDK 固件开发

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言; T  O  C' ]! i8 y2 |# D* Y0 b
本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。 / a& [" B: w' z9 b  @, A& S, F7 l

4 w4 G1 h. i. x* a! E本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。
5 V5 Z2 a* X  Y+ H# d  I
3 b( i2 l4 N  g, I02SDK 目录
4 }4 M! I" o% Y% D4 i! c从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:
! j8 Z- o+ |; F; g0 y
7 W+ @5 Y6 [- T6 C' J

& p% q* C, E% b; r1 X. Q+ m
微信图片_20240118183417.jpg

# N; m  A$ ]3 g+ N/ K
图1.SDK 目录

4 L# U0 |1 s( L" J; E

+ X  y+ s& f. N: ^
& |7 k  [. s' T8 E, I8 `
各个目录的功能说明见表 1:
- p  i0 t0 \! ^
微信图片_20240118183414.jpg
: u7 C$ q4 A2 K% j; w: v6 ~& H
表1. SDK 目录说明
1 j7 b! z% V( ?" n5 b& o& o1 \3 e) J
& G+ w: \5 u; s% i: b
BlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:
1 @# i" _( d1 o7 Y/ ~1 i! F1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。( |! D; b8 y1 y0 K' @4 C2 p$ H

. z6 g5 E# ?& ]2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM)
1 i) ], S& n. \( H6 x% t
9 L/ r8 K- A* [% i3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。
$ U8 u$ ]( p$ l
( h7 C0 \9 D3 i) V0 c1 [& }9 Y03SDK 例程" b* \* ^; Y+ J( m' N
SDK Projects 目录包含了以下三类例程:; |3 V) e& ^! X/ y
1. Periph_Examples:包含了芯片外设驱动例程。) {/ y; m7 W6 q$ D5 ^
2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。
5 o" L7 x) u% G, h2 i* ^' E3 g3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:! M9 l3 a% [) m+ h! d
, Y: x) k- U1 n7 U
微信图片_20240118183404.jpg

+ P9 H( ~$ j, b$ F: j4 _  q: ~
表2. BLE 例程说明
1 g; _" p8 u( t1 e4 q+ @

- p$ q2 ?5 E9 K
04快速实现用户固件功能% K0 p: A1 J+ _
本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。
$ S: y' `! |' V% a4 e! C5 |6 a. Z. ^
在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:/ o  e/ e, T* N, h5 C7 F
1. BLE 从机功能,包含以下配置:; z+ t3 T9 i$ K& a+ f$ U
    a. 一个服务,一个特征,特征具备 Write、Notify 属性
8 O+ w" g* o# {    b. 设备广播名为“Hello”
0 v- A" S5 Z8 M8 A; s. h2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据
7 o( d- B; J+ M( E3. 自定义协议,实现以下功能:
& H$ M2 {) {/ X1 y/ j" R    a. 控制 LED 亮灭4 }6 b7 `# |; T$ j9 h# X
    b. 定时 1s 上传心跳包,内容为连接后的秒计数值
% J1 x; b$ m% H4 k$ ?# ]' v    c. 每次按键上传按键事件通知/ q% H: J9 R* L! l9 c2 R9 h
/ W+ X" f5 }4 z- K( T
基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。: s1 S# z! F; D, `. d! Y0 d# ~

2 R; _+ X4 p$ \# ~$ D4.1. 验证原始工程$ d$ h4 W1 J3 u. b5 v8 u' ~) A3 |
在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:
7 \( l9 e% }  t* u+ T, W# p! f5 T' x- }
微信图片_20240118183358.jpg
2 q( e6 N  m6 o, d% t
图2.用户工程目录
4 t( r) r5 Q+ Y9 A
5 _. `9 m4 |- [: `/ l: V8 |
打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:' G1 V: b2 K% |% D6 u0 Y
4 ?7 {' i0 A% w3 [9 ~% m
微信图片_20240118183350.jpg

! n7 j( w' X" Q( ~' {+ ~: Q
图3.Browse Information

$ C/ ]# p; a7 c' m# ?/ i
: I2 P/ O" }" E) u6 m
微信图片_20240118183346.jpg
2 t/ A# _8 T2 s9 h
图4.选中 Server 工程配置
' x7 U! V! W! n' L- A$ C

2 V& `. O6 L# G% G编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:
) y. }# s7 P( c, w# L' k, i$ Y! v+ X& `
微信图片_20240118183336.jpg
; C- w5 k4 U" s: n# x
图5.BLE_SerialPort 工程 LOG 信息

" O0 z; {- z( l& Z' S3 q

+ D7 q; c/ i3 |使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:
; L" a8 h" ?% ^" o' F8 f. L% q1 {( [2 r2 _% S
微信图片_20240118183330.jpg
! B* `# U* p+ H! Z, ?8 g( N
图6.STBLE Toolbox 扫描页面
6 b( Y7 a; p8 _1 a  G

0 _* B4 n2 \5 @' g) d至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。" u) Q7 ?- E" K, j
  W0 T) J3 |* I; s' {7 i2 U9 C
4.2. 配置 BLE 从机功能5 u$ x# d: Y2 A3 l# `- x
原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:
- Z5 V8 ]1 U) p) u" P' t* @. Z7 y5 u
1 z7 _, y+ F# g% Z6 Z6 X
微信图片_20240118183325.jpg
- Q' U' h2 ~+ {5 r; r3 T
图7.特征 UUID

) {8 x: p# h& z
! i9 b8 s- k8 I1 n% K) J
协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。
3 Y1 ]6 v8 P0 K5 s7 ~
+ O" g2 Y, `! s
微信图片_20240118183320.jpg
3 Y( A/ C: ?6 H: ?
图8.定义特征

  w9 H7 g$ D) R' A6 K& h1 O$ s% J
6 I4 ~+ d5 ?  n4 u3 h
5 N) s: M* m% }1 F( }
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:/ ^/ `& N" R( m( |/ C; c+ J  M
1 `0 n3 r. N# b9 g
微信图片_20240118183230.jpg
! [+ X" z6 f: X2 D3 F; ]
图9.特征声明赋值给服务声明
; [* c5 ]' \& a8 v. Q6 ^

, {: d$ S7 I& X4 P: h/ ?) ]8 `, m上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。
7 W1 p9 W; z+ ?3 ~. C
: R! T) T, _6 W: ]$ s% |$ r首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 10" f8 v4 u% L9 p
( Z) E. L: @2 W
微信图片_20240118183226.jpg
1 U1 z7 N) O* @) _& {+ x, c; l
图10. 句柄

! ?4 x) i& U- C# T5 B" v0 b

; N$ \8 `7 o9 k然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。8 `) q: d- ^5 z$ H/ \4 P* I) t3 Z

. p7 q  u; l8 P1 i
微信图片_20240118183220.jpg
( ?: y* \3 ]6 H+ O6 j
图11. 获取句柄

3 l/ W1 S; M! \; Y( t
/ [+ g! P% X; ?9 U
至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。9 @* W. S0 I6 b" w

) ?" P0 L7 H+ W! J% l% A接下来修改蓝牙地址,并修改广播名,见图 12:
' c# s( M8 R  C$ Z; J( Y
2 Q8 u% U7 Z( H( k' m$ T& f7 O* D
微信图片_20240118183215.jpg

5 L6 ^' v( ]* O6 H; V% p- Z  q5 G" p
图12. 蓝牙地址和广播名

% f% g: _4 E# s$ p$ e% H7 B" f
8 d3 \* h8 i2 j
广播名的长度改变后,应注意指定其长度:
, V! O# X1 ^$ E/ V( w' ?: p! }& y0 X8 c6 T; O: E/ o5 S  D% O
微信图片_20240118183210.jpg

& P! E, u6 K: B: l# m, `- w; q& f
图13. 广播名长度
; c1 b7 ?! V0 U0 |3 R; k2 g" D3 B
, m) V8 Z  B  v) C6 V
LOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:
1 u9 @0 ^* _; L' t9 P5 D- ^* Z9 z0 [; s
微信图片_20240118183206.jpg

0 A1 A* v+ A- Q* M+ z
图14. 设备名

, g$ ~9 h& r- O7 M: z
4 P+ i  B8 R. D7 F4 H7 D

$ F: c2 v' |4 j' [- _+ H+ y- g" F
微信图片_20240118183202.jpg

; e9 _7 q0 w; A3 b! N6 N& ?
图15. 设置设备名

; Y1 O) v& R3 l1 P8 q. o" e

( D% ]" \  R0 \" C至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。8 A$ H! X+ m! v( q1 O

) L! `% {2 V5 r1 \1 r3 Y% @8 o4.3.和手机进行通讯
2 e( [& Y! `7 R% p( z上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:' W) o! ]" [. n
. n" e6 l/ T! y5 M: r0 R- g
全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :
& z  z. F$ k: \: k8 \+ B
1 A  {& J% o$ f: G7 \, O
微信图片_20240118183158.jpg

9 y" a0 {6 C0 y- E; D+ E
图16. 发送 Notify
7 B2 i5 Z% m+ @  B2 @

  c2 r9 P; E8 C0 F: y手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:
% @. Q8 \5 S0 S9 W  L$ K1 `. \: M3 K  a1 y0 e7 ^
微信图片_20240118183153.jpg
3 {- [2 i9 S0 \+ y& j
图17. 使能订阅回调

) |5 q$ J: q1 y
& Q$ R' M+ o/ |) l0 m+ [" H$ c
添加新的特征句柄全局变量声明,注释掉旧的:
: U+ t! O5 F3 ~( K
5 ^8 m& d- O, [8 l. i! K
微信图片_20240118183150.jpg

( K( k! c' j$ r% E
图18. 句柄声明

6 R: \2 E" \; p& A
+ I* ^2 ?; Y  M0 @
' r, S! ]' j4 T$ }7 ~
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:. h- S+ N/ S+ @3 W% D

2 A" a+ A8 W: P" [
微信图片_20240118182724.jpg

$ x! ]0 C. S. y, L$ y
图19. 数据接收回调函数
! \/ l; c' m, j0 x; }& D

6 N: a; M4 j# r至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:
' Z! u6 D% k3 T; I, t/ d% j
) f7 ~8 m3 v5 C" D4 n/ l5 u
微信图片_20240118182720.jpg
% F5 y* c1 D! T' ~  y* \2 w# q
图20. 用户接收 BLE 数据
) R  J8 d7 r. U  l8 t& z. R
8 j( u$ K3 m( G

7 @2 o" \6 I0 C, ]6 |
关于发送数据,原始工程实现了以下处理流程:
  b) _" W2 O5 ~; ?+ a1. 从串口接收数据
; H1 i; P* {! h/ a2. 解析数据为命令并缓存这些命令- |( R8 E. x- f! G2 s
3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去
6 \4 V7 M' |8 ]) f/ b
8 @5 B$ o5 J/ n3 @9 E8 K该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 21
( f$ I! F& o6 s; i  |0 V2 [% d- Q) {
微信图片_20240118182717.jpg

. k1 D$ ]' A  b; f* G- \
图21. 取消原有的数据处理流程

* z# ]/ Q% G" N7 U

" J$ o( q; l+ W( ]* U& L" f然后设计自己的发送函数,见图 22:
4 ^* K# E% D% e
; W3 V0 g, U1 _6 Y% X
微信图片_20240118182714.jpg
$ t+ t; }( x0 E" f" Y
图22. 自定义 BLE 数据发送函数

! _# N. n9 y1 \* j4 l4 P
9 _; \% b& S5 O' d+ s8 O
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:
& P/ B* [8 B% q2 f1 ^• Data_Received()接口接收数据
/ h4 I' y% A- \! P0 X( U. j• user_send_data_over_ble()接口发送数据+ X( X+ d& S! j% e
! ]* \5 _( o+ N2 c- O, d
4.4.添加其它功能% q. E5 O" w4 o
根据任务要求,我们还需实现下面三个功能:
- S9 F0 d5 T: W' {3 o4 F4 M' s1. 控制 LED 亮灭( D5 U* h; l, T1 l& f
2. 定时 1s 上传心跳包,内容为连接后的秒计数值
% \- x- @; v9 F( I3. 每次按键上传按键事件通知下面开始逐个实现:
9 m( e, X  u% }+ r. x7 c
; q; T& j+ D" ^# _1 P0 n
4.4.1. 控制 LED 亮灭7 F; N% _  z7 m) }. D+ r# {
首先,实现 LED 亮灭处理函数,
5 W7 P3 i0 G2 p7 J6 q/ l$ e/ X  i7 O" K
微信图片_20240118182711.jpg

$ w* ^" k  Y& K9 @4 k3 b( ?
图23. LED 命令处理函数
0 e* ^! w7 [  X" W: Q! R
$ H- o4 I# N+ {5 O8 A* M
将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。0 _, k% C& f) C1 s- p8 L
4 N3 D" h1 H1 B
微信图片_20240118182708.jpg

( X+ c. V8 e/ y
图24. 接收数据后进行 LED 命令处理

+ b9 T3 `! `2 d  e5 r
" Q$ J! b  S0 x
4.4.2. 每秒上传心跳包0 e/ }" P' W( P( m. t
首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:
! K" v9 R: s  y/ H5 V' g
. j% Z$ u" u9 b
微信图片_20240118182705.jpg

9 Z; s! r0 \3 f% W
图25. 心跳上传处理

6 |2 L2 [2 H9 ~& v
0 s) X- W  j+ F4 J
将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:
8 \1 l# ?( @- s, |; @
$ W& N9 N% e; p2 p8 c; \' \% ?
微信图片_20240118182702.jpg
" c9 p1 J8 O) ~% B% K
图26. 心跳处理
( y3 E! A7 N8 }' X
0 ^* |( v7 D+ h- j$ X5 j! p

" _) z  s0 L- g% C6 S  t
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。
4 i- C* W* K2 D
3 I5 c* _: c) m- f9 l: Q首先,实例化一个定时器,并定义超时回调函数:: S+ t; k' `; G

, y; x" f, S" M4 M+ J( C4 t
微信图片_20240118182658.jpg
, r7 n" U3 v3 h
图27. 软件定时器实例化
6 i% w; i5 \/ w' T1 C8 F

0 f4 r1 g5 G; |7 }然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。
7 i  K3 Q; T& L$ R0 a3 [9 D# H( S% R: k& U( K
微信图片_20240118182655.jpg
  [7 a/ e0 f. A; \* q4 [
图28. 启动定时器
) ?" m2 {: K; A/ T

( g6 z) k6 f0 C4 y  |4.4.3. 上传按键事件; r& ?* ]; f1 V1 N
首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:
0 K- s/ d* q6 M; }. J. Q% Y2 ^1 R/ W
微信图片_20240118182652.jpg

$ S" O" o/ z5 ^# g9 Q  B- x
图29. 按键回调

6 B# S( p! n; C
7 z5 s5 H8 d+ I/ G% N( h, o" I( H
按键中断服务函数中调用:4 a1 n. q' w" X

# |+ w& p' P* [3 q9 g  x0 W
微信图片_20240118182648.jpg

! @1 d2 u- g$ W# F: W. ]
图30. 按键中断服务函数

8 |: _# \3 S9 B! [& M
- \+ |3 H& D; A; X8 `" M( Q/ J
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。
' J1 F+ Y1 }, b$ D" b0 g3 h
. A4 {( g, J: b" |% f: q1 z4.5验证功能- O2 a, s' X5 F+ x
用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。
1 u7 i: u/ n/ V8 }3 s+ G) b6 U, M! t8 D+ a; f
微信图片_20240118182644.jpg

0 h$ ^/ O4 Z* q9 a
图31. 用户工程广播名
. S$ t' C/ h4 }
& d7 _+ ~+ t8 J/ n
连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:6 [! J" s  B- G/ S* F! `

! x2 b# e( A" i+ b$ i
微信图片_20240118182641.jpg

  W; L$ i. Q9 I; v1 ~; D2 T  g
图32. 使能订阅

" f3 j# U5 `& I7 l! Q0 g# q; P

+ [, O( W1 R2 w' I5 C: l6 M通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:' j4 E2 c; }8 f9 ~# e+ m' d" I; x. D

  k$ J7 o( b, v" I5 E6 ^+ V
微信图片_20240118182637.jpg

; G* c' k; T# {3 ~+ N& Z6 H% F
图33. 用户工程 LOG

5 I* P% s/ u- Y

/ K4 c; x; ?7 J5 m1 Q$ f- t05小结
3 S, t& a+ j, D" Y; A' }3 g+ R( \! v跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:
  n0 P, H1 ^  i
  a0 t7 T% l5 \' X8 f' m( c
微信图片_20240118182634.jpg

9 B% Z+ Q& C2 t/ X1 i2 ]
图34. 软件层次架构

, X  ]  W, S+ P4 p( x* y
% b% U- U+ b6 X# ^7 M6 |$ w& k$ B1 }
- s' V: B/ p$ G  J" T
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:
% D; l, T) C/ m
. q( q: {$ n+ N. Q" U; ^$ o+ Z9 Z
微信图片_20240118182631.jpg

' [2 E8 ?1 c7 N8 t  M
图35. 用户层文件
7 r: U5 d- P& |& \! {% H

' f" h# C1 T7 B9 q5 _这些文件的含义是:  B2 _. q' {+ h. P! p% j0 S
• serial_port.c,用户应用逻辑的实现$ G' W0 ^7 p" b
• BLE_SerialPort_main.c,程序入口,程序主流程7 U; O" H; J. v. Y1 Q& j  E' e% E
• gatt_db.c,BLE GATT 层功能的实现
/ @' T1 b7 ^5 u• rf_device_it.c,存放所有的中断服务函数
" a' ?- i4 I) }2 r1 E3 ^9 k- W" J1 |& K! e$ c
上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:
. P3 @) b1 J0 f0 V/ r/ {& u. [; T0 Z; @! s; Y% _
微信图片_20240118182628.jpg
5 C2 _5 ?% T2 P. }) K

* e3 }7 \8 e% s* ?# X
8 q3 ]$ k8 J7 @. `7 q1 p& C, V
图36. 系统流程
9 Q& ?1 n* [; P& c* Y
* H7 H: f, t/ b: |0 d
BlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。9 V) V  D4 U/ G
. c# K% g+ D% ?- @/ ~2 h

; {6 O) U2 @/ ?$ f转载自: STM32单片机
; K9 T0 b% ?3 k! {* }4 F如有侵权请联系删除
8 n2 p8 V' g. Z: w3 ^' e% r9 Q: I) M
# ?. G2 t3 h' T
# P0 N' ^5 S- x8 w' c

) U1 {$ y+ C6 r3 \1 I. ^
收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似分享

官网相关资源

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