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

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

[复制链接]
STMCU小助手 发布时间:2024-1-18 18:34
01前言. ?( C" T2 Y6 _; e
本文档指导用户快速地对 BlueNRG SDK 有一个直观、清晰的认识,了解其软件架构,以便顺利地学会利用 SDK 开发自己的用户固件。 5 v/ H# d/ G: z. r: e" r# n- o

4 P, s, ~( v6 B; ?6 o% N( Y0 \, s本文档所述 SDK 为 BlueNRG-LP/LPS 芯片的 SDK。阅读本文档前,用户应先了解BlueNRG-LP/LPS 芯片的一些基本特性,以及其配套开发板的烧录方式。6 b6 u! n( W" U' R. n( G% _

: Q; S/ s6 R3 v5 k. `( {/ m02SDK 目录
: A; e. [. v7 P7 i1 U从 ST 官网下载 SDK 的安装包,成功安装后,即可获得一个 SDK 目录。见图 1:
  P$ r7 M& R. c1 l) ]- c( H$ J' F5 u4 W  n/ Z) n
- C5 V2 r3 e! S
微信图片_20240118183417.jpg

7 ^# \' l! x0 {8 x& N8 J
图1.SDK 目录

" W6 G" H0 z% P# U  V$ ~+ _  l* B
% Z# ]  B$ f/ q" E% O" N' f% P
1 |+ F+ d8 _& A( n' h; B
各个目录的功能说明见表 1:. `: r: ^1 ?2 z) {2 T7 T. @
微信图片_20240118183414.jpg

8 R  z8 M1 t2 `
表1. SDK 目录说明
) j) H9 m6 y/ Z* N/ q
# D3 v/ M! v, R
BlueNRG SDK 安装目录为用户工程师开发 BlueNRG 平台提供了一个便捷的入口,举例来说,有以下几个场景:9 I: i$ I2 o& k' u* n+ A: y
1. 硬件工程师设计 PCB 前,可通过 Docs 目录找到硬件设计指导文档。完成 PCBA 制作后,可自行使用 Navigator 工具通过串口烧录 Firmware 下的应用固件,验证板子功能。5 @7 ?: t+ ^% m' T3 x- }

$ z: x6 W7 i) v8 S- O2. 当工程师想用板子进行功耗、射频测试时,也可在 Firmware 目录下找到合适的已经编译好的固件(测 SOC 蓝牙功耗可用 Beacon,测射频参数可用 DTM)# ?* y+ [0 m) Y) }2 B; V
& D8 m6 n, P- J+ r$ i
3. 固件工程师可在 Projects 目录下找到丰富的例程,并且可使用 KEIL、IAR、WiSE 任一个IDE 打开工程、编译、下载。
) J$ _4 K' r& D  A$ A, B2 e, n: z
4 l: }, i. m6 K: I4 r, C/ b03SDK 例程
, k* \# a- q$ z  _% YSDK Projects 目录包含了以下三类例程:. [3 W( J( L0 f
1. Periph_Examples:包含了芯片外设驱动例程。3 o, L* d1 Y+ a. W$ \
2. External_Micro :包含了外部单片机的例程,应用于 BlueNRG 芯片在系统中作为协处理器的场景。
' w3 H5 `% r) P4 f) b$ `3. BLE_Examples :包含了蓝牙相关的所有例程,这些例程的工程特性展示如下:1 }. u& t2 W$ q8 S( x( L
6 k" G3 i$ J5 {
微信图片_20240118183404.jpg

5 y2 `7 D4 o$ c4 q" D% S
表2. BLE 例程说明

6 @% a( k" k1 O$ @( F* @0 M

5 Q  R+ W3 _; ?% a  P
04快速实现用户固件功能, S1 @5 k- D9 `8 B) \9 @
本章节指导用户如何快速地在 SDK 中找到相应的 API 接口和位置,以便掌握在 SDK 例程上添加自己的配置和用户逻辑代码的方式。
. X1 |+ K: j8 P
+ `  D9 u! ]1 q6 _" Q& x在对 SDK 提供的例程的功能有所了解之后,假设用户面临的一个开发任务是:- i. E1 M* o  u
1. BLE 从机功能,包含以下配置:
$ g3 q* z. S1 R# n$ G* C- i3 x    a. 一个服务,一个特征,特征具备 Write、Notify 属性
5 f( h4 Q7 T4 r0 h5 B+ \# o    b. 设备广播名为“Hello”
, |7 H- z0 Y8 |2. 使用手机 BLE 工具和设备通讯,打印通讯过程产生的数据" ^7 k" W5 ~+ c! a/ X8 y! N
3. 自定义协议,实现以下功能:
0 g9 `/ m+ N# v+ ?. H3 f  ?    a. 控制 LED 亮灭6 I$ ]5 B$ T% F
    b. 定时 1s 上传心跳包,内容为连接后的秒计数值/ e1 E$ f0 S, P8 \. K
    c. 每次按键上传按键事件通知
4 {! `# A1 L! m% F' `/ M% n% P- B. \
/ E! h5 o8 i8 X3 ~* r8 R0 o% d基于以上任务,我们可以选择 BLE_SerialPort 工程作为基础工程并以此来进行固件开发。3 n8 u7 F. O( I) f9 Y3 p+ _
7 W) f8 ^5 J- e
4.1. 验证原始工程
) c! i, E' h" F+ @7 Q- `) m( V在添加用户代码之前,我们最好先验证了原始工程(BLE_SerialPort)的功能,确保开发环境正常。新建一个用户工程目录,比如,test_sdk1.3.0,然后从 SDK 目录拷贝以下文件到我们的用户工程目录,见图 2:
+ v& j& O4 b' t8 v/ `5 d) I( H, E3 ~7 L
微信图片_20240118183358.jpg

% K* i9 _' v7 ]% v
图2.用户工程目录
9 o3 J" I" v  F$ J

* s# h: T6 {% g! L- ^( s7 x! h打开 Projects > BLE_SerialPort 的 Keil 工程,勾选“Browse Information”选项,以便使能工程内函数的跳转,同时选中 Server 工程配置,见图 3,图 4:* ]  ]5 X0 Q; m

; C" B8 r8 a& W, q1 w3 [
微信图片_20240118183350.jpg

! I: b) x2 q* P/ B! K
图3.Browse Information

1 S+ c  _! v& ?' M$ D

1 F5 d9 D% }% s- ?
微信图片_20240118183346.jpg
) O& U. F) Q5 d; _2 @9 v3 x& _, a
图4.选中 Server 工程配置

& `9 Z' ^. _; q8 l8 F" l
0 U$ m' l7 L% B8 y! P. f
编译、下载工程到开发板,工程运行起来后,应能见到以下打印信息:
% ?, R" C# ?) r' E2 E% ?8 [- d$ [
微信图片_20240118183336.jpg

4 U3 D0 L3 l& F  w8 v7 p0 m1 e
图5.BLE_SerialPort 工程 LOG 信息
& }: i3 _' O, [  i7 F
9 n  l8 |$ {* ]6 _
使用 STBLE Toolbox 工具扫描该设备,应能看到设备名为“Sport_LP”,见图 6:8 j- `& h! q5 B4 M" i

9 E; F: K6 X& {! \! Q
微信图片_20240118183330.jpg

' J; s- O9 N0 @: X% w
图6.STBLE Toolbox 扫描页面

4 d5 b( k0 B! V3 Q  b" c( y

9 z/ b; J% M# e# G9 I2 o至此,原始工程已经正常运行起来了。该工程实现了自定义服务、特征的功能,并能通过串口和手机进行数据的收发。要完成此次开发任务,我们只需在特定位置修改一些代码即可。
2 }  `3 H0 {$ ]5 ?- j, h5 m

( r1 U2 F2 H# f* c- `% e0 p4.2. 配置 BLE 从机功能- ]5 K, \/ i- i5 N
原始工程有两个特征,一个负责发(TX_CHR_UUID),一个负责收(RX_CHR_UUID)。按照要求,我们需要把他们合并为一个可以收、发的特征。图 6 演示了定义新的特征 UUID 并注释掉旧的两个特征 UUID 的方式:
0 d4 I$ T4 {* h* n3 s9 w8 K( L
5 K% l; Q0 f' N/ {
微信图片_20240118183325.jpg

( y( G. u; ?3 t' w6 r$ T
图7.特征 UUID
8 j( B) S: O4 s6 S7 a2 R3 F

+ X7 T# `) c3 N9 l协议栈提供了 ble_gatt_chr_def_t 类型结构体,用户可以定义一个结构体变量并赋值,以此来声明一个特征。图 7 展示了我们所需的特征配置的相关赋值过程,图中可见特征的 UUID 声明,特征 notify、write 属性声明,特征的特征描述符声明等信息。另外,旧的两个特征应该注释掉。
% S- N; f, K& ^0 |; S1 F& P+ \( o
7 [! a" @6 e9 k& g. j0 o1 N1 a/ \
微信图片_20240118183320.jpg
  ~; d5 c% O; i+ I( H- h9 [
图8.定义特征
  k' D) N8 g# y! d
$ l8 Y- U8 s2 _% ?' q& \) i' w
6 s1 I& u  e! t& ~$ ~
将新的特征配置赋值给服务声明,特征的数量修改为 1 个:% H0 [! k8 D, M# m

* n! i9 m" B: R$ t: K5 m4 I: i8 a; I  K
微信图片_20240118183230.jpg

' f( l+ o7 F# O$ G2 |: A3 v; G
图9.特征声明赋值给服务声明

; d0 m$ ]$ P8 ^
/ u* N1 b* W2 ]! o+ p2 a, B
上述服务、特征相关的数据结构配置完毕,我们还需要将这些配置通过 API 传递给协议栈。 3 ]1 n" R  c, v' H6 I1 n

6 A6 T' n: A: u" r* I首先,需要先定义一个新的句柄,所谓句柄,简单地说,用户在进行数据收发的时候,需要选择在哪个特征上进行数据收发,此时便需要句柄来指定特征(句柄本质上便是 attribute 的handle 字段)。原来的两个句柄也要注释掉,见图 10# ?3 d8 x8 K" T1 b, i& U

; k  }2 f. R0 G+ D& j
微信图片_20240118183226.jpg

0 b5 ~& G# i+ C/ A# O8 j. d4 Y
图10. 句柄

! @% h! V) d7 ^" @6 F1 |. O0 \

/ j( Y  k( Q3 d1 T" q然后,将上文定义好的服务、特征通过 aci_gatt_srv_add_service 函数一次性传送给协议栈,协议栈对这些配置进行解析、构建完整的 ATT 属性表,保存在内存中。之后,用户可使用aci_gatt_srv_get_char_decl_handle 接口获取已分配好的句柄(见图 11),此后的数据交互过程将频繁使用该句柄。! n5 K! g. c4 O# {. }, \; B6 m
% K' W1 b5 j" |4 Q. L% q$ C
微信图片_20240118183220.jpg
5 ~" L* X' }+ Q
图11. 获取句柄

, c$ F7 N" }; Y" E) Z7 b. d' e6 q) s
! \% k8 S4 ]$ Z
至此,GATT 相关的配置已经完成。但是,由于上层大量引用了旧的两个句柄进行数据收发,因此此时编译会出现比较多的错误,此处暂不处理这些错误,先完成其他的 BLE 配置。
( w- h7 [9 N  [; @

0 \/ D0 e0 v+ {接下来修改蓝牙地址,并修改广播名,见图 12:
8 l! |( ?  f% E4 k
3 I( V0 R9 M- w
微信图片_20240118183215.jpg

4 j! V7 O+ h: I
图12. 蓝牙地址和广播名
8 h, ~" a; p. D& V+ i* S& K5 {& r" g

3 Y5 B# X; t' R! B; W5 g广播名的长度改变后,应注意指定其长度:& K+ K9 Z* t* |- J. ?; [: a9 J

* D5 A, V+ h- T9 ]8 h
微信图片_20240118183210.jpg
9 |& p- o9 F. T, R9 R- `5 P
图13. 广播名长度
1 W# i# }2 P. S
3 y2 S7 W* D1 v" B. {  i8 N4 t
LOCAL_NAME 设置的是广播包里的设备名,当设备连接成功后,主机会从 GAP Profile 的device name 特征里获取另外一个设备名,此处应保持这两个名字一致:
: n5 [: Z$ [' }3 ?, J/ a6 j" s$ i- B. j; Q
微信图片_20240118183206.jpg
( I5 L) \# {* l7 z  K; A
图14. 设备名

+ o- r, p$ h  W  L! M5 N5 `
  ^& L. U" ~# C

: P5 Y0 ]5 ~+ v1 Y# A1 a. b
微信图片_20240118183202.jpg

- B& b! z, ^$ n3 ^
图15. 设置设备名
6 T( m# p& T$ J- B

( f: }8 ]7 l! q8 F* b至此,关于蓝牙的应用配置即告完毕。接下来可进行数据通讯相关的配置、实现。" t+ j1 S* P% p3 R! y- h" ]+ t- j( A2 t$ D
9 I2 @% X( l, C0 w3 L9 V
4.3.和手机进行通讯- ?, J6 x1 z$ j
上一小节配置完从机功能后,编译会产生大量错误,是因为 BLE 的通讯过程会比较多地引用旧的句柄。循着解决这些编译错误的操作,我们能了解到 BLE 通讯的过程。具体操作如下:
& m! D0 C" ^& K$ r9 ]2 n9 _) @

! I$ ]' h' a: b5 Y全局搜索旧的发送句柄(TXCharHanlde),我们找到了用于数据发送的协议栈 API,修正之 :
4 q. }+ p/ d" S. X6 V9 [* `& K: @- m" z6 [1 Y* t
微信图片_20240118183158.jpg
; r2 k: x; ?  }. u  e. c
图16. 发送 Notify

* I9 c# L. I: B- k

. ^4 \6 X% K; f手机使能订阅后,会通过图 17 的回调函数通知上层。此时应该修改为新的特征句柄,同时,添加一些打印指示 notify 的使能、禁用状态:
% S: ], N( g0 U+ p6 |% M) g4 U# l% l7 ~3 y# A1 K2 c( L" u
微信图片_20240118183153.jpg

0 ~( K" }* l8 [( V
图17. 使能订阅回调

9 N+ I% ~% v& J

0 `9 q1 W, t" {/ }9 I4 Z添加新的特征句柄全局变量声明,注释掉旧的:+ w- O2 ?, _) b6 b' C/ E% U/ a
6 F1 `* [/ p% i5 u9 h5 K7 |8 o
微信图片_20240118183150.jpg
/ p, `$ [, P% {
图18. 句柄声明
2 m# p; _! U7 @- u0 t

0 U! q3 G: h% C/ \9 a+ `+ F% C

6 W4 I8 H& O5 m) s/ I
关于旧的发送句柄(TXCharHanlde)的问题已经全部解决。继续搜索旧的接收句柄(RXCharHanlde),我们应能找到设备接收手机数据的函数接口,将其中的句柄替换为新的特征句柄,见图 19:
  m( S  w, ~4 g! d! Y+ D. b' g$ p6 G4 I' l+ Z* M. C
微信图片_20240118182724.jpg
/ e. F# g1 L: X; B" H) z4 [% C% Z
图19. 数据接收回调函数

. a7 X, l' W3 @

5 j+ r8 s  E6 k2 R2 L至此,我们应该能通过全部编译过程,并且已经找到了数据发送、接收的位置。此时可以在这些位置添加数据发送、接收的打印函数。接收数据的用户接口见图 20:! K' C* l$ ?9 L: q  E1 \

& H0 r2 ?- V# T5 S
微信图片_20240118182720.jpg

1 a5 T8 y' H( R5 O
图20. 用户接收 BLE 数据
3 `' i6 D& n5 G$ A4 W8 n
$ ~) X6 V4 T6 F6 Q
# g* ]0 z# R. O
关于发送数据,原始工程实现了以下处理流程:
9 n. M3 e5 l& P1. 从串口接收数据
/ U7 s  f1 v' _* S2. 解析数据为命令并缓存这些命令
- d* G3 `# d+ R3. 通过轮询的方式,不断将命令缓冲区里的命令发送出去
1 r5 r, N7 i) o) k% A) j; Q
* y$ ]- M) B, X7 B; q  a: E, z+ `该处理流程不适用于我们的任务要求,我们需要先取消这部分功能,见图 218 v3 S# ]- S; M  m; |/ K
) Z+ {3 x( n+ E5 f# M
微信图片_20240118182717.jpg
5 ~; S9 Q# G2 D3 }4 l& p4 z
图21. 取消原有的数据处理流程

- q  C8 w1 i- G- a2 @3 c
- N3 n4 l; z3 Q- }) U2 o) E8 Q1 s, ^; T
然后设计自己的发送函数,见图 22:
  X  R- K7 U0 k3 o/ d, F. n
( k8 W; h+ R! ~3 s, _
微信图片_20240118182714.jpg
1 w: o# ^1 k7 ~+ p2 @
图22. 自定义 BLE 数据发送函数

9 }, D. Q6 z2 f8 x" D
2 E# i5 K1 r6 b4 H2 r" k0 `5 n2 t' z5 ~
至此,蓝牙的通讯功能已经全部实现完毕。用户可通过:* D' k4 K+ p$ g# }3 L
• Data_Received()接口接收数据
/ G2 [" I: `1 _- w0 Y8 e• user_send_data_over_ble()接口发送数据
+ T/ Z6 \  a0 ]" b# \: ^, i
$ O9 }7 e7 N, t4.4.添加其它功能4 i+ _3 O" W$ l8 J: B& E; e
根据任务要求,我们还需实现下面三个功能:( i# E- M  M$ C+ q
1. 控制 LED 亮灭, L3 E2 X( ~2 c+ V
2. 定时 1s 上传心跳包,内容为连接后的秒计数值  H; J$ o, |& ?; W( W& D
3. 每次按键上传按键事件通知下面开始逐个实现:
& \% J! _4 Z, J5 |) a) L( t5 u# e* S* r) j. {; C# R! q# e
4.4.1. 控制 LED 亮灭
, v! q2 {+ J- O7 i; o2 [# S, z首先,实现 LED 亮灭处理函数,
* r1 @& }2 b; e4 z( N$ ]
/ V; j% G( x2 L* O( q
微信图片_20240118182711.jpg
0 k$ \! d2 [# j+ i& C
图23. LED 命令处理函数

# W# c" V6 r  c: [( i0 A. b2 x; }
- ?3 L( {9 r# A0 O
将其添加到 BLE 数据接收函数处,见图 24。LED 控制功能实现完毕。
7 \9 r6 V2 ^! o9 M. F1 j2 F
5 z  R7 ~3 N( {+ _2 S! Y! R0 W
微信图片_20240118182708.jpg
- w+ L. E5 A6 Z* \
图24. 接收数据后进行 LED 命令处理

& M0 n) e+ v2 U2 n& f- W( i1 M

' n1 r. E' `9 g7 H+ k  c" s4.4.2. 每秒上传心跳包
% ?" \7 S$ w% q" E( U# j0 S( s1 ~首先,实现心跳上传处理函数,实现当设备连接后,每秒上传一个 4 字节的计数值,并使用0xaa 作为命令字。见图 25:9 }0 W5 C6 D+ f- H0 R
2 C& \, X0 e3 L7 `- I
微信图片_20240118182705.jpg
" A+ R2 w6 n& C
图25. 心跳上传处理

( n- K6 P2 G9 i9 h( @

* D$ y$ G* x, J+ `+ c' s将心跳处理函数添加到系统任务处理函数 App_Tick 中,App_Tick 会在 main loop 中不断地被调用。心跳包需要在蓝牙连接成功并且使能了订阅之后才可以发送。另外,使用 timeout_flag变量来控制其每秒只被调用一次,实现方法如下:9 ]& B/ e: G: _

3 p3 b" y+ A8 R" l9 F
微信图片_20240118182702.jpg
. X! P7 ?" }: U
图26. 心跳处理
0 `: b3 G- Q. d+ A
+ D( i2 Q, U, b+ d0 K

( ^) H9 y7 N( R$ M- H
上述 timeout_flag 变量需要使用每秒循环的软件定时器来周期性置位。软件定时器的应用方式很简单。/ q2 ~. l/ A- Y/ B! g
1 J8 n4 Q* Y) |' D" b( y
首先,实例化一个定时器,并定义超时回调函数:
9 W4 \1 z( z+ @) |1 Z- Z  d* R; ^- b9 ?+ Y2 A2 u& C6 P# }
微信图片_20240118182658.jpg

& G# C* g5 w+ N$ i  o, z
图27. 软件定时器实例化

  ^2 c7 n4 ~$ j6 `6 A  T- C, _

: s2 }4 ]0 W  [然后,在 Serial_port_DeviceInit 函数的末端位置注册超时回调函数并启动定时器。4 N! u+ C. c( }* a; z
  h8 n$ h/ b2 o+ F; M, @
微信图片_20240118182655.jpg

1 B, X. K( l* Y+ e
图28. 启动定时器
% Q- G# P! \5 b- j( Z

5 F! t  B4 p* j4.4.3. 上传按键事件
, Z; k0 b2 W7 `+ G首先,实现按键回调函数,该函数在按键按下时被调用。发送按键事件前,应检查此时蓝牙是否处理连接、已订阅状态。见图 29:+ `3 i1 o- \! G, @$ Q" C! a! h+ _

: m7 }4 l# k0 V3 M1 \& B3 M
微信图片_20240118182652.jpg
1 b. L. c8 f6 B1 ~. i$ p4 i$ b7 W9 }
图29. 按键回调

; j6 ~) j/ ^7 F2 Z' y

& E% ]. j/ J& O3 L/ z按键中断服务函数中调用:& H# z# d/ Q* o. R( v! U/ F( [, y
, h$ g8 d6 {/ n3 Z, [' }
微信图片_20240118182648.jpg

" J: u5 O- H. Q2 L
图30. 按键中断服务函数
8 b8 h" Q. J$ c, c: O8 v5 S5 d

( U; c) H: A# c0 B; R  {& U0 P4 V* A* J
至此,开发任务的要求已经全部实现完毕。接下来进行功能验证。# Y* {# T$ c0 k1 f5 W4 e
' H# [1 v# L9 }
4.5验证功能4 _* U7 D9 [( j( G) B+ Y
用户工程运行起来后,用 STBLE Toolbox 扫描,可见广播名已经修改过来了。# g5 ?) |* ?3 _+ {& x
4 J; P- C* e$ x- j2 }: C0 m( @2 {
微信图片_20240118182644.jpg
' ]/ a6 L2 p1 n: |$ q
图31. 用户工程广播名
0 C& ~/ {) g+ F1 X! A# M

8 X6 {# g& b0 ]% m连上设备并点击 Notify 开关以使能订阅,可观察到底部已经开始接收到设备的心跳包数据(以 AA 开头的 5 字节数据),该数据每秒钟变化一次,见图 32:9 z$ G6 g( F1 C& j
1 e8 c- @* K  z
微信图片_20240118182641.jpg

5 V- R' |, p+ e* b. s+ z  R& l7 ^
图32. 使能订阅

7 y; i* x9 N" x! t, d3 i* w

- n7 z1 j% `# i0 N通过 LOG 也能观察到心跳包发送情况,此时如果按动按键,也能观察到按键事件已经发送:9 m9 g* M$ e9 Z, d: v, ~, L* W  ]

0 d3 b: [& ?) z( W8 D) O
微信图片_20240118182637.jpg
, ]& P9 R. ~+ q
图33. 用户工程 LOG
  u) n1 I' u8 T7 w  E  c7 @4 n( T; U  v

' d" Z' [8 [  N5 z; U8 ]) {8 }05小结
2 c1 e2 v! C" y1 T3 p* X. G跑完了上述用户任务开发的流程后,相信用户对 BlueNRG SDK 的软件架构应有所理解了。BlueNRG SDK 的软件层次架构为 STM32 典型的三层架构,分别为驱动层、中间层、用户层:  Z& K3 Y* i. P' @; H% w- N8 T
+ j* b. e- A, w0 b: w5 _* S1 T
微信图片_20240118182634.jpg

7 G% B* f; {8 C/ o1 x/ }" A4 j0 ~; {
图34. 软件层次架构
4 m* \4 c2 s5 W

9 O7 f; q: ~4 h' r/ ~

1 r. x' y; P& e) x
上述添加用户功能的整个过程,其实只改动到了用户层的功能,用户层包含以下几个文件:7 `7 R2 \7 d& ^- H
+ a! M  v) J& A0 p2 W+ ^- Y5 c) s
微信图片_20240118182631.jpg
, n1 s2 _) Y; ]5 a
图35. 用户层文件
. E- J) X7 A  `6 ~# K

& Q" f- ^& `8 N0 T1 q这些文件的含义是:
; a1 A1 f- o, T) R1 d6 O8 g• serial_port.c,用户应用逻辑的实现
: P; a4 z/ h- Z4 E0 e! {8 F• BLE_SerialPort_main.c,程序入口,程序主流程2 ]9 Z0 r( G, B5 j
• gatt_db.c,BLE GATT 层功能的实现
) l" U2 E5 W0 @) l+ X• rf_device_it.c,存放所有的中断服务函数
. b, O' U$ R5 F2 Z) O3 m# J8 {. \+ M% |' m
上述用户固件的功能,大多都在 serial_port.c 中实现。BLE_SerialPort_main.c 函数则实现了系统的主要流程。简单来说,BlueNRG SDK 的裸机系统即是一个前后台系统。蓝牙事件、按键中断等属于前台处理,负责置位相关标志位和状态,main 函数的 while1 属于后台处理,运行蓝牙协议栈、用户任务处理等后台任务,见图 36:. a* k% s% e; m

% H- W* a8 _2 W1 o
微信图片_20240118182628.jpg
  f8 |+ _( F  ]4 ]: l$ |
7 U% ?1 I) v( t2 [
% f8 J: C/ C+ c
图36. 系统流程
% O' W7 e( P6 x* g: K* G/ j; g
/ |; w% t) z5 T
BlueNRG SDK 中的绝大多数例程都使用了本文档所述的软件架构,即前后台系统。该软件架构比较简单,优点是用户能非常快速地掌握其流程,能够依据本文档的示例快速构建自己的用户功能。缺点是功能比较简单,用户需要在此基础上再添加一个调度器以应对复杂功能的要求。) G. N0 ]0 z7 O% M3 Q1 a% X3 L0 ^

' y! I; S; ]; {# d) E4 C- ?0 G& W) W
+ C* |6 D+ z: K. F
转载自: STM32单片机; D3 W+ U' ]) f5 e
如有侵权请联系删除9 S9 x, V6 K3 e3 p8 }* t

- x& m) r6 q) r! J+ _
5 D6 k1 w. @& h8 a1 S2 }; J

6 A; G% M) g( H* _
赞 收藏 评论0 发布时间:2024-1-18 18:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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