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是能实现上述功能的。% J x% }" N2 d" \1 x: D ; p% N, u t/ M# ^! O. K$ U9 u1 M 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
* M. t$ Y' O3 A# r 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 & G k' J( a0 @2 x8 D ( [5 T- b& W: J& x& r7 ~9 { 02STM32CubeMX实现步骤 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB! I' B) @6 l. J4 Y6 a 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程' O* o% f, X: _% z % s7 q3 {$ Q2 ]( i0 w% d
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。/ W, b: w8 F) h: ^ * g$ |2 K# ]+ K4 b& B2 |% d% g) J1 t
" }$ J1 Z, f9 Q8 r# o1 U& e 2.1.3 系统配置:调试口' t) `) z2 |$ A+ ] `
5 X, ^# Z9 `7 {9 m4 { 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7) ~9 K% T( }) j" @, M/ q ) c/ y6 I6 Z. Y, U" l% e/ b
使能USART1的TX的DMA功能和USART1的全局中断 ) D' e( }- y% k, I7 T Z
8 z( u. y% x! q5 r 2.1.6 外设配置:使能HESM,它完全由BLE stack管理1 z0 ^- }9 @& e' l; I. R+ i; ?& Y 8 s& B }# x0 p
. Q) |+ d @8 m. N4 | . H: i6 d# A3 C) d 2.1.7 外设配置:使能RF,它完全由BLE stack管理。5 B* ~ R5 @5 d* Z( H' F% `
7 o3 |* I) ?7 K' f* F5 d+ Q5 [3 f 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。0 V: ?, w/ H0 w) U. R2 j 8 f+ X. S3 `4 c' E
& S/ ]/ \ m; d 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。 ' m; r8 n- g& V" t: o" B5 f
; G+ D# \# N7 j6 v 2.1.10 外设配置:配置时钟# L1 @* _. v: c# l3 _ % |" X5 v1 [8 I' Q
" B# W7 d- _6 _% W/ x7 \ 2.1.11 外设配置:NVIC的配置0 b; e+ T3 r3 I/ f) j) q. i1 ]
4 C& A+ Z& |: T% }% B0 Y9 S3 y7 V 至此,外设的配置和添加部分已经完成。 2 y' x/ v' }) F' O 2.2 BLE协议栈的添加及配置- j V# a5 f8 j* l/ f& K8 i9 c% u$ ^ 2.2.1 协议栈配置:使能BLE协议栈
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板 7 @ w; H! b; a
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"
S9 |0 W9 C2 _* }9 q 2.2.4 协议栈配置:GATT服务基本配置 9 [# Z6 v$ d% R3 C& R- o
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值, ]5 H5 U& u) i7 Z$ Z ! F' @6 L+ o+ h! z2 m! T. {
$ s: z9 j) x$ e4 ^ 2.2.6 协议栈配置:配置GATT写 服务特征及属性值$ j& W1 f# e, B5 Q5 A. V* C2 B
5 C: u. B2 W* o' ~ 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 + Q6 x& y7 C9 S2 Z9 A
4 k9 y4 O4 ~3 l 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 1 J" u2 B' T: s2 T
2.2.9 协议栈配置:配置GATT广播参数配置( `* r% J' M5 D: S) Z + \# { O7 j; P
3 o; W; s6 m" S& I& d1 T 2.2.10 协议栈配置:BLE配对参数设置2 k" E9 I5 M" I& d 1 a2 r9 f/ ]- h$ b
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
2 T& p/ o% P5 [! E$ f# F* r7 ~- W 2.3 生成工程代码并初步测试0 Q8 M! @. x* |2 G- N5 \ 2.3.1 点击“GENERATE CODE”生成工程代码' f% s5 R- |! P' y0 m
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码0 {& ~6 C% M+ }: c. W8 n $ m" d( o* L# H6 `$ j6 h6 Y* S1 d 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 ( j4 W# p O6 r1 Y( r 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。 , v+ l, J5 {5 E( v+ c9 M( X
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
$ o0 Q# S e! `: H 2.4 添加BLE Stack应用代码+ P2 G& W' G5 O Z } 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。$ l: M9 z" A5 x) \- [
BLE应用代码添加:定义用户数据缓存。 i( {3 k! y& I( m! L7 a 在“custom_app.c”文件中定义4个用户缓存区数组。
4 ?7 z- d: B/ [1 g8 ^, J" V$ z5 W BLE事件驱动代码添加:6 G+ @' O) F) F, t1 {' V/ j, z 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。 - l( P5 b: z( M! o1 Q3 \6 W 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 6 j* Y; \9 M8 ?
上图对应的代码文本如下所示:; p' N1 {; S- r; i$ m" s: x# Y
, y! e5 d1 v$ C" t4 @7 H8 w
- _' U4 x& }* z& l- G" X 上图对应的代码文本如下图所示: 1 S4 }. I& H4 D% d
+ Y3 Z9 B! R7 D# j 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。1 j7 C; I8 d- i- E( @( l7 L3 g 8 }' \7 y: H0 k: d4 v4 z5 v
t% t# {3 k4 x, v$ p. y& b 上图对应的代码文本如下图所示:
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
上图对应的代码文本如下图所示:- r, S$ Z; A( W
8 ~( X$ N8 ?" s/ R Y2 C8 M" L 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。( F% B! g' `& I" _7 D t5 G % T$ ^, Q, b1 ?1 l% K; y P2 e
0 q, K) G( A3 E- V BLE应用数据代码添加: 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
2.5 修改BLE最大数据包传输长度" p7 D; m( u& j6 w 如果不修改,BLE单包长度最大仅为23字节. ^# v; q f5 o; t4 \3 [ 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)4 T& U6 Z& j& r7 Q+ [) w $ J' r9 E2 q1 G# g* \: P3 g
& m- ^# D+ l" a% p2 n 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
至此,所有代码更改完成。 6 U$ D- F- a) U# {1 h 03测试平台搭建及功能测试$ B7 k- x2 v% f3 v# G5 ]1 |, y; h 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的# Z: l7 v3 h( a& \% g. L8 C6 t g : ?+ ~: r4 e! n( Y
( S# u, O) W2 b5 `$ X 查看当前FUS版本,并将FUS升级到最新版本8 \3 v+ u% |$ c0 | + n1 e( b5 q* T* W" `- [4 a6 B) j3 `! ?
2 {% Q' A9 y5 ? h: b! s4 k- k- O 如果当前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”。 5 Z# U2 ?4 E5 n1 E0 b
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
' _: A' Q/ B5 f: [, c 3.2 测试平台搭建及验证% @& ~8 k: G2 c. Z9 s! t+ D7 I( W9 m7 g 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”- m6 n" @* j ~( o+ K* w$ j
( T9 b1 |* J6 p0 R6 m 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。+ x" y0 i6 M# F$ V) }4 h 0 S. J) R6 y4 V# B4 B- H% B
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
. _; I' Y& A6 S6 u6 b 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
: t8 h+ I( E0 z 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试
3 Y ?& G8 X" ?% Q/ U1 D0 b* t 3.2.6 手机App写User_Write_Data[64]测试1 Z9 \8 ^ X% w* C U \1 O7 C* }, P& |7 a# C
3.2.7 手机App读User_Read_Data[64]测试。 s: |& ^1 W. C2 a4 O6 q* i
% s z* E/ _. U6 A( q 3.2.8 通知数据访问(User_Notify_Data[64])测试7 J3 r t$ {( r8 M' a
7 u% ?) @, u" b E 至此,整个验证和测试过程完成。 : C. S9 z% T0 O5 e& h 04小结+ I# _2 ]2 B; D! t: W3 y8 }: b BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。; d, h% R1 U, o. Y# x6 } " s: o; g9 G) J3 G1 M$ l" Q9 r & ^/ e ]8 C3 S. _- o7 _5 f7 ]; d 转载自: STM32单片机0 M; V' {" _' I6 T 1 X+ F' \, O9 Q5 ] |
低功耗蓝牙无线升级: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案例来参考