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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言1 O2 `  U$ A- k$ |
本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。
! w! o6 u8 ]; @4 j8 m, }9 N! f6 O4 `% K" N
本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。  G9 v" n3 G) [5 R5 \' W
% \2 Y0 h& L- E# ^
02SDK 目录
% L8 K7 u2 r2 c$ A! Z从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:
% m( s: Q1 E/ |2 s* S, i; c: r

; S, u* Q. a, y- g
微信图片_20240118183417.jpg
. j* f% ]5 m3 f  \& ~
图1.SDK 目录
2 E6 X% ~- Q9 X1 C$ ~

2 x, p: k/ T/ S: `8 X8 P

, H4 [: D) t) p& j2 f7 y: y各个目录的功能说明见表 1:# p6 F6 U9 ^. r7 ?2 H/ b& O3 ~+ F
微信图片_20240118183414.jpg
  ^) o3 \2 r/ O! K7 T
表1. SDK 目录说明

+ c: V* g0 C6 J
% K7 c0 r0 C, ?
BlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:
/ _1 O# u) o! F8 ~1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。
6 a& N( n) k% g8 J- a  B  g; L
" J7 h$ X% b2 c
2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM)
- [" ]6 |% F$ F& j( ~2 U$ P6 W, c: a+ J+ A; L: j
3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。5 a3 w( ?# `* q4 w! d3 x7 q
  i5 t4 m. L8 Z/ w0 r
03SDK 例程" [) T' l5 G$ F! Y. x
SDK Projects 目录包含了以下三类例程:( o- \2 h; J' @4 U$ y) ]3 X, B
1. Periph_Examples:包含了芯片外设驱动例程。
6 H9 m" d7 \' B/ j2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。8 C# W% I& t1 [8 }& H4 i6 J. v
3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:
4 x5 o3 K/ w, w1 |% c0 O
6 H  G5 l& X3 f
微信图片_20240118183404.jpg
& H, f' s/ Q& G5 g  I4 O9 ]
表2. BLE 例程说明

- R- p, z$ J$ [, G3 ~5 `4 z( B4 ~- n; [
  K. n" N$ Q$ p  u4 E) S
04快速实现用户固件功能9 {+ ?5 k$ z  s8 p8 `
本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。 $ d* |3 ?2 Q/ ]3 B$ G

' P& o/ P% x6 r0 @; g在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:1 t, q! e/ ~0 {1 J; u
1. BLE 从机功能,包含以下配置:
# X8 ^& k; U$ _. D) u' ]    a. 一个服务,一个特征,特征具备 Write、Notify 属性
+ U  r' A# ]) S$ L* \    b. 设备广播名为“Hello”
4 n6 a9 ], g+ d* j2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据
5 e, [: K- ^- L& A5 G" H7 [3. 自定义协议,实现以下功能:$ T+ Q6 b( z% m& D/ u% F
    a. 控制 LED 亮灭
* S  ]8 `( X  ~* E4 O    b. 定时 1s 上传心跳包,内容为连接后的秒计数值6 X) ?) ?( w" }: T0 Z0 C+ O, k
    c. 每次按键上传按键事件通知
; [3 v6 u  t4 j0 u7 p0 r: k( R+ c, J- V. ?6 U' |
基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。* V" D  E& Q7 q6 N' s

+ t1 m" W6 @6 w7 {4.1. 验证原始工程
% ~3 q8 {* e1 z6 ~  g/ ]0 S在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:& d, R' x8 m+ m& y# |, a2 C8 {

1 W/ ?- s! N% S8 f- j
微信图片_20240118183358.jpg

# `  m* g/ \( P# @) D
图2.用户工程目录

1 ~0 T: R6 A0 x. x0 ~5 w* a. ]' V: ~

3 p3 U1 S, e" q( R打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:
1 z# G2 j3 {2 m- t/ M
9 M/ K" d1 x8 t7 B9 w
微信图片_20240118183350.jpg
! R; h) m) H3 q7 L9 F6 m$ M
图3.Browse Information

$ F5 Z) O2 ~' x# \3 v3 K
& p' ~5 E1 u/ C7 p5 B% h* P
微信图片_20240118183346.jpg

2 L% z4 Y& P4 c6 r  ~
图4.选中 Server 工程配置

8 _% e1 ]% O# w

8 s' ]) O# L8 n1 k7 H$ ~编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:( j8 u% I0 g/ ?* T; w

, P5 F# |# c$ N/ S* C
微信图片_20240118183336.jpg
# F& F8 m3 |4 E
图5.BLE_SerialPort 工程 LOG 信息

" _! P! X$ W9 e! y/ _  a

7 u1 N3 Y: u( O8 s6 V- j+ e6 d使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:( ^. T) W0 @/ R' ?) E- q- L0 c+ T" ]4 \
2 d6 f& A9 e9 h, j0 }5 N
微信图片_20240118183330.jpg

' W! k7 \8 Z% I+ J/ V+ @. r
图6.STBLE Toolbox 扫描页面

% `% b4 L2 ~# j+ g" s6 n& I/ R
3 F/ c0 ^% ?9 a, g; N3 g: S  J
至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。
) i# y* V* n4 F6 K: L9 v& o
) i: j0 U+ X# c/ T3 c
4.2. 配置 BLE 从机功能, L. ~/ g& J7 S* X) v9 w
原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:
: [. X" g6 q0 U. _. ^# J% T. e9 O5 l# y  t& h* h% G6 e+ x
微信图片_20240118183325.jpg
! z9 u% o+ N  p* {/ D$ h
图7.特征 UUID
2 h9 z) a+ }9 C% v& Y7 M

. f- ^7 ?' M2 }: R6 D协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。; e: I: L, ^( {7 A
3 L4 u4 K* {% [3 p: Q# W" `2 }
微信图片_20240118183320.jpg

# t- Q' b! }7 e! g
图8.定义特征

( G" z% t$ ]5 S3 l
3 Z3 a) @+ |( o- C! c  ~
2 u" M8 m3 b8 E9 {$ T
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:# x0 n6 A/ Y7 t% i0 M3 f
: U; X0 x$ b4 c/ S
微信图片_20240118183230.jpg

( G0 Z5 |0 T# m, G
图9.特征声明赋值给服务声明
, U+ `  R8 a9 e8 E( k2 U

4 ?3 O! t" Y$ R8 @) O! f上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。 6 J' c& d0 \) r+ @9 _1 z& E

3 H) y  s3 s) T) Q. z$ j首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 10/ F4 |) H1 h( y
2 G$ U( g) z. B5 x
微信图片_20240118183226.jpg
* z4 B- {( u9 d3 a& m8 B
图10. 句柄

' ?2 K7 S( i6 A" ^
3 L2 }, _  \- e* y" t8 I7 A
然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。
% c" |9 S3 I) P% m& ?% c7 R
2 h" \1 u) g! g8 Y
微信图片_20240118183220.jpg
; ^$ H" n* h5 O& K( {
图11. 获取句柄

  G% |5 k) ~5 l: q$ N7 [! F

+ Y1 F* e* w7 ~4 d( h至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。2 L- `# w2 g7 D! T  D2 J

: `0 n2 @8 e) E% V接下来修改蓝牙地址,并修改广播名,见图 12:% t: c6 q1 p+ V2 `

$ {. Y% k1 Z! @  ]9 u$ N9 w* \
微信图片_20240118183215.jpg

4 ^9 p9 W0 Z6 ^# ]1 s1 x% w
图12. 蓝牙地址和广播名
9 N5 I2 n7 V2 ~
8 u  J) Z8 z0 ?& W
广播名的长度改变后,应注意指定其长度:
, M! n( C) a; X# @; ~2 e) c$ [) U) d! t( }1 s) N4 z9 @  j  s, K& E$ ^2 e/ J0 q" W$ w
微信图片_20240118183210.jpg

7 H! y  i" \7 C- m. O
图13. 广播名长度
8 Z) m! y7 \7 |( k% q( N0 _7 C

: c% F  A0 n' C$ yLOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:( U3 l& k: L8 q! t1 I! w; C
% T2 u" l9 \$ W$ I" l  V. O4 S: p* S+ F
微信图片_20240118183206.jpg

" R: r' e. B. g% [
图14. 设备名
; E+ ?6 `+ a5 x$ n, k8 o. M4 V
$ ~# a- g: T+ s/ S6 g

' J8 F/ \( s4 v5 ]  J& }7 l
微信图片_20240118183202.jpg

! w# B/ G8 w& g$ D; Y( x
图15. 设置设备名

2 r! p2 G) d+ d7 }
) t, q2 Q- K; O! N# x: }
至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。
( l0 ?" V% D" `0 }; l  T
7 N" c7 Y( g+ g& ]2 a4.3.和手机进行通讯9 u. p& A3 C' z6 `5 f( d: M
上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:: [% E1 _' [! C+ c1 J$ R

( ~' i+ H7 Z( G6 d" J全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :. @! y* W7 Q" C4 Q, Q. G
5 A( r$ i* _' j& b2 K( s; Y7 R
微信图片_20240118183158.jpg
  E4 I. g2 S9 N  J+ V1 N
图16. 发送 Notify

% r, `: X6 _3 x' H
+ |9 p# z& h6 t# q9 y* E/ Z* ^- o! v
手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:) h3 M+ K8 _7 M
: J) Y2 g3 m- Q4 d6 p$ m
微信图片_20240118183153.jpg

% a3 b1 P/ p  `- y" W6 s
图17. 使能订阅回调
8 v6 [4 y6 ^- P% Z; M. s

& ^. h. w' {; R( T6 a- Z添加新的特征句柄全局变量声明,注释掉旧的:
5 V" D# h: d; b: d! b) j% c# P
微信图片_20240118183150.jpg

3 `: m, A5 U) R% D3 ^, T, B' m
图18. 句柄声明
2 H: e* k6 h' k# D- \0 g) c
8 h8 x6 P3 H$ o9 ~8 R; d
# Y$ J5 P$ n- T3 e; {* [% I2 R
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:
" b& W0 l0 F  S/ G, d. t& D+ L$ L4 G" I
微信图片_20240118182724.jpg

" W+ ]9 [" ^7 V3 F8 r9 M
图19. 数据接收回调函数

: `+ D4 \- m; F1 c6 k
3 B: A5 i7 g9 W. g0 E3 R; t
至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:
6 _  S1 Z6 D: ]* o& N  L  _. N+ ?) Q2 n
微信图片_20240118182720.jpg
0 ~5 I2 O+ e; W' N
图20. 用户接收 BLE 数据

! _4 Q" I/ A6 z& m+ S

4 A4 ]! D2 E5 m2 j6 ]) q; ]% N

# U7 ?1 f9 C  x+ O" p% e; f. K8 b
关于发送数据,原始工程实现了以下处理流程:
' h5 X* s# D  i* J# z6 u: P5 C6 C5 c1. 从串口接收数据$ y" o1 W$ M9 b: w- p7 ^1 p9 m
2. 解析数据为命令并缓存这些命令2 ^  D7 ~) n4 F2 f9 \7 B
3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去
6 a4 [+ E2 S- c1 r; ]$ c; o; J& C
/ A  [% \2 s, ]# S* N8 C2 ~该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 214 d8 `1 w; _) A
0 v/ r! t& a1 N/ G, Q+ t
微信图片_20240118182717.jpg
  @7 y9 s$ h0 j! V) H- T
图21. 取消原有的数据处理流程

  c2 B1 \  F: F' S

! V" F/ |1 h% J5 Q然后设计自己的发送函数,见图 22:4 |( O1 l) I. @. f$ w: Y% X' l5 k
# O' ]5 K! }  d& X% h
微信图片_20240118182714.jpg
/ a. T1 [1 c! r, o
图22. 自定义 BLE 数据发送函数

, h  H# s+ L$ ?& ?0 v0 E
. s( z0 f( q+ u+ A* T
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:
2 B$ X! W# N$ i2 `  K$ O• Data_Received()接口接收数据
# F9 I& x) M( n. D+ G! s# x( Z• user_send_data_over_ble()接口发送数据0 f, }1 p. c( k% N* _

7 P* g, ?8 {& T8 D( g# e7 i" _: |7 P4.4.添加其它功能
. h, p+ B# d1 i/ \1 Y  C) E8 |2 _& D根据任务要求,我们还需实现下面三个功能:: [+ l: c0 N3 l" a! w) ]
1. 控制 LED 亮灭2 }5 @& t7 W1 g9 N* Q, z* G9 M
2. 定时 1s 上传心跳包,内容为连接后的秒计数值4 J, w& t! n0 p" B
3. 每次按键上传按键事件通知下面开始逐个实现:- N9 l4 v: ^: I' C

3 T! L) h2 S) f; Q
4.4.1. 控制 LED 亮灭
3 e1 M" A* e* a0 a$ N% v; y$ h1 C首先,实现 LED 亮灭处理函数,' a6 K$ S/ E! r7 _9 s
4 d9 a0 t7 j1 f0 ~, t6 E
微信图片_20240118182711.jpg
6 J* J! X2 a# B- U2 h; t" U$ P
图23. LED 命令处理函数
" c% q; i3 J6 J" z$ B

! }! q" u8 F8 N将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。
/ u2 A! k  E5 V2 k% ~" Q: Z" ~! j% @
微信图片_20240118182708.jpg

. l5 R- ^! I# r; \) d8 Q
图24. 接收数据后进行 LED 命令处理

& M2 B4 Z7 P3 V' h( ~  j! G2 j

7 }. R  @1 `+ S4.4.2. 每秒上传心跳包- B6 g% U) Q2 I  _3 |4 z
首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:
/ J1 K$ ?0 ], r- M* @( i' u9 @$ ]; x
微信图片_20240118182705.jpg
3 e, [5 X: @& Z1 y; m1 E
图25. 心跳上传处理

) F8 }8 C' s% p, {% ~% C
) g& m$ k! p5 ~7 g+ [
将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:
6 R; D* {  N; s+ h: k5 q, |
* ]1 P- {" |% d5 j
微信图片_20240118182702.jpg
6 P( D3 C. b8 ~) C4 \
图26. 心跳处理
+ C  s' q& {4 l0 D/ @5 W
% F1 }8 L' ?  R7 ?- `3 J$ _: Q

& O# T2 r4 I: T
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。
, E. q3 ^! p5 f' O- b) @; w2 O- \' a) l7 A
首先,实例化一个定时器,并定义超时回调函数:/ J5 k" Z; }) L
# N; n2 m% |0 N0 x! f6 E7 X% R# m1 S- D
微信图片_20240118182658.jpg

/ J1 D" c$ i% f8 ?  S5 S3 i
图27. 软件定时器实例化

: N* L, I4 p9 ~" U
4 I1 i- e7 i, m, q" \9 T- q
然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。- v3 W; i$ ~+ J9 N! k

, {; H' Y% a& J( L* Z
微信图片_20240118182655.jpg
+ x# \/ K3 @8 }6 f( Y) @
图28. 启动定时器

4 B! I8 s' n7 j

1 \% \4 |& F; p/ |( M( {4.4.3. 上传按键事件8 n, c$ _9 D7 m4 D
首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:" E7 U$ H  j! Y" U- x
) C" L3 \; t% J, L) q8 X: r
微信图片_20240118182652.jpg

7 F' F0 E5 d# {5 v; q
图29. 按键回调
+ j. h0 m' \0 z5 Z2 t5 y8 z
) s) E' [9 {/ v$ h
按键中断服务函数中调用:7 X* l1 H+ t3 w3 Y7 Q
- v$ I1 J) I! u3 ^1 k, i/ z! Q9 B
微信图片_20240118182648.jpg
) b& b5 l6 g, B4 o
图30. 按键中断服务函数
, }/ M. e# z7 N/ G! x. c

" E0 q" s1 w* L/ {+ f8 s: F+ w
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。
8 h! M) Q# Z0 w3 y& g# H2 ~% H* u; }; ?
4.5验证功能' Z' D0 N+ }  S9 o% j
用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。
" O% c9 u7 V- H7 n6 O7 O% R' A. u, J. P" E. l1 k
微信图片_20240118182644.jpg
9 H) S: G8 o: `1 K8 v5 c1 w
图31. 用户工程广播名
: m% ^; ^3 ?. z) s
4 \+ \- t9 {7 d- m6 _5 ]$ p( V
连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:" R' k9 ?0 o2 R& X5 `

) f5 o6 @" ~- u8 I; R
微信图片_20240118182641.jpg
/ M: n6 y4 D% i+ C% w5 J+ l
图32. 使能订阅
  r8 \% R" n1 Y7 C5 A' U# ~4 I
$ a/ ]& V+ F3 u, [1 o$ ]
通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:4 @2 ?5 ~/ P7 Y- ~& a
$ b9 ]4 [! O- F1 C( a
微信图片_20240118182637.jpg

% K" D5 B5 `5 E4 j
图33. 用户工程 LOG

( q* D6 _. T& a: H

7 h) ?/ {( e0 k5 \& r+ ?05小结
3 i4 D, \3 Y5 I) r& i; K3 \跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:
& `, s; y9 {" d6 y7 F& A* d3 l+ _% K/ N- b
微信图片_20240118182634.jpg
' l& f6 Z) g) L
图34. 软件层次架构
7 c3 n, S: S8 d& N
! }* q4 W7 C' B6 ~# d2 E

: G6 F( n4 D9 Y1 y: L% W
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:
+ {. P# p) F5 z( C3 a- Y0 @" T" y% r$ U3 @6 v
微信图片_20240118182631.jpg
' s, v( H$ c4 A; z" k. \* X* B5 d
图35. 用户层文件
- a& ]4 [" s0 h% Z, q! k. J' p/ C
, M3 ]9 I, K! x7 z; s
这些文件的含义是:
' L% J( ?6 ]; |' {4 l* O# K2 r• serial_port.c,用户应用逻辑的实现
5 }# p, Y- v8 j: ~& }0 ^) _! S3 ~2 `• BLE_SerialPort_main.c,程序入口,程序主流程; G+ C- G* M$ }8 R. x8 Q
• gatt_db.c,BLE GATT 层功能的实现5 t* f  G( b$ S5 v" u6 K
• rf_device_it.c,存放所有的中断服务函数 % B; m6 e) B9 X: D2 N* f
$ s6 s9 _+ B2 C- q9 F) X
上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:
! w( T% G( }( t+ K$ U: F/ g+ \. s* [3 k7 j7 m" G# A3 @3 x
微信图片_20240118182628.jpg

# v( T7 d  W- @8 S

3 o& x9 s5 p3 z' V6 f
( ]- v- D5 |6 G5 A/ ^4 t( a" S9 @
图36. 系统流程
: T7 k" o, `# [( v+ t- v
9 t: b: y+ f6 [
BlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。3 M4 a8 j5 v6 k0 Q* Z- w- Z/ Q- u

( P0 A7 [8 t/ L, \, r9 y7 b3 x
" o0 ?- W4 S9 H2 {/ ~
转载自: STM32单片机
8 V% w! i+ o* W# C0 O/ y如有侵权请联系删除: {6 }& X1 G: o, ]! ^( `2 i! S
7 E/ g, {5 q8 b" r$ z& ~! I

4 Y0 ?0 ?, B: g+ b$ o( ?! B
. f* G8 z$ N, ~  A& ^5 I5 A
赞 收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版