STMCU小助手
发布时间:2023-10-15 19:34
|
01引言. q( o2 F( t* I% X" P / p' ^, n* l8 ^. a* [ STM32WB55是一款支持BLE5.x的双核高性能MCU,针对BLE的应用固件包STM32Cube_FW_WB_V1.xx.xx\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE里面也提供了大量的例程,目前支持的标准GAP服务例程在STM32CubeMX中已有列出,或可以在固件包STM32Cube_FW_WB_V1.xx.xx \Middleware\ST\STM32_WPAN\ble\svc中找到。然而,在实际的STM32WB意向客户中,使用BLE私有协议来开发Profile非标产品的客户占了绝大部分。读者可以去查看BLE_p2pServer、BLE_Custom等例程,对于需要添加自定义ATT属性和服务的应用,现有例程里面STM32CubeMX是无法自定义添加ATT属性和服务。但笔者发现,其实使用STM32CubeMX的Custom Template是能实现上述功能的。5 a- P" {1 c) E. L; l' p & A: }& T( N2 O& x8 F, w 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。# P) M/ \0 K6 i; N1 }: h4 g 3 f. w. l/ F" O0 d
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景- }4 i6 I# @' M( u5 M3 n ) Q! f* @, k' B1 v- | 02STM32CubeMX实现步骤 6 m5 r6 `! \' k+ \7 F 2.1 创建BLE工程添加并配置外设1 j/ B1 Z* l! l+ l0 O; s 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB3 \7 d# J( W# r$ |& _% g0 B: c' ~5 W b$ I 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 # k4 t# O, f2 |, q& p x0 f8 t
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
2.1.3 系统配置:调试口% S# k& }+ C/ K5 z$ d
9 a. h2 H' }; q3 [) ]$ s% m. V( ` 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE): v* X/ V7 j% K# ^- M4 R+ J
7 R/ I2 V; O! Z! J 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7% A7 j" e0 l5 I 7 `/ Q7 ]- y: f9 J- s& n# v
使能USART1的TX的DMA功能和USART1的全局中断+ y* f* C8 g3 a+ G/ `, u
5 f n* e! |8 E7 ^* g 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 ) X# L/ e+ C! q! c# y4 {
; d/ z; z! ~2 j( @6 n- ? ? 2.1.7 外设配置:使能RF,它完全由BLE stack管理。 & \ g# n8 C9 `$ {
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。5 ]2 [0 _% E6 }& }/ E* O3 B 3 `2 r- P" X0 T5 Y
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。' ]7 N$ E8 \" b: u( c' l, Q
: X7 X9 M: q: c' p6 R5 X: c" I 2.1.10 外设配置:配置时钟 ' e3 ~/ D! Q1 `! |9 Z
2.1.11 外设配置:NVIC的配置) L3 S; f: _8 \) c0 V
至此,外设的配置和添加部分已经完成。! ^: b0 O. K' n! y, s & q/ m: i5 p6 {: v 2.2 BLE协议栈的添加及配置" z {5 L2 N l$ I5 ]* Z; b7 C4 l 2.2.1 协议栈配置:使能BLE协议栈
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"5 i; e+ I, N& Z6 s
2.2.4 协议栈配置:GATT服务基本配置
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值' x2 l# e/ e6 t$ l; w; r4 }, B
. s& [- p6 T" T! c- q5 G5 g2 U 2.2.6 协议栈配置:配置GATT写 服务特征及属性值# X) q$ X( S$ r/ f. _* [0 U O
! b' i9 O% ^6 c9 |3 I( r 2.2.7 协议栈配置:配置GATT读 服务特征及属性值
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值, ?& v* U" w' N. s 5 ~6 p: y9 g. ?" H
5 `# a O; H% p 2.2.9 协议栈配置:配置GATT广播参数配置! g1 B! ?1 |6 ?* X" w+ P9 ]- z$ V
% e8 L) a. r9 h& X" F 2.2.10 协议栈配置:BLE配对参数设置
& G/ X& W! o+ O+ b 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) ' v, J7 h( q% c4 V: n! }
2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码4 @6 z# ^* c0 v# C ! ]: O( s& P, r
6 x0 t1 h( B/ \3 S 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码" S; P( Y7 J* q# u; _- h 6 w4 C3 p0 s8 O 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 j$ I: K, j& X% X3 T9 {7 Z! Q8 } 7 ?! j9 I1 ^- g% p 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。1 _% g- k# r% Y. x + ^& R$ s5 z8 t. l4 m) B# R
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。
BLE应用代码添加:定义用户数据缓存。* I; o v" o6 M7 F6 G 在“custom_app.c”文件中定义4个用户缓存区数组。$ d l# ?! p* R$ C& u" L6 Q( p/ \% M $ G: A! K; f& P) z+ ~
+ @6 X+ p. B- y) p1 _; J BLE事件驱动代码添加:. w# P! c" `3 X' F* v8 i4 U 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。7 K5 N" {# A& B9 G : G# i0 Y) q' e1 L 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。7 _* o9 z! a3 U1 ?, U2 w 6 o) v: M# r2 [7 u& z* i
- u% C. |( y; J 上图对应的代码文本如下所示:3 C9 v3 {4 w! f+ V" e& x4 t
( W7 f$ \, q! c* W2 X2 W# ?( A
$ k4 @/ G! d2 Z4 t. C* j$ S- \2 B 上图对应的代码文本如下图所示:
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。7 U7 U! d& s, `
( I2 f7 C# I8 D! y 上图对应的代码文本如下图所示:, B3 _: d, X+ \+ Y
( Y& F( [. d7 T3 i. U 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 / |+ ?6 }9 i% v) C" f8 [; W
4 ~. M2 [# }' U# ? 上图对应的代码文本如下图所示: 5 T. s- D% {1 f/ m! k; J$ I
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
8 k- N) c9 V" _0 C# l3 | BLE应用数据代码添加: 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 W' L- h/ Z/ x# ]; S) Y
6 H2 h" C. v2 }- J& t$ ^ 2.5 修改BLE最大数据包传输长度, Q5 K9 `; j- f' B9 g# c" [ 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)) \, V5 s2 k% i% G1 B, p
% M4 f" q4 s- z 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 K3 M5 `; v* X
至此,所有代码更改完成。* ~2 e. T7 }3 v, H* R G% N5 I. t& h6 E 03测试平台搭建及功能测试; Y f8 O' z* q. o 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 8 Q4 h* Y) u8 g0 A 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的1 N O0 H* X/ U5 r1 K5 p
7 A- M1 _* r+ u" ?, I6 d& K 查看当前FUS版本,并将FUS升级到最新版本 , b% V! _9 n4 |2 m' s
1 T# y0 w" u$ A) J% L. C; @9 k0 t ?1 p 如果当前FUS版本是0.5.3,FUS固件使用“stm32wb5x_FUS_fw_for_fus_0_5_3.bin”,否则FUS固件使用“stm32wb5x_FUS_fw.bin”,强烈建议阅读BLE协议栈及FUS升级详细说明“STM32Cube_FW_WB_V1.13.3\Projects\ STM32WB_Copro_Wireless_Binaries\STM32WB5x\Release_Notes.html”。 1 W( t- q; V/ l |6 H! r9 y
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
3.2 测试平台搭建及验证 : `: Q* u! G/ f+ S+ M 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。4 L9 [* g* t8 ]; U) C5 h
. M2 G+ u0 ^) k& | 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。9 b) `0 c' y0 n
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试$ N/ H1 f; h8 ~$ H( y
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试 d: x j& q% F. x- i# l' Z! C 7 p! F9 w& \1 N
5 @1 Y/ x9 [ g% i: {1 k; G- A 3.2.6 手机App写User_Write_Data[64]测试
% I7 z; q9 D* Z* t3 ?2 s o 3.2.7 手机App读User_Read_Data[64]测试。! \: r( [/ r) U7 ?" T% Y* C * _6 E) s3 ~2 e/ @% j6 ]
3.2.8 通知数据访问(User_Notify_Data[64])测试 ' N% q* Y( }! D0 I
3 t' F" c' X# ` 至此,整个验证和测试过程完成。 a. m& Q/ L& l 5 [+ j& v2 K2 ~8 s8 x% y1 ^8 d+ _3 k ( u& S# \4 E# P7 E 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。; L5 }, I' [& ] 5 p; |$ X# `6 p0 k8 N, f & [2 S& @) V: I) H 转载自: STM32单片机- L5 Y/ r* B* {6 E & A! l. h6 {$ `2 Y/ x/ V0 m |
低功耗蓝牙无线升级:STM32WB OTA 固件更新技术解析
STM32WB Zigbee 自定义集群开发实战:AN5491 应用笔记深度解读
吃透:STM32WB 上 Zigbee 睡眠终端设备开发攻略
STM32 无线 MCU HSE 频率与启动时间精确调谐实战指南
深度解读:STM32WB 2.4GHz 低成本 PCB 蛇形天线设计实战指南
经验分享 | STM32WB 双核无线 MCU 开发全流程实战指南
STM32WB 基于 Custom Template 实现 BLE 私有协议 实操开发指南
详解STM32单片机的堆栈
STM32单片机进行除零运算,为何程序不崩溃?
从照明到楼宇:STM32WBx5 BLE Mesh 落地指南
微信公众号
手机版
谢谢分享,是否有其他的custom template案例来参考