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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言) Q" m' z- r' S7 P6 ~. t4 b( ?
本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。
( G. a1 q9 N, {
# G2 m! e/ t" }$ n" @本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。
1 o/ U4 |1 D3 X$ r1 d) p( W/ R, H. C5 G) F
02SDK 目录/ j. C+ `5 s; t2 Q8 ^9 Z: Z7 \
从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:
3 x7 A" ~0 u  f1 ?- P" z1 Z, q- O3 K* U$ o/ p

( \# K3 A) T5 |
微信图片_20240118183417.jpg
2 |+ e6 F. f, ^0 o5 W. s
图1.SDK 目录

' t! v! C6 d; t# M" q! z
% c" K$ W+ @2 i7 ?# F' s

# V8 G* n! @$ A$ X各个目录的功能说明见表 1:
$ b, m- [6 n6 Q, Z, P' j
微信图片_20240118183414.jpg

% n& c0 k/ {' r: Y& e
表1. SDK 目录说明
% ]% H- @3 ~) T1 {
' o+ f  ?! Z" Q6 z4 R
BlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:
8 @) A( P: I7 E8 r& S% a& I/ [# m9 a1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。
0 p& L6 c6 i5 z. p9 R6 S9 }- Y

5 I& {/ _6 C0 `$ `2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM)+ J$ b0 l) a: V8 I, Z% F  s2 d9 L0 `
% K5 b! x7 J+ M: M$ x  x5 A- Z1 \
3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。) T4 q1 H% ^9 q
) P% v5 k3 |- A" x6 l  _* N2 [
03SDK 例程
; _' ]' \3 }4 c: @- A5 X2 J5 oSDK Projects 目录包含了以下三类例程:
- S3 o+ h4 _2 [. H" L, D1. Periph_Examples:包含了芯片外设驱动例程。
8 u# K, b. h8 T2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。  p# N7 b) F5 S: T! z
3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:
4 z7 I  B1 h! u! P" A
4 \+ H: X( a; y  {8 {# f
微信图片_20240118183404.jpg
6 U8 I7 J3 C' N1 j. b. m
表2. BLE 例程说明
+ _: ~, Z* t  k2 g6 ^, U
( L7 N  X2 |) O! d& ~9 T
04快速实现用户固件功能
! q' g7 H/ J7 p本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。
3 K( j* |! t# d' d# g: i& ]
7 r$ R" a$ a) Z1 U8 R在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:' q5 S4 B8 n$ u% G. W0 u
1. BLE 从机功能,包含以下配置:. ], |% y# p+ b" L0 z
    a. 一个服务,一个特征,特征具备 Write、Notify 属性( Z: D2 P4 F$ L% @6 s
    b. 设备广播名为“Hello”
  M$ I( P% P) q; o2 i& K2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据, z3 |2 c& x) E: V/ Z
3. 自定义协议,实现以下功能:9 c: b3 ^* ^$ ?% o, |5 |
    a. 控制 LED 亮灭( O/ l8 R# R' `& y' Y* U6 s$ Z9 f  J
    b. 定时 1s 上传心跳包,内容为连接后的秒计数值
% ^( u* F; ~0 E; m$ U    c. 每次按键上传按键事件通知
( a2 K0 p6 _3 d8 Z4 d, W$ i9 t& j  K& u+ \; t  ^' ]- g" i3 e
基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。) o, t3 K' w  {+ z% h& r

/ e0 ]# j% T1 X# g9 V2 c4.1. 验证原始工程" U9 D0 r7 ?0 D0 e( q$ h
在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:7 J$ _' F% r5 M5 P; h1 |
! e! X' w' }9 L/ D9 c
微信图片_20240118183358.jpg
: ^3 L$ `0 q6 O
图2.用户工程目录

; n$ _. `5 ?/ d" i. W

( E! s( U7 D# P2 o1 W打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:
+ h" S5 M/ H, U# K+ S" ^: }3 {# A5 I2 P% ?) `
微信图片_20240118183350.jpg

3 L" L# j7 |" D2 `, B
图3.Browse Information
9 T2 R# D) p5 r. a9 O7 [% f( C

' ~0 }+ y1 F6 U5 Q, c3 B
微信图片_20240118183346.jpg
" G- z6 J5 g& B% `1 o
图4.选中 Server 工程配置

" \0 d  r" w* ^/ j8 K; `# c

0 k5 G0 q& k' T编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:
" S- I' J, N* _) y$ m$ a
& Q; }$ L: T9 ]8 O5 `% X; n
微信图片_20240118183336.jpg

/ T7 T3 g$ d' v
图5.BLE_SerialPort 工程 LOG 信息
0 ~! [4 H' w6 Y8 m( r* Q
% T" ?2 S2 m4 o
使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:5 o1 o0 X: R! s. K3 N# T  o

- J. h/ P) Y# M* }2 }; C8 O) E# D
微信图片_20240118183330.jpg
6 G" B$ Y# c" Z1 b8 ]
图6.STBLE Toolbox 扫描页面

7 I% E; V% l- h9 G; P
4 N1 @3 f' Q% L8 P' q+ X( T0 G8 G
至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。0 H) G: k- K, r! R
# E% T, Y3 r+ ^
4.2. 配置 BLE 从机功能1 q" V' N( c2 h2 z$ F
原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:+ s# B; o, T+ G/ I5 h. m
8 a0 }$ ^3 n+ a; c. U/ x3 }
微信图片_20240118183325.jpg

, X5 R- A# K0 Q  x* p. S
图7.特征 UUID
" x3 F# s3 {3 ?: z8 n

! N0 u+ j1 q6 M, v9 }$ J9 _协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。
- n# b; h" H8 c% A$ ^; Y' @
3 Q4 P. T9 b5 _1 C$ G( q
微信图片_20240118183320.jpg
' U' ~7 T$ P! }7 ~# T" |$ i
图8.定义特征
4 u2 W) u: R9 f' u2 h( H

! ~; Q! z5 J  F, X# ]5 u( x7 E

3 k3 R7 ?# y7 z; Y; W3 R$ T4 H1 J
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:
2 T; C; F1 K/ u) Q% w" M, m$ z# L4 ^1 R( F
微信图片_20240118183230.jpg

# ~: Y' z/ V. {) A
图9.特征声明赋值给服务声明

% L- T; v' v/ w" z) Q

1 t9 O1 @5 r6 ?( l上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。
# I7 w2 [# c5 m. A1 \( B4 h# z2 S2 {6 ^5 H# }0 h
首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 10/ W9 v0 M, ]+ \  g) S& [
. S, b* c+ f8 L8 [0 K" U/ G6 y2 j% M8 Y
微信图片_20240118183226.jpg
$ X  I0 @9 A/ U' N% d1 O0 E
图10. 句柄

: T0 {5 F# u8 K# F4 C, @8 Y

1 b- \, b) a! W  Y( s然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。" u( f2 a0 F& t3 i( }* G2 P- G9 T( b1 f
& `/ ^+ s) ^& c
微信图片_20240118183220.jpg
; `/ t" i- `! D0 I. u3 a! e4 |8 g
图11. 获取句柄

) g$ f+ ^. J* R0 @% d

2 l9 H# q, \8 {  h至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。
" j( n; _1 ^. C! ^8 y/ w8 M0 M
0 H3 U) Y% B6 y) g4 B6 R/ x
接下来修改蓝牙地址,并修改广播名,见图 12:
( p5 ]7 g! U* p# p! S1 n+ r* ], L! c5 |
微信图片_20240118183215.jpg
  c. A4 z- C) M3 |, r! w$ k2 d
图12. 蓝牙地址和广播名
" k& k' |/ U2 n7 ?
; B: A8 g% C5 ~
广播名的长度改变后,应注意指定其长度:
# N' \$ t4 r; E3 F" x- O. s) [' P) e; R+ f  L+ O
微信图片_20240118183210.jpg
, G. T+ c# t" j$ A% t; ^" U* W
图13. 广播名长度

- f, [+ m5 t! G  Y
. O& I- Z2 x& E
LOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:
1 ^5 T+ i. H0 g' ?/ v; N4 Q$ L- p$ C/ k  D; ^
微信图片_20240118183206.jpg
/ s* [; N) ]/ }: L' ]3 m- c
图14. 设备名

9 x( ~8 S+ ]9 g7 H% E2 T
* m; m: ?& u) v! j

8 L, j; n( w3 n7 J  o6 _2 P, f0 X
微信图片_20240118183202.jpg
: H6 ], }' C1 {3 x) U
图15. 设置设备名

' t* \5 p1 u9 u' B  k, k
, I- e6 _5 X3 m, v7 s- e8 z0 B
至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。
: a/ L- y# [' ~+ a1 z9 P$ j* ]; L- Z9 t# X
4.3.和手机进行通讯
- a: Z" Z, \$ O. Q- H1 @上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:) B; [0 _. K2 t- s; S. g

4 j' j0 N, f, q5 x0 W全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :( r& M6 I3 Z" T- d! e
- b1 D; F6 `+ g6 F" l) ^/ B/ m  z
微信图片_20240118183158.jpg

) M0 y6 [! Z+ W( G6 \
图16. 发送 Notify

% R" z* x& z. ]$ I4 B

: q( q& o! D2 O! q手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:3 Q1 v3 t, Z2 F: u- D$ k6 z3 S
$ u' h7 \6 `6 H, i  y6 i8 P# j. f, y
微信图片_20240118183153.jpg
" \/ d* B: ^- H0 e2 g/ O/ K+ S( s9 k
图17. 使能订阅回调
# M1 {3 w9 f( H. v

' |$ q- t& E( Q  j. e7 `7 w添加新的特征句柄全局变量声明,注释掉旧的:  y  q( F/ |/ g

8 N- D' Z; V: F
微信图片_20240118183150.jpg
: n7 j* \2 i5 J# Q0 J! u
图18. 句柄声明
: A2 A* _& r! i
* _# p- l( l& _* ]9 ~; Y# n

0 F( A2 f4 R" H6 h1 d7 j
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:
$ Q6 [. V: @% U0 o0 O2 A
8 D5 H* ~% y- g; i8 n4 i
微信图片_20240118182724.jpg
7 S& n7 C; a" Q8 t2 _7 D
图19. 数据接收回调函数
" h! w' N1 }' g7 K$ T

# W& c, i/ h, ~. G+ S3 x9 K/ d* M至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:8 Y/ g: J3 k1 C! r( v9 [- W4 I/ B

4 [, X- x' j" Y
微信图片_20240118182720.jpg

7 W! S' B1 L. Z( Y* H
图20. 用户接收 BLE 数据

2 `& l+ S$ j8 a" Z1 P" Z/ z
8 B' ^  |4 J1 }+ O* [

5 i, p3 R% s4 C* a& u. b
关于发送数据,原始工程实现了以下处理流程:
) U4 X! l. V& J5 L1. 从串口接收数据/ W9 G: H& J. a6 d
2. 解析数据为命令并缓存这些命令
. J5 t3 y+ k+ ]7 I! E( _3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去
9 U/ ^, y& U/ I' ]6 R% K; I- V4 ]. m8 h
该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 21
: E5 E# z* ~+ \
: V& \5 F2 v3 O; w1 A
微信图片_20240118182717.jpg
/ ~8 O" w8 J' c( i5 L& u6 d+ F
图21. 取消原有的数据处理流程
* U+ U- b9 t. W  n7 ], Z( i# j9 e& d
' j- Y9 N0 |- h+ l8 p6 K
然后设计自己的发送函数,见图 22:
  p) H, _' C0 v+ L4 f' i$ o& q# H* F& K# ]. D- N. s" ?( P
微信图片_20240118182714.jpg

4 y; x3 a5 Q1 g
图22. 自定义 BLE 数据发送函数

, y+ `. n& ?) V4 `- v$ `
" \" E( Y+ _9 |, u5 ^
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:# J1 h* {' E7 m; Q
• Data_Received()接口接收数据/ g- l, q; v/ ?! \
• user_send_data_over_ble()接口发送数据
1 [4 @8 X# s  m
8 ]2 \; y8 O# p% p; ?* e4.4.添加其它功能
6 A' f1 {7 T, o9 f根据任务要求,我们还需实现下面三个功能:4 q9 H5 B5 n% u' J3 O& c7 R- T9 T
1. 控制 LED 亮灭; t- f5 c9 P* s! l7 C0 s
2. 定时 1s 上传心跳包,内容为连接后的秒计数值/ y7 I  u: l  H; C
3. 每次按键上传按键事件通知下面开始逐个实现:  _2 s+ b# I7 b1 F

2 f+ i5 d! p4 [# @; O9 f1 z
4.4.1. 控制 LED 亮灭
+ b  V/ O& ?1 Y2 Q" ~0 o- C: K7 l首先,实现 LED 亮灭处理函数,5 ~; F' j" G. h
# s6 N, q* @) f4 Q. W$ `$ |
微信图片_20240118182711.jpg

5 \  n; t& O% V
图23. LED 命令处理函数

! X! `- i' K7 C, ^
0 C  b% X( s( \* j/ o0 Q) r
将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。
! U) L% a' |1 o2 A6 v/ R+ I+ F6 }- J( E8 C/ K% s
微信图片_20240118182708.jpg
- d( v9 \3 [+ O; C
图24. 接收数据后进行 LED 命令处理

# v3 [2 o/ ]5 W' e
( {9 l. `$ k7 I$ |, x
4.4.2. 每秒上传心跳包
& ]$ n& y( S7 f/ F5 z" H首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:+ [9 o6 G: c4 Y4 i8 c3 v% X8 Q

7 k% `$ [* ]. n: g
微信图片_20240118182705.jpg

( ?4 t- R/ c3 l! x/ x) B4 O3 r
图25. 心跳上传处理
$ s. V9 Z3 a+ g, w  I
& h* u! \3 M, @* `( N5 J& S
将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:
  i3 y9 g+ X# l; {. I- R5 w0 ~8 w) J6 g0 b: r9 Q3 A! ~! }( h! ~  S
微信图片_20240118182702.jpg
2 u) a& v' N. ?& w: _9 q" I  w( r
图26. 心跳处理
! l: f5 j  R! [5 Z- _1 ?3 i
1 y( R4 K, h- C2 ~2 K. C

) ^- y0 a6 s5 O% t7 o& n
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。5 Q0 _" {2 h5 x* X

$ Y- w2 b0 j. \2 q* ^1 |1 b; M首先,实例化一个定时器,并定义超时回调函数:! g. B9 c- q$ r& N
5 ^6 p& l! K0 _$ T) t' n# p4 p+ q
微信图片_20240118182658.jpg

! \! }- i1 S" R4 {/ v% E5 v
图27. 软件定时器实例化
$ e" G5 y4 L) _
9 p9 I, z* {6 f' q
然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。) T, I& C# C0 T% C; {
# }! l; ?- S$ h6 w* {# n6 C# j$ s& C
微信图片_20240118182655.jpg

% t$ u5 T) i! O1 z" j( c
图28. 启动定时器
% A# Q. |4 w6 `' H: K% T

% ~5 g! \: ]5 `; U7 R0 H! P2 z% W4.4.3. 上传按键事件
8 P" `1 w. t5 A% N4 |/ q首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:
2 c* v" }% ]/ @8 M' R3 H5 E& K) ]4 O! h
微信图片_20240118182652.jpg
7 X' s- s. b8 _+ Y
图29. 按键回调

7 r& g' }4 T' E

: u/ b5 {' a+ X+ B按键中断服务函数中调用:
3 i& s# M  h& j; z6 {) T" ^8 E0 x3 N4 q9 v) ]2 p
微信图片_20240118182648.jpg

# f; C0 J, P4 |& G
图30. 按键中断服务函数

) }( x# f$ J2 D0 M7 ?7 g9 p8 l* n
# \2 m6 f! f7 N
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。: [, t5 ]8 e2 G. G0 d. _% e
2 p7 }" O5 @. ^( u
4.5验证功能% [, J6 _9 o; \" Q) r
用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。+ D1 _: t3 y* a# F) D) X
, \3 j; u8 {# g* d' z5 t
微信图片_20240118182644.jpg
9 p1 w  b; P' m2 `* _. w9 p8 a4 a
图31. 用户工程广播名

# C  R+ |) H6 R. Z/ N) ?

( O. P1 Y. `( ^1 P2 H' G9 e连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:$ Y. S* f% U0 `3 t* u
0 I  S' y# a% o+ g- M
微信图片_20240118182641.jpg

" }. h2 S+ F: h8 \% j  K6 {) B
图32. 使能订阅

- l- p- ?- n; X% L
* X8 l" P$ i4 C
通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:
0 @) z  |& H6 Q
' e7 ^6 u, l# ]- ?$ V
微信图片_20240118182637.jpg
; V3 q: M8 \6 x* B1 j2 o8 m
图33. 用户工程 LOG
, k4 ?9 s2 n/ s0 ]7 X

& S$ P' ~8 S7 e; f8 ^05小结1 g$ |; x: l& {+ W4 a3 r
跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:
  e  J0 w0 m! r9 P* D( z8 d- ^
微信图片_20240118182634.jpg

- ~6 b; J6 r  V  y
图34. 软件层次架构
# k# G; J- C; v0 s

' }$ v& h( d) `& K
* S) S. B! R3 E: U
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:
' Q8 m* s* m; L" P; `0 k  I3 Q9 i& I# g
微信图片_20240118182631.jpg
( w0 H+ d9 R1 U. o) N1 A
图35. 用户层文件
; I, t4 D) P  i$ ]1 ~  k2 ~
+ }2 h5 F  d8 l( J: i4 U
这些文件的含义是:
0 o9 D$ O+ k; T- I• serial_port.c,用户应用逻辑的实现( H6 U/ a, M3 D# k( y2 W
• BLE_SerialPort_main.c,程序入口,程序主流程+ F' O1 J9 `( h9 A
• gatt_db.c,BLE GATT 层功能的实现
9 j2 \" h" n9 B• rf_device_it.c,存放所有的中断服务函数
" o1 z" L5 T; K
+ L  \' t! e# t" X上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:" @3 S2 x: O& A: y1 C4 X

) L. \, J0 A" N2 j5 e4 J" w
微信图片_20240118182628.jpg
* a5 y. ?7 c7 D; B3 X1 c) J

! @% [& Y/ a. S' @; I* `' v7 [
0 r7 G( ^# ^/ [/ q9 w! J$ B
图36. 系统流程
# f. l/ c7 w' D* G. A. K$ h

. v3 X5 V3 V, V+ i/ ^1 KBlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。7 }  b# e$ T! g  g# L& w5 g9 D
9 j0 S! A5 d2 h% `
5 m" j" d! ]/ i# e- ]9 Z/ Z
转载自: STM32单片机
$ q6 n, P- @- a  o9 _: B+ I如有侵权请联系删除! o+ Y  l) m2 b; Y- e6 }

4 O( k3 i0 ^  U0 ^" C
% {; L% R( P# t4 F4 M4 y4 I2 U4 c
3 Z5 a( O4 Q& l5 h! L7 q
赞 收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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