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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言
4 b+ A1 ]# r6 `1 e8 N' m本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。
1 @; x7 w* Y5 ?
$ T0 ?: ?: v5 Y& w本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。/ w3 P- Y" j' @: U2 v

9 M2 N8 p. c% o" w/ k02SDK 目录6 S& a* e' M! Z# D
从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:% _- j# b- g6 M9 M' Q$ E3 W9 U; M' \7 _
/ d$ f* M  R: x* n
6 R6 u% s/ h5 c* k' D
微信图片_20240118183417.jpg

2 C! I: j( i% [  m0 O2 U7 r
图1.SDK 目录
& H& P9 u1 a$ u4 w, _

4 t' ~" h; K  A# Q

5 t* X7 P$ m  q+ d# M3 e各个目录的功能说明见表 1:
+ e4 I5 `" }3 R, R9 _6 k
微信图片_20240118183414.jpg
: Z' m) l9 F: `. N4 Y
表1. SDK 目录说明

/ r* b0 v0 R2 O. @- L

3 s7 M) f- [, {; v5 T2 B$ wBlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:
2 |( U  Y# X. _0 H7 R; c" a1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。
& n; b" O: A1 U- t) L% j( G

2 N& f6 Z7 |. H% d7 Y% u# `2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM)
  O) K# Q4 R- e% L6 [, u! z* I4 d: o1 B6 N# G3 O
3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。0 O1 t% [+ c: [7 T$ ]# B' e

) R: O2 c) n: t* D' M, B4 @03SDK 例程
3 R$ g- Y, P3 wSDK Projects 目录包含了以下三类例程:# T4 x$ V9 m8 R8 Z
1. Periph_Examples:包含了芯片外设驱动例程。
; |. R& j% l: K1 z1 i) Q8 M2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。
. P! _) L8 Z+ v5 ^( H, M+ J# Q3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:
3 x4 `$ _/ B8 v. c5 c6 h8 r! N
$ K! K, e6 H: k( @/ q$ X
微信图片_20240118183404.jpg
% D& |( M7 f8 t1 r9 d" l
表2. BLE 例程说明

: E$ v; }* a1 B8 t+ ^1 N# W) H
$ B9 a5 @8 r' A" B" k: A$ E. ~- g
04快速实现用户固件功能
' r. \7 |7 ^) ]2 n本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。
, n2 `2 |; Q) x1 s7 a
- p$ g( S! ?4 V: V/ I在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:
' z, u( k. |* P1. BLE 从机功能,包含以下配置:. U1 t1 {( k- M! n" G
    a. 一个服务,一个特征,特征具备 Write、Notify 属性; s' K8 g' N1 Z7 c
    b. 设备广播名为“Hello”) J3 ~$ u% M7 k+ o- c$ E" [
2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据/ r! M# _0 [1 ?9 M9 n
3. 自定义协议,实现以下功能:2 p5 T: X+ y+ M! z
    a. 控制 LED 亮灭9 a; S  C! u, U: ?
    b. 定时 1s 上传心跳包,内容为连接后的秒计数值& }( f* p5 B5 l5 O5 p- ^! W  A
    c. 每次按键上传按键事件通知
% O0 F7 ~- ?  z% g8 O, [1 q( d& \% k; t7 q% }2 U! l
基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。
( t0 S# p# N' U0 {8 e1 l9 j8 M% A* I6 `8 |* w5 u' R9 n" c
4.1. 验证原始工程  }6 j  d! M$ c+ V% }/ `
在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:" J3 L6 I# e4 P: S

4 u6 U. u7 \! C6 X0 [
微信图片_20240118183358.jpg

  X! ]2 Q9 O5 a- s
图2.用户工程目录

( [) a5 I; r( {/ v! e/ J& R

7 s- D3 H: N9 Q, @/ [7 L; L1 p打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:* p8 A$ I2 _: U, a! W
6 c7 c# y6 x7 ?6 F
微信图片_20240118183350.jpg

1 u/ N2 A) h3 O4 K* X, x4 `
图3.Browse Information

( k6 j1 C  |5 K4 h
) T- C' v& \: D9 H4 J
微信图片_20240118183346.jpg

) J1 s  Z7 M$ y+ P* h% W$ e
图4.选中 Server 工程配置

& B+ E7 [5 ]" b* p1 }

6 H' s" l4 Z7 r' |. M编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:
7 Y- z% |  m0 o( J" V, |. C4 B6 v0 Y
微信图片_20240118183336.jpg

. o' z( N, w7 ^  F) l- }% K/ K# D
图5.BLE_SerialPort 工程 LOG 信息

, k8 C- r+ L* m5 V
3 c/ D) T1 i4 ~  D, Q& n. `
使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:
) N1 M5 T7 R6 Q2 q$ C6 E/ G" o( a% |; N
微信图片_20240118183330.jpg
$ Z0 m  {9 p7 U. l) Z8 Q4 X
图6.STBLE Toolbox 扫描页面

; J( M, O# c: _0 c4 ?% c' h0 x9 X

5 X- ]5 {' n, K( l: r至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。# z$ Y# O0 F  s/ T: G; b
! N3 x& R/ U3 O' m3 Y
4.2. 配置 BLE 从机功能
) J* q0 [( j4 U2 L) s原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:% Q: f7 V1 _4 y/ ?8 G
; r( e+ ~- y& s# c0 V( n! P, P# X2 T
微信图片_20240118183325.jpg
* d2 b! O$ D2 z! \5 B3 d
图7.特征 UUID
* _3 G. W0 \, L5 P8 W. X( p

% [- V. ^% o5 J: `; y1 U协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。
# p; z. X& Y2 i- \0 ?/ L
7 _/ `" t. n6 ^9 K( v8 G
微信图片_20240118183320.jpg
( N& r( [: w, \% X' N; d( R" f
图8.定义特征

$ J& J' ]6 L2 q

( S, Q. r; z+ I# x
9 u5 V' W& d5 I* `0 |& m
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:
" w" V; t# I' r8 c9 n: ?
! M# e$ y1 w: N: a/ R, r
微信图片_20240118183230.jpg
5 o3 y( ]9 R* m
图9.特征声明赋值给服务声明
  N2 Z! e; w7 e  \
5 F+ I+ ?! Y  g: s$ Y
上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。
$ ?, |4 W3 H! Y% D0 ^) U" }- J! v$ |2 m; t
首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 10
( Y6 u# |3 U. e# L1 w1 l7 b' w
4 m' s' ~( t6 K+ c
微信图片_20240118183226.jpg
, ]* l6 N& w* `3 e
图10. 句柄
/ Z) B* ~( ~1 f% n& ?; {& K
# C7 j/ k% i2 Y1 r. ]
然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。8 r, T+ ^% j7 d

+ D% f$ ^" V2 Y! f7 J& Q
微信图片_20240118183220.jpg

: ~% A/ L# _& u; Y) Q
图11. 获取句柄
9 N1 j8 M$ D; x% U- g8 Q

# Z- ]9 G6 V6 o8 f6 i9 p" i0 [" \; r至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。
9 v/ b/ x/ j; E& R* F
9 E1 n$ b2 ^8 ]: q& T7 x! y  ]4 Y
接下来修改蓝牙地址,并修改广播名,见图 12:3 d- h0 ^! c1 p) X; R* x! X, |; j

0 H4 V2 ~6 ?4 @, j' P& o
微信图片_20240118183215.jpg
( Q+ f7 h/ \0 n
图12. 蓝牙地址和广播名

  R; A! W+ o7 A: j' }
* o- [+ H% U2 D7 }
广播名的长度改变后,应注意指定其长度:; L7 Y8 }( r% C1 p5 R8 s9 A
1 V$ Y& `5 i; _
微信图片_20240118183210.jpg

; N1 V1 C" @: q1 g. Y
图13. 广播名长度

/ n) a) T3 z8 A

6 l$ d8 O7 Q6 u0 \  U! c, X' f) TLOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:
; F. n' V2 {" |; [' E7 x& B6 G
* y4 l$ i1 h* x6 M) t2 m
微信图片_20240118183206.jpg

9 x3 r3 p9 S7 p& d4 ?
图14. 设备名

# d. Y: n: ]3 J0 R9 J6 V
4 N; I7 S; f( V% p- \$ U
9 K; J9 e! r* D7 n
微信图片_20240118183202.jpg
' Q8 y8 o6 N4 N! r  [
图15. 设置设备名

' A- F" c, f% T2 ?6 f9 J
) o9 I1 p/ V9 m$ d# S4 r3 F
至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。
% B3 y- g; A* K: h  H6 S# W3 |5 C- p' k
4.3.和手机进行通讯9 _3 m3 \/ x7 D
上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:! a' E8 s4 E1 d: |, N8 M
9 x' T8 W0 x- C5 n- t
全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :
( i7 m; U% |+ a6 @9 k$ W3 W6 f' ~/ O' y2 E( D7 u- ?
微信图片_20240118183158.jpg

. A3 D3 a. u. ^# b, ^& S
图16. 发送 Notify

1 C& W9 {4 ]- m; }7 |$ M% j- O

1 s9 T0 W6 q  ~5 }手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:/ ^5 i9 \$ q, g# H% \: s

% A  O* U. e9 @+ }  e+ n
微信图片_20240118183153.jpg

3 E. C2 d! G' j! s1 J9 Z$ W- P
图17. 使能订阅回调
# }6 c0 r$ v: ~9 o( B

% L4 b) |) X& X, G( C# I添加新的特征句柄全局变量声明,注释掉旧的:0 B0 D  A+ P& R# Z4 f4 m& {  L  r

" _' S* F8 Z& P' ~# P
微信图片_20240118183150.jpg
* z; \( Y) g$ W4 |% q0 f  r0 ?, r
图18. 句柄声明
* D8 P, O+ d  S5 s
$ M( n( C. A" V" ^$ ?, N1 q

9 }7 F, T& s4 m6 Z# L& g$ t# ^  \7 i
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:( }) \2 H# f. M. _# t4 _

6 _/ l* |7 x% V% M/ \' \$ ?
微信图片_20240118182724.jpg

2 I6 ^- L" u/ x# @6 F5 e9 S
图19. 数据接收回调函数
+ Z. x! K" |9 x% ]  }0 }  ~& I
: e3 {8 A" W+ J7 F8 D
至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:
( x4 ^1 u, a1 ~3 y' a
; G/ m8 M9 ]9 t1 ]3 y
微信图片_20240118182720.jpg
- S& }# y- g; Z+ _% |5 m3 ~
图20. 用户接收 BLE 数据
5 h- C0 z# ?. j4 T+ P2 C2 \  p
0 |5 Y& @% M4 x# f
; d0 B( D' S7 X& @; V: b0 I
关于发送数据,原始工程实现了以下处理流程:
3 s' q* L, k$ T. X) v2 _1. 从串口接收数据5 Z* R) G5 G* P8 j  z( L
2. 解析数据为命令并缓存这些命令
$ a# I5 g5 u& _3 t, r) ^3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去 9 f/ ]! g) K3 ], F% s  W% V

, j- N  e! u# X0 a3 g! m5 Q. z该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 21
- u' q- ~) d0 n5 P
, t7 t  A: H/ n3 r2 \, {3 P4 G
微信图片_20240118182717.jpg

2 q! B) D6 |& h5 x7 n. r8 X7 i
图21. 取消原有的数据处理流程
6 z1 A% @, O4 z6 }' @

' g% t2 e; A* Q# s然后设计自己的发送函数,见图 22:8 c; @* I9 n" d4 r2 F  w

" `0 c8 ^! |/ e' \$ v
微信图片_20240118182714.jpg
2 a/ B- x! t2 m  W6 F6 l8 s
图22. 自定义 BLE 数据发送函数

+ l" {* F9 e. r) M" `8 ~  y! t5 S, N
! w4 Y+ q% ^- q1 d
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:
% U+ I2 Y3 L* |( l! e• Data_Received()接口接收数据
2 y7 }, h. t5 u# @; U7 p• user_send_data_over_ble()接口发送数据5 }# s& {9 N3 @  J+ X/ d' j
& {* N/ G: z0 \# O& _" l
4.4.添加其它功能
' z7 a7 z9 F% E  s3 |根据任务要求,我们还需实现下面三个功能:/ d" ?6 q+ n1 G8 z- w
1. 控制 LED 亮灭
, l2 M- R6 ^& n. J# R5 |3 N2. 定时 1s 上传心跳包,内容为连接后的秒计数值# I  x$ m- ^8 s3 A1 B. @8 H
3. 每次按键上传按键事件通知下面开始逐个实现:
: E2 H* v( L0 F; t" t2 r/ o$ w
& @' [* `! ?1 Y
4.4.1. 控制 LED 亮灭
# J  D0 Q$ w4 C首先,实现 LED 亮灭处理函数,
5 [% [5 E; v3 h# @1 @4 ^& O
$ P$ o/ V! u: c
微信图片_20240118182711.jpg
5 `  q7 m* I$ G3 U5 V( X
图23. LED 命令处理函数

& ?4 l" p) |) @
% C4 u! T3 {; j' p/ O1 L
将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。/ Y9 t+ S& ]( f/ `0 m( W
) {. O. L  j$ w8 K8 A2 ~5 X
微信图片_20240118182708.jpg

9 `# c0 @: c' {9 w, f/ i) t6 W/ V
图24. 接收数据后进行 LED 命令处理
3 \6 k' b( Z  ?* k' k
: E3 H. c8 A  m, L" U' w
4.4.2. 每秒上传心跳包( C+ E4 ]! L9 _, X6 s3 a0 q2 E
首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:
; w% B) C- q/ I- e. R) [# {
( f4 V/ q8 r- a& n' P# W
微信图片_20240118182705.jpg
/ x, Y0 X- N. E$ g4 C' j8 x6 |
图25. 心跳上传处理
0 l! }" O; @, o, l- H, K7 z
1 X% v: V6 x& A# W- _! D+ w: e& i4 j
将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:: [' Y/ x3 S* t+ m
8 e3 [! _4 a  b! _# `
微信图片_20240118182702.jpg
; ?% s& G* M2 Q
图26. 心跳处理

; f$ N. q5 T  T4 B5 A6 z

- E4 X4 D7 g' ^7 L# V& g
) C# P/ E$ T0 q
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。
, x, O$ y( ?) r& l4 ^0 }1 x* N
0 }5 n, r+ t! b首先,实例化一个定时器,并定义超时回调函数:
7 ?: s5 c, q5 W# X* I$ @' ~. ~9 J8 [' ?" S. e2 H" O! D5 U
微信图片_20240118182658.jpg
) c& y3 z+ ], K4 m3 u7 ~
图27. 软件定时器实例化

; o  U8 t- v; a  Q) J. V- O

: f( M* b2 I, ^/ G然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。3 F/ V6 N7 ?- r4 [' _

0 Q5 a; C6 ]& G. w8 m% x, Q
微信图片_20240118182655.jpg
3 r/ @1 x+ J, n0 K* [
图28. 启动定时器

7 f9 i1 V9 F& B7 M. d3 {7 \

/ y4 K; @8 F' c) X$ r+ O  w4.4.3. 上传按键事件
3 c. a3 B% f+ J2 q. X* u3 T3 q" _' ~首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:
8 u6 S! [2 ?7 g3 q; b$ K- u+ \$ A& g. Z
微信图片_20240118182652.jpg
: t5 R# l: B1 d) T) U: i* k
图29. 按键回调
0 I# o, \% [5 Y- \; c4 u- g
8 b* C; k  _' ]! s: G$ m  f, D4 h, }
按键中断服务函数中调用:5 j2 Q% I6 `; q
* d. e( G" R. M( w
微信图片_20240118182648.jpg
' \. f# W. m8 G8 j/ Q
图30. 按键中断服务函数

, R/ I) q. q& F5 ]' w* Z" Y
9 V- s' \  T/ Y5 m
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。1 P0 U2 L1 r3 R5 C$ @; U$ b( t

+ Z. T$ b' A8 [+ [) Y& P/ W4.5验证功能
! Z" n6 Q, Q# F% P& b2 E用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。
# p" k% x( D1 ?: ^4 }5 [
) @$ E  N/ z0 y1 U+ x
微信图片_20240118182644.jpg
1 C0 ~8 e  i2 K: h# R! l5 [
图31. 用户工程广播名
" ~7 A( D$ B/ f0 y+ T+ t
8 q  M) M/ [' |% n; s% R8 ?: L
连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:+ ~, j8 k& B5 D. h! M0 e; ^" W) @( z
" t: w1 b0 ^3 E7 h
微信图片_20240118182641.jpg
2 S! g( x' ?1 l" V2 C+ k# z) c1 ]) p
图32. 使能订阅

3 e* l- a6 V$ f: W6 F1 G+ [& N# `/ U
  U3 T* e2 o# E9 g0 Z2 e2 L
通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:0 \+ y; V  }) Z' a( X
* ^* }0 q5 O* c' r3 w( n
微信图片_20240118182637.jpg
  l$ p( N9 F! A' g
图33. 用户工程 LOG
9 a/ a: ?# s$ }9 E' C/ z) X+ x
5 t/ z6 `/ W0 C6 \8 ]
05小结
8 J; `5 p+ @# P跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:
, [! R8 }' h2 G" A$ N* J0 E* k, s' \5 B1 X, o& W; y
微信图片_20240118182634.jpg

1 e9 c( |8 E0 D+ F, u  A4 ~( q
图34. 软件层次架构

. H  N5 U2 ^1 W9 }

( Q5 p9 B8 R/ [

6 x% x; B+ y/ T( t% o; f
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:
) U3 [  `# d) H- e# _- A
% \% L! e# S: B# v
微信图片_20240118182631.jpg
' ~! q9 ?4 P7 k
图35. 用户层文件

7 u- i3 z2 D0 ?3 J% I; M' E3 ^
! _) i; v: B! z
这些文件的含义是:3 w* i$ p9 a9 t9 Y: _
• serial_port.c,用户应用逻辑的实现
5 a# M1 @$ Q6 A3 }• BLE_SerialPort_main.c,程序入口,程序主流程
3 V" |$ L( M; z* u3 |. t2 B- `• gatt_db.c,BLE GATT 层功能的实现4 M; g8 W! E# E2 \
• rf_device_it.c,存放所有的中断服务函数
) ]  m5 S9 ]1 g. y* g% I6 v: I& q. R/ R& g
上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:7 ]1 W8 k- s8 n# u$ P3 Y

; C0 D6 f* k  T
微信图片_20240118182628.jpg
2 n# ^6 m; `  u

/ w' J  [: j% _. D2 R7 N
' |) \$ ?) c$ t6 a
图36. 系统流程
" O! S+ m8 N- v/ ?' x' T6 Y; w

( t* a8 f; a4 s. i( rBlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。
& J; Q6 R8 o) S% Y$ x6 }) ]9 O- P5 g  o, `% O

2 F" R1 v1 T* E& _! {4 M, n转载自: STM32单片机6 `' o0 ]4 e" B( u2 |' n
如有侵权请联系删除" \/ n1 o" D8 E$ k& g+ t3 k
5 j- n2 k/ S5 N$ K9 k7 [  D
: d% `$ J9 D$ C3 @' Y
5 b! q- e) y8 V: X6 R* l% V  ^0 r
收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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