STMCU小助手
发布时间:2023-10-15 19:34
|
01引言 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 z9 C1 p. {8 Z# G! F # o, M1 w% C; o, @5 [+ }0 ` 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。- H* C/ ]' m: u/ _, R; X- L4 V
: V7 S, |3 _& [+ F3 [# B 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 3 u& B" c# {7 | . \$ g! N5 K5 R 02STM32CubeMX实现步骤 m* F+ E! s7 x9 X- N9 {3 u0 ? 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB* `4 h) }) [* D1 M 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
, m# d2 D) q, S9 F' D: U 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
2.1.3 系统配置:调试口! r R7 R4 P9 U3 J7 R8 c
" T+ F: @! t9 A8 m2 l 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
5 U3 R. u/ m, E0 j# U6 i' b0 f 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB75 @5 D% v0 N' a9 c " J8 }9 _0 W$ ]; X
使能USART1的TX的DMA功能和USART1的全局中断/ j3 E& T& v' g. B3 `7 O . C( X5 f& _0 h
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
2.1.7 外设配置:使能RF,它完全由BLE stack管理。/ z. G E$ p) f* P& b) ` 1 Q6 k v# v9 J' e- G
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。; s' D! s# j$ _
2.1.10 外设配置:配置时钟
2.1.11 外设配置:NVIC的配置
至此,外设的配置和添加部分已经完成。# u% F, j8 T1 D. M ~8 \ , O& ]) t+ R. d0 o3 j! S 2.2 BLE协议栈的添加及配置$ \% H# N/ ], r/ ^ 2.2.1 协议栈配置:使能BLE协议栈5 L; v9 V! {8 _. Q+ k# u2 L 5 W, H) S, r8 @# Z5 I* H1 b6 e
) C- [& d; q0 m4 W2 O9 i9 V- \8 u 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"
2.2.4 协议栈配置:GATT服务基本配置
4 ^$ [! h4 a1 {! r# G 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
2.2.6 协议栈配置:配置GATT写 服务特征及属性值& ~8 e% g1 A4 J \ 9 G' `$ t. Q) m+ i; c
2.2.7 协议栈配置:配置GATT读 服务特征及属性值% s, ~% A+ Y/ ]( k5 l
# C* T$ q2 h8 @( w9 K# Y 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值% m; |: G7 f3 X2 C! f3 h5 F! Q : V. S& C& [) \$ W8 b; L- W, V' L1 D
. k- G& l5 I- E) v, V& { 2.2.9 协议栈配置:配置GATT广播参数配置 6 e- u( Q: z/ q, [
2.2.10 协议栈配置:BLE配对参数设置3 a# {( j9 c }4 T/ c . o( R- @0 |3 l- l. a4 U2 f
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)2 R' a; P. s! b. r9 c* }* ]
0 X; X. Q3 H2 R 2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码
, V, @$ D, D& S% F' u1 ?0 P: p 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性* x" {, r! I8 {" P6 V: G 9 {# ]9 a7 W* ]3 X3 x, {5 X9 j 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
' h, I7 L- q. y; C$ W0 ?: P 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。4 ]- |8 I0 [, L3 ~* u2 V. c
2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。
BLE应用代码添加:定义用户数据缓存。 在“custom_app.c”文件中定义4个用户缓存区数组。
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层。 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
上图对应的代码文本如下所示: 6 H0 y+ w9 @: ^1 R, [( {7 O
/ \1 n* J, R, F% }7 A# \ 上图对应的代码文本如下图所示:
8 X7 h4 x1 \7 y 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
/ [2 l$ H) p$ d X" u& d 上图对应的代码文本如下图所示:
3 i0 l! Y5 T6 D4 y; I 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码! a( O p$ v# B* l ! W& z5 t+ I; B" F/ O
; R: o; a5 |4 @4 v8 U. t2 M 上图对应的代码文本如下图所示: 1 R: m; o2 N/ \$ w: M: _, J% ]: }
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。 ( @4 C9 x. D+ M
BLE应用数据代码添加:" L) u. P$ n( a$ g, p0 M: {6 e, l! W1 d 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。! |0 O& h2 V. ^. G, A2 d& f / h, U- j& }4 [3 K* |6 ^
2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)
* S) G5 w( n, ?3 z4 M 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。) F' ?( x" |6 P9 \, N1 a 7 _% h, q7 M7 x" j/ g7 B# ]- d6 g0 [
至此,所有代码更改完成。" c# l6 f! C4 V# {* l 8 p& F) |4 r- i9 \ # `- d. A/ D; P% @, J" K% c 03测试平台搭建及功能测试4 d2 [5 I. e1 |- c; d 2 ]) l: f( _- A( T; c0 T; Y 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) & B4 r: v" u( \4 v% K2 ? 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的 ! W# F1 h$ l$ l% {3 h
& |, G, a) z5 x, S' t 查看当前FUS版本,并将FUS升级到最新版本 & n0 `9 l& T; r7 P& ~
{$ `5 C$ I3 ~7 Y 如果当前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”。 i3 h0 m A& Y4 L: b
+ {1 r" h- P5 P4 b9 J- w2 o1 u \) s/ ? 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
/ l: t+ n, ^( i8 h 3.2 测试平台搭建及验证 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”3 g& V% b7 R" c# Y
2 `( P9 P: N& `# k7 @ 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。. a# T$ c3 }0 F; o5 u: p
1 S5 E* i) S+ L: o( G7 Z) i6 w! I5 r 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。- |( Z9 ~# _" u7 j; d+ N 1 s) R9 n' V* I# r, i
. s4 m# i- s) E* z% c' _ 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试 6 x7 ]6 l& J+ M; ]
3.2.6 手机App写User_Write_Data[64]测试. a9 m' L, n1 f$ F# h% O! ]
! M+ P7 C7 q. J, c# ^ 3.2.7 手机App读User_Read_Data[64]测试。 ; d/ _: H6 ^0 J! E4 f2 P0 k
; B- [4 c7 U0 x# i" Z: S 3.2.8 通知数据访问(User_Notify_Data[64])测试 0 ?$ z4 }3 v" k; R Y& o
Y$ o3 D+ A4 B& W) t) T 至此,整个验证和测试过程完成。0 v' b: K' o' a7 u9 B1 v , h9 |" T& _5 P w! S1 J 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 # s, C" [) z% h* [/ h 2 Y& J+ n: r: d$ i6 A# J' N 转载自: STM32单片机 |
低功耗蓝牙无线升级: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案例来参考