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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言+ L9 _% w0 t% I4 m
本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。
4 V% W$ q& W8 j$ U. z% a2 a/ z( R8 v
本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。
, S0 M  u5 N6 f4 C
4 U5 h0 a- C' w- `& H0 B% _02SDK 目录8 `( q& J( }: u% W
从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:: M* S% Y* U: j$ z/ F7 T( s! K' J. z' V
7 F3 e* \5 r# G, t  H& K

( e) i, ~% W/ v$ i" ^
微信图片_20240118183417.jpg

6 R* H5 W: |1 W9 j8 I
图1.SDK 目录

! K7 g" f) A& \3 i$ @6 M, Z

% e; q. f' ^* m+ ^4 [7 W6 W
( w& @; u7 h5 A& R' \8 \# M
各个目录的功能说明见表 1:# l* P. D5 l) V8 a( }
微信图片_20240118183414.jpg
2 r3 ~! L9 o* Q* [* @5 ?/ Y
表1. SDK 目录说明
- {: \; A: ]( s7 P. [$ [

8 k# f/ a/ Z. N5 R" e7 t9 IBlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:
, C, X( L+ ?+ K+ W1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。
; f% t3 f$ e+ f0 c% k7 M: k

$ \7 B7 n( T  C, I# {# |& N4 ^2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM), L5 J5 d+ D5 Q1 n# I2 q0 ~
; F! h% d4 ~% k  W# s1 G* a6 G* h% X# U
3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。
- R4 P5 D9 x- c$ K# N* T4 u& i; K  u) P) g! F/ `6 t5 i7 N4 N5 U
03SDK 例程
# }) J7 I& i0 m1 T. C! ^- X3 uSDK Projects 目录包含了以下三类例程:1 I+ q& y2 G9 h- R4 n2 H% l2 N
1. Periph_Examples:包含了芯片外设驱动例程。8 P$ ]. x$ A7 j/ T
2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。) z1 D. x) i9 Q  U2 K* L
3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:
% n/ g; j) A% d/ N9 S% U0 @
- |$ L, h* L) V4 X
微信图片_20240118183404.jpg
1 O* h& Y, m- F4 u5 f# D  p' E
表2. BLE 例程说明

  Y' `' E$ J# M# ?# O
. M/ {( |& ~3 O- J+ |( z$ p$ W+ o8 y
04快速实现用户固件功能
1 }3 }3 a& e( O$ K本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。
! ]$ W4 x2 Y' d$ R: M- R2 P" R2 J7 f, J1 _8 t/ i
在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:
- C9 I- ]1 x3 V& p1 \3 |' ]! R) q1 u1. BLE 从机功能,包含以下配置:  u! j2 h" ^8 j' T1 y% z6 a
    a. 一个服务,一个特征,特征具备 Write、Notify 属性
: }. T$ u5 @4 a% ]0 ~5 T) L& t    b. 设备广播名为“Hello”* `; f! |: J+ m* J: z
2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据
6 s+ s3 ~0 K$ Z3 n" D9 h* |- A$ e3. 自定义协议,实现以下功能:$ k0 f# x. g6 h: n/ j" g
    a. 控制 LED 亮灭' n% |( r9 G. X& f& g
    b. 定时 1s 上传心跳包,内容为连接后的秒计数值
- ^( F6 z" V: l" n! [    c. 每次按键上传按键事件通知
; v7 y- @. J- i  I
) w. ^3 s. s0 p! |! U; n' Q0 P基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。
0 ~( C, }% E/ D& ]: |5 e- }: }# ]7 K7 b& w
4.1. 验证原始工程( U. S3 K* v6 T) l$ E4 n
在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:. k; r, N/ v* A! X+ K2 h6 _
0 |9 S5 r( K  ~1 R# V1 o8 `& ^
微信图片_20240118183358.jpg

4 }/ W- v4 \7 C6 i
图2.用户工程目录
9 M% T' {0 U2 r) r
7 O5 s6 W2 N0 j  G& M
打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:, T$ d; ~2 I5 ^4 {) C0 e' N
* ?! q) l8 B% A8 G: \! n  {: b9 P8 U5 G
微信图片_20240118183350.jpg

* ]% b$ z2 H8 t, k
图3.Browse Information
1 S* {- @9 W6 ]+ U  L

9 o0 ~9 `2 T+ N) W6 c8 v
微信图片_20240118183346.jpg
* F, d/ K0 f$ Y0 d
图4.选中 Server 工程配置
, d4 e* E# z, v. j1 J

  r3 @' v6 D) D& g; A. z4 H编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:( R) `6 m5 K- U* @1 J# O# }: T- q5 I
* o& u2 U+ N" c* A: _% V
微信图片_20240118183336.jpg
% A1 T5 o# Z+ i# s4 a6 R/ b$ f5 j
图5.BLE_SerialPort 工程 LOG 信息

2 {/ A; Z2 _5 C/ \  ~0 g
3 l; j' L; d# s" d: x9 F7 P5 T
使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:
: {& f' y! `5 c" a) j2 |3 P* \/ b
微信图片_20240118183330.jpg
2 N4 \( s+ N  F
图6.STBLE Toolbox 扫描页面
; t: C. E* O* F" i

) O1 x2 T; a9 ]/ v至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。. V+ ?5 r7 [" P" O) F/ ?

7 j8 Y0 B; S" k$ `) W; g4 g, P4.2. 配置 BLE 从机功能+ [2 l+ e, t* X6 f
原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:
' |& A5 c- b+ @7 d# Z9 z
! h3 W" c7 x% B5 ^, {. {0 ]
微信图片_20240118183325.jpg
# J2 N  [8 N% N: i
图7.特征 UUID

" e6 @/ r% P  @3 `
7 k& a. A0 t: V. k, d3 U
协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。
" c  J5 f+ J* v, s* z6 ?1 P, A) Q" N
微信图片_20240118183320.jpg
1 k+ M, c2 S/ f0 N
图8.定义特征
# J5 o* g0 d2 C$ @4 n
0 S& A2 x' L; @' J$ {
, T- m* r6 @0 J# y4 h1 G9 s
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:7 E  {8 A+ }- l: ^

) |; {) d7 V6 }0 J( ?
微信图片_20240118183230.jpg

; B* |/ m+ D. H9 d
图9.特征声明赋值给服务声明

, F0 w* ^5 x: u9 L
+ i/ A: C  [5 `8 |$ |: m4 [7 q
上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。
# N) b' N8 `* O/ S2 u, _
; \( d) r9 w- E* {0 y+ M首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 106 H3 u9 i% m9 g; ~7 j; _

6 A/ m0 u8 N5 n# V& E
微信图片_20240118183226.jpg

( D  i+ t. D1 J- c
图10. 句柄
% E  M% [7 K6 e' `4 m: v6 w# Q4 ]
: z! b9 W; j$ w
然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。. c$ f: V/ N: X5 K

4 u4 J6 X4 h2 ?' j# D4 O
微信图片_20240118183220.jpg

: E# d2 Q0 I. g$ H- c- v
图11. 获取句柄

& S: ]8 D( o5 A* j3 \% f% X3 o

$ N- M. b$ N7 [5 L- X至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。
1 p9 w5 s! f+ a5 x* U

! |& o, [) O% e4 }' S! I接下来修改蓝牙地址,并修改广播名,见图 12:
/ [- a# d$ A" s* D( t6 I+ r" ]/ }; y# l" j2 D% s
微信图片_20240118183215.jpg

  p8 f7 n/ ^& a
图12. 蓝牙地址和广播名
/ \3 L  e- W2 c$ m6 V

% \4 k3 Y. T1 ~1 j7 B" q$ W/ L广播名的长度改变后,应注意指定其长度:$ M  I( I8 |# V8 H+ v  I/ l
8 k4 B- d  W! z0 a1 h
微信图片_20240118183210.jpg

, }5 Z5 _: X  a: P
图13. 广播名长度

. }& a) \# W+ q$ X5 B, V9 J. d- v6 o

# d; L7 s' L) fLOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:# k, Z+ d- m5 ^! K& G' l7 b
" \% D1 w/ @: m
微信图片_20240118183206.jpg

! l0 T6 e* H( b% i" ^
图14. 设备名
2 P- h9 U; b, ]

4 [5 x9 M& C4 {3 h0 v

% T6 J3 S7 N! O+ G. A0 W; r. |
微信图片_20240118183202.jpg

& U+ f1 O9 G1 [8 [
图15. 设置设备名

) v% [+ v0 k) V& z8 o

8 G" w% c; M! a* o至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。8 m7 E- I( O- z" t

$ R0 w* R8 C6 z3 J4.3.和手机进行通讯( A# a- d! h' |/ A3 ^# m
上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:
  G& Y  l: Q- W' Y

4 V2 u; C- D$ }6 Y3 x* A全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :3 F5 J: ?5 a6 a  i" p

0 v  F# v/ J1 z5 @
微信图片_20240118183158.jpg
0 E" N9 P4 {& V  L  ~6 h, R
图16. 发送 Notify
' U6 h( x, w8 j1 W7 Q& X+ E
$ o4 F1 P4 P0 U
手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:" }" k$ F! ]3 H) n
5 @) n$ I1 T' ^
微信图片_20240118183153.jpg
% N0 N3 `0 [3 E8 _& F5 q
图17. 使能订阅回调

/ W7 f7 V; A+ I* Q" g

  H! K! _2 c1 T6 S0 ~* n添加新的特征句柄全局变量声明,注释掉旧的:
# {6 s( c' h+ o6 y$ ^
3 G. w. r3 Y7 n0 M+ S; {
微信图片_20240118183150.jpg
( h0 w! x- r+ F' u; ^5 _
图18. 句柄声明

+ ?' r2 b( Q2 O: A2 C5 {6 I
4 P8 |# Y7 ^# C% n9 l

/ U) g( W# ]& A9 `; `$ I2 x: F& j
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:1 P8 B% _5 L5 P  z- }( p
- e7 d, U% Q8 q
微信图片_20240118182724.jpg

) z# h4 v) l) f' u* M" Z8 u
图19. 数据接收回调函数

$ R. n7 T1 q4 Q1 {$ P" |8 L8 u9 Z

9 A4 @7 s, G& `' t+ q至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:
; t1 n+ W/ N+ p* X5 n: N, ?1 }  s. }" C1 d9 E* K, \
微信图片_20240118182720.jpg
8 J9 [5 {  [- p/ g8 L' D$ N
图20. 用户接收 BLE 数据
- A( p. T2 V9 c$ j

4 }2 G3 L4 N- j- Q( W% A
0 q8 L% d3 Q' T. z8 E+ I* u
关于发送数据,原始工程实现了以下处理流程:* D# Y! L- F9 N( r) l
1. 从串口接收数据
$ c; `0 Z0 R  c2 a4 C2. 解析数据为命令并缓存这些命令8 n* N3 I# a' f, j
3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去 ' X" [! Q: y, J7 ?/ u9 o" U: I/ [2 K
2 _/ c3 n3 a+ D' _
该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 21+ W8 O$ k8 M6 R' J

: o0 v" h1 `# ?" c# t
微信图片_20240118182717.jpg

6 v( _7 A. |, E2 f6 M
图21. 取消原有的数据处理流程
; m5 ^2 m3 ?2 Y4 r. Y) }
& F  D$ B9 v8 W0 m, M9 U  H
然后设计自己的发送函数,见图 22:
# }+ S5 O9 G3 O1 _: Q1 M0 U* x4 L
微信图片_20240118182714.jpg
. z* q4 p5 R* h
图22. 自定义 BLE 数据发送函数

# x2 I8 S4 H; ]( \5 [4 p
- H) ~1 }! m1 L9 c
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:; j) _, X7 N' h4 |
• Data_Received()接口接收数据4 u& W) B, i+ ^
• user_send_data_over_ble()接口发送数据
0 v8 F' `: p' L. D/ Z
$ m5 [2 r. }7 I* c3 l/ @4.4.添加其它功能
$ ^! e# A; Q( x1 v7 V' A4 f% s根据任务要求,我们还需实现下面三个功能:
9 Q" N5 W9 q# w' J# e2 \  W1. 控制 LED 亮灭7 l! {. g, L. \4 M# H& Y
2. 定时 1s 上传心跳包,内容为连接后的秒计数值$ \, _3 N# d" D5 C- d! l
3. 每次按键上传按键事件通知下面开始逐个实现:
6 y! d/ d) W1 m& x& d/ V
7 f* F1 g3 x5 a, q. |! R$ K
4.4.1. 控制 LED 亮灭
' [+ K1 E4 {# |8 q; q首先,实现 LED 亮灭处理函数,
& g% f7 e% H2 e" G  ^
6 u; @8 V# X) _
微信图片_20240118182711.jpg
6 \7 T5 W/ H% X; P9 c% u
图23. LED 命令处理函数

# d2 v. P% G$ p" z+ c3 y

& o" L% p- [. D$ ^6 ~4 S4 Q5 U; C将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。/ K* t  E" c9 R; }( ?3 @6 K0 h

/ o, X. K% {( R
微信图片_20240118182708.jpg
  h8 K% a* |+ O$ s
图24. 接收数据后进行 LED 命令处理

$ U9 x9 @: X. {( N

' [, B4 j: H/ o3 Z4.4.2. 每秒上传心跳包# l) T3 V. b/ ]) b
首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:) w. @, l2 u; t8 E1 z' [

% |. e1 o+ _% v, ^' H, [
微信图片_20240118182705.jpg
0 |5 O8 i8 x3 ?- v/ r" _/ @
图25. 心跳上传处理

. B( t8 u5 M% D) q- Z
$ z3 Y1 k2 U7 c% M' ~  u
将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:$ Z- s0 p4 m1 o3 b0 ~9 d. `; h

% S" Q, [: Y2 s4 K0 Y
微信图片_20240118182702.jpg

( @; M0 d" d; F* L  K  Z; H
图26. 心跳处理

) ^2 A: N9 n* x# k/ ]/ P

% y/ V9 E0 v. S  }; a# b
/ M" f" H' S9 U
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。0 S% ?7 X) c8 A* \9 @0 W* x! ?
+ F0 @6 B" F& u2 B# s: K
首先,实例化一个定时器,并定义超时回调函数:
# p' a2 H1 B9 O0 p2 W# j7 B' m! Q$ Q) Q+ w# [8 _
微信图片_20240118182658.jpg

& o9 m6 d& Z0 A1 a  I
图27. 软件定时器实例化
" j$ P, U3 t% V  r/ ~
3 M1 W; g6 J# ]1 U! g: r( a
然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。0 p1 ^3 o- M! L: Q& M3 I
6 m: i  y! `" |1 e
微信图片_20240118182655.jpg

5 k3 A) Z# Y% U8 [, N
图28. 启动定时器
( u, w: W! G4 ]$ ~& m

  D) W5 Q: U+ A$ e4.4.3. 上传按键事件0 {# D' S# H/ c( T- U, r
首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:8 x2 K" s! t  \, P& U
2 H( U/ t" \& y* b+ Q1 U1 w2 c
微信图片_20240118182652.jpg

  `7 K' b3 W. u/ ~# S( x
图29. 按键回调

! G4 I  Y2 g" W4 I5 d

% V3 X* b& m7 p7 ?% J按键中断服务函数中调用:) v* G. Q+ N' ^$ g, ^; e
/ A6 \1 p! P% F; z% X
微信图片_20240118182648.jpg
% c7 G! Y% D) J& j" y, d# b
图30. 按键中断服务函数
7 m4 w5 S3 @/ ?  \5 Y! r
) g) ?, Y) x4 D
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。
3 ?3 [1 y$ `9 n, d& K
* o& g- S' A& ~/ q$ h4.5验证功能
; b7 h5 b1 f/ f4 W4 }2 Q' Y用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。+ X& i) h+ @0 U) Y2 a0 j

$ H# [/ y9 F$ [4 [6 Y, ^& X" p
微信图片_20240118182644.jpg

/ ^( E! S$ d6 f, t* e/ B
图31. 用户工程广播名

  ?3 v  x1 W" e9 o; a! ?5 A
9 X. M3 \+ Y/ A8 W9 G
连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:& I2 V' Y) w( Q. z, p3 r
) r8 p7 Z/ C) `: ^
微信图片_20240118182641.jpg
9 A; {7 j, q6 z" k
图32. 使能订阅
' a0 o+ m% E- L! `, f( f# ]

, J7 c5 {2 |8 }# W; x通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:
- X, Q/ M/ t) G( X2 I
% n- S2 g6 U* E& j4 r) x. _
微信图片_20240118182637.jpg
' L/ d: ]4 c$ g( t1 Q% q- I
图33. 用户工程 LOG
4 u3 h) n% {: A5 c$ ~

4 c. e$ M7 W1 t+ O05小结* s, y! \: z6 M0 s4 }% V
跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:
9 w, x: o9 e9 O+ J3 x+ H: q4 R0 E. J( C3 n3 d* M9 A
微信图片_20240118182634.jpg
. D  F; V8 I; U
图34. 软件层次架构
( U3 h5 C* r+ K3 F9 H3 C1 q) Q

( R4 j5 H3 M! q! G/ }8 l! T

% ]6 x  L. y# n# R: c
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:+ a5 }6 l  T. t5 ?

0 l3 K" G) t: H! V5 |9 T' g
微信图片_20240118182631.jpg
7 j$ Y3 M4 r2 d! q2 W4 |
图35. 用户层文件

4 g3 N0 x$ ~, ~' H, j& A) q4 \& C
% ~* ?9 Y4 Y& U7 \
这些文件的含义是:
' H: Z! ]1 l1 f7 f* p% N• serial_port.c,用户应用逻辑的实现
6 [" h' _1 d) x! n+ S( ?) r6 q5 `+ p* o• BLE_SerialPort_main.c,程序入口,程序主流程
+ M7 i8 c4 r! M! Z% ^: o• gatt_db.c,BLE GATT 层功能的实现; m, J- q6 Z% t- o3 H
• rf_device_it.c,存放所有的中断服务函数 3 }, x  o6 |& d/ I8 l. f$ O. [; p

  N$ n6 _) t2 }# g; J. C* Y上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:
$ K: {" N' T, |# D' d, b) f  \: ~6 V) Z' o
微信图片_20240118182628.jpg

; l; e* n& i( y# w& T

1 L7 ^7 Q% a- a) C' P
5 Z8 N5 s1 w4 c3 Z) V6 y( ?
图36. 系统流程
  ^- L( @! k& v5 `7 j+ ^

- ]+ O' z; b: X7 {5 T) zBlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。
1 H% z% ]9 b" n. ?
9 t' Z% @# l) `

5 F  q' m6 i% K3 H# A7 v4 @2 x转载自: STM32单片机. T. Z& M" j9 m: z; s' T! C
如有侵权请联系删除
5 G7 f& r9 ]( \' M# f4 A0 K* {/ V  f6 H0 t  ~1 @- Q$ i

( c9 C: V# }% v; X* o6 B7 Z! v2 Z  v, e" B8 R9 l
收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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