STMCU小助手
发布时间:2023-10-15 19:34
|
01引言4 H* g% S* J; X' Y8 B2 J 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是能实现上述功能的。 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。( i5 ]' u3 q3 R6 J 1 B+ C3 q7 j" r9 P/ j$ C+ ~( w
, M7 w/ m5 |' l- A4 J j* q 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 9 k8 z6 |6 u$ s & A0 u! X7 R! \, u( y( ^- t3 x3 p) y7 l 02STM32CubeMX实现步骤/ b2 k! A( _& J e7 s; ^ 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 8 u6 M) n2 O4 L2 |5 F 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程7 n: `, ]1 e4 m* U
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。 $ N& u8 _# |: ?0 }7 o9 b8 [% _$ }
2.1.3 系统配置:调试口 0 I$ q4 L/ T9 P# E$ e: T
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
使能USART1的TX的DMA功能和USART1的全局中断) Z7 g' y1 p) v" X0 t& I4 Q6 k 6 G' l+ M9 v, x% M9 L3 e2 _/ S
/ j: w8 J7 M5 M, q( i1 Z 2.1.6 外设配置:使能HESM,它完全由BLE stack管理
) r r7 x9 B( A$ F3 R 2.1.7 外设配置:使能RF,它完全由BLE stack管理。
. z+ t# Y* n$ p) X J7 d( ~ 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。 h- P$ c: A$ K2 p
7 b9 W. [! Z+ E8 y. g 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。" m$ S" Q- _- Y- L 2 P" W% _* }1 S" ]2 [8 W* d. }! ]
2.1.10 外设配置:配置时钟% [% P) ~6 I1 `: w( P$ O * E6 j8 O* u" w3 j) ? u
2.1.11 外设配置:NVIC的配置
, i! Z7 n0 n( B6 \$ } 至此,外设的配置和添加部分已经完成。' f- w, ~3 [5 E# b; b/ p3 x 2.2 BLE协议栈的添加及配置 C+ z7 |* W, I- E9 K* q 2.2.1 协议栈配置:使能BLE协议栈. o. T' ~7 s- m1 g# F& g9 T! Q( v 2 R+ O* }: M; Y5 x. _
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板0 j. X' C* ^4 }; C# I7 `3 ~
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"+ a! r# B d3 f7 X2 g5 U8 l( x- q+ s * J% j# R$ X$ P2 I
3 l a; M! \* |3 J$ @/ ]3 l 2.2.4 协议栈配置:GATT服务基本配置
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值+ b- g* j3 Z9 K" H3 e" Y. ~
2.2.6 协议栈配置:配置GATT写 服务特征及属性值 ) b D# ^6 M' n* L. t
2.2.7 协议栈配置:配置GATT读 服务特征及属性值 , a: z# A% A5 A
L- b" b2 I/ I- w9 e 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 8 N/ M( y" Y: C( S0 {
% s/ b' }8 \) _4 g$ b 2.2.9 协议栈配置:配置GATT广播参数配置
2.2.10 协议栈配置:BLE配对参数设置 ( {+ J' q! q& d( O6 {: E. B- G) j3 `
3 g. x0 q/ ^$ I+ z# U' I 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)( {0 w/ C' c# d4 _# a
2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码
: v% j5 c5 z8 Y 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。$ ]. B4 K+ f4 M' \6 a
. w0 ]' }0 ^/ _3 t2 ?8 E8 ^0 O$ M 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。 * W+ i2 L# i2 Z. g. k! d6 {: I
2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。, N* X" b6 J T9 {7 w: P ! z/ k2 J( x4 Q0 S+ z1 m2 @: q& K
$ y! E4 k4 Y: |9 H1 u BLE应用代码添加:定义用户数据缓存。 在“custom_app.c”文件中定义4个用户缓存区数组。 . U; h4 d" }5 f) J& [2 z7 D
BLE事件驱动代码添加:3 I1 U$ v+ U* g% m) n 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。8 ^) h Y/ a& u2 p ! K9 X0 d" h. L+ h/ X 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
上图对应的代码文本如下所示:
' K6 V( y7 O% G, f# D* b* W 上图对应的代码文本如下图所示:
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 - G7 r( x' g6 m
上图对应的代码文本如下图所示:
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 ! J5 h @# Y- t! b! I3 I! l
上图对应的代码文本如下图所示:
|$ ]9 |, p, ? 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。 , Q; [ c6 ~* M* O
BLE应用数据代码添加:8 o3 }6 d0 G. @( B& I5 p" x 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。+ I0 y/ L- J2 Z5 k8 U# w
2.5 修改BLE最大数据包传输长度0 s4 C! |/ V7 _. o 如果不修改,BLE单包长度最大仅为23字节0 o: H8 d( n) e1 i& L% z: I$ ]6 { 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU). w# S( U$ A: a$ p1 \4 i2 K6 O0 _5 u2 I
$ l( n; ^* ^$ p% x 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。5 k3 {2 o/ ?* s& t
! k3 Z) s1 [! m6 c; U1 J 至此,所有代码更改完成。 $ B9 Z: n5 l: E, ]! j 03测试平台搭建及功能测试& R8 p2 \' I, y7 V& m5 O ' ?" Z; m q7 t' u 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的 ) c# n2 U; \% a2 s3 v
查看当前FUS版本,并将FUS升级到最新版本 + N8 I- u2 {4 Q4 @6 e2 w6 h) Y3 R3 \
1 v7 c9 g" ~2 ]/ t: ? 如果当前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”。, c. m8 W+ X, Y, o- u% t
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址5 n& t4 g: G: V
: D! k6 t3 k" X0 v7 H 3.2 测试平台搭建及验证) `7 A6 \$ u2 h' o. N + G( v7 v4 k) q" W 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
9 ^7 Y% V% w) e$ L3 q4 L/ X/ r" D 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。 + T- F0 }; z: k& g8 x! [9 F7 ^. x
) x2 Q2 y @: K2 s! m 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 - V+ N% A: V+ U8 s: R9 A3 K
5 d% Z T& a0 D9 a j 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试 ; x9 k0 L. U- C% z8 d
3.2.6 手机App写User_Write_Data[64]测试
+ f- I& z# D, c7 |6 S 3.2.7 手机App读User_Read_Data[64]测试。; J k) W! D/ W6 r6 @ 3 }6 f! ]4 n& z/ {4 E
: `3 s) P9 ~# C, l' e$ t$ Q 3.2.8 通知数据访问(User_Notify_Data[64])测试
; [5 w1 r4 x [, p 至此,整个验证和测试过程完成。 2 }: g3 M5 V1 ^ 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。4 D) e2 ]% ^! p" R- k+ ]: }* D 9 j' f6 p% N& T5 v & m$ T" E( P4 I0 w/ n) q9 U3 f 1 g# Y( }) g" |9 l4 u" U5 n% { 转载自: STM32单片机 ; u/ l) S3 |- { |
低功耗蓝牙无线升级: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案例来参考