STMCU小助手
发布时间:2023-10-15 19:34
|
01引言 8 E" z [% {$ L- S) b" ?9 E0 \: o 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是能实现上述功能的。3 ?' Z( J5 J1 q- b! j8 }3 u7 ~7 o/ T/ d : y; b/ y1 x) X( G- [ 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。( g1 U" S9 V4 V! b: q
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景! j+ n0 N/ h' j2 ^% m9 q2 G! L : T' w7 I; Q4 P2 ]! T # _( x3 K6 @4 e5 y0 |+ G. |: ` 02STM32CubeMX实现步骤2 h' j; c. j! e! t+ d 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 7 H. ^5 E' K9 o) t* X i; n6 F 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程+ f | h4 M% p, N7 W4 X+ D
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。 ; r) h7 z$ ]& Z- ^2 o% d; [
/ M: R( N% R$ K8 G% w! V 2.1.3 系统配置:调试口 / F( x2 K6 d0 N8 A
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE) + J% ]5 s8 x0 R8 e U
3 Z6 I" _9 z7 G; \2 C6 q5 a3 M 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB75 Y" { k8 h$ q' Q8 D, { V 8 K# P- Q7 p# }' R8 ?3 f: Q! G: j
使能USART1的TX的DMA功能和USART1的全局中断+ @: W* w; A$ p" j: _9 c
" Q) F% {% A o+ k. U( Z2 u& D 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 / K- A" {* O6 d4 l% s8 T/ f
& j, n. q8 C3 h ~9 v Z 2.1.7 外设配置:使能RF,它完全由BLE stack管理。 9 ]2 a% N" c4 `+ ]1 W% f
# h& n! A9 E6 o/ p t) X* ^0 C 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
5 i$ g: K; L. R# u 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。6 u% A; ?& W3 j/ J3 K5 n2 ]
2.1.10 外设配置:配置时钟0 }7 c1 K; e% N+ k( K4 M+ @
- o0 g+ Q9 G7 m T4 f/ o 2.1.11 外设配置:NVIC的配置$ s2 E$ Y9 J* s+ `2 F) x
至此,外设的配置和添加部分已经完成。! R. i6 `1 u5 u1 _0 I* h 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈# T8 c; l2 ~- l! ~: g; E3 [ ! W M' F$ _% s! A! e
5 a+ S* ^$ b7 s2 R8 @7 w# p 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"& {. o3 V# D& t4 V# O$ `
" Q" x0 b" H7 t; l8 b 2.2.4 协议栈配置:GATT服务基本配置5 x; c! ^& Z2 M) F) w
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值- c) C' c" ]8 ?0 E/ R6 ?% e
6 d& h# a b! a+ b. f" ]8 [2 Z0 } 2.2.6 协议栈配置:配置GATT写 服务特征及属性值
# T9 V r3 @9 X; F- d) R, f: Z5 x7 j 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 / M: o: D4 }) O% ^. x2 I2 \4 l
" a8 P/ N6 x9 s, O2 }$ T: O1 [ 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值- w* o! j" a1 O. F2 x& f8 } : ^7 C# Z6 S O* g* [
2.2.9 协议栈配置:配置GATT广播参数配置 4 _9 R2 z8 @* {% R+ R! \, u
' u b3 R' E) G' T, F6 N 2.2.10 协议栈配置:BLE配对参数设置 , b$ O9 ~: S, t p$ N
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
2.3 生成工程代码并初步测试) a O* g- Q5 X$ V 2.3.1 点击“GENERATE CODE”生成工程代码 - H' ^1 W6 J" F) S8 I
0 O: H& s0 J+ E, v: T& m. z 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 * q2 O8 q r/ t8 n 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性4 S7 I0 Y5 C3 i4 J$ A4 Y2 h O! O; W+ @2 O8 k% `9 N 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
( I0 p( T/ C; N8 }" [% I 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。' u; C% Q# W6 d) f( H
2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。& P" o P: }/ s7 m9 Y 8 y# H5 O$ W( O% s( Q/ C
& s, S3 R# S. A9 X( B BLE应用代码添加:定义用户数据缓存。% A m7 S+ ]# S! {$ ~8 m 在“custom_app.c”文件中定义4个用户缓存区数组。 ! _' ^. E: F- `' l
! T) W9 Y7 [; ?" m BLE事件驱动代码添加: 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。& T8 ^: Z1 b( {" U F 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。- ?2 A1 l& p% V, y! ?5 Z/ ?$ q# M 2 ^2 S" m2 p2 p. s, H. V
; d0 S. e' @; i( R( e8 E 上图对应的代码文本如下所示:
! t, {" d0 N _; p6 E/ u4 D% J " ]8 _& ^$ |) \% Y- g+ k( ^, I 上图对应的代码文本如下图所示: + e, G* e( n6 }
" u+ i& Z/ A1 g+ X 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。" v7 x& ~* K- r; P
& \: z0 `5 k; d 上图对应的代码文本如下图所示:. Z$ ^+ H: @4 b& l; D0 m0 R
7 {. v$ Y7 q6 Q 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码% z5 ]; |! H( V, ? 8 z5 K( s( u8 D5 F+ i
上图对应的代码文本如下图所示:
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
& B1 D9 g' f: d- N BLE应用数据代码添加:1 E) ~' e; R3 X* P 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。+ w: T$ r# O) K/ i( n4 E( W 5 h9 n& z6 M+ ?: }
2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节' T: u8 g* Q" g* e 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。4 Y3 {9 |: ] G: R
至此,所有代码更改完成。 03测试平台搭建及功能测试 X7 B. W, Y. k( P& G% b: H4 n) e : Y5 h4 L8 w6 I1 O: O' x 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 0 z1 x t0 K( C ]" Q 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的
查看当前FUS版本,并将FUS升级到最新版本
5 a7 M+ O; T: n" z1 l; s* Q 如果当前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”。6 K6 J& E: U- k. n) w6 s9 P |% N
- I3 h6 l& C) ^" G5 E 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址- h8 ?7 n8 r. P% J; O! Y & u* |$ v: b8 K/ P, s
, p5 ^) M0 q. k5 i) e 3.2 测试平台搭建及验证 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
) v/ v! U) \3 E 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。' S6 @* ]: E) y$ F x9 b. X , V- p* W5 y" [4 ]) r
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试. P7 n8 d4 I% N% V
* C: {8 b1 R0 O9 F+ G# d 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& x3 ]- e+ P. J 8 _& D. h/ {0 a3 T: _" o
3.2.6 手机App写User_Write_Data[64]测试- E. m7 k, M; t8 q & F0 F) h" r7 |' X# Q
3.2.7 手机App读User_Read_Data[64]测试。! H% ?) ^3 A/ r2 r8 |# m+ t 6 |+ l3 D; |9 C! M6 Z2 I
" Z, b, z) {( a$ R$ K 3.2.8 通知数据访问(User_Notify_Data[64])测试
至此,整个验证和测试过程完成。0 E$ p1 K$ L. w& g# ^# N 2 U( \: A# g/ i% \8 n' L! ^$ g) Z 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 , k1 s; {# Y9 c! v" y8 [5 V 转载自: STM32单片机5 o# [: _% g% v3 z |
低功耗蓝牙无线升级: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案例来参考