STM32WB55RG开发----5.生成 BLE 程序连接手机APP
- 概述
- 硬件准备
- 视频教学
- 样品申请
- 源码下载
- 参考程序
- 选择芯片型号
- 配置时钟源
- 配置时钟树
- RTC时钟配置
- RF wakeup时钟配置
- 查看开启STM32_WPAN条件
- 配置HSEM
- 配置IPCC
- 配置RTC
- 启动RF
- 开启蓝牙
- LED配置
- 设置工程信息
- 工程文件设置
- 参考文档
- SVCCTL_App_Notification
- 结果演示
概述
STM32WB系列微控制器代表了STMicroelectronics在无线技术领域的新一代创新,集成了Bluetooth 5.0、Zigbee和Thread等多种无线通信协议。而在这些无线应用中,监测和管理连接状态显得尤为关键。确保可靠连接不仅对于数据的实时传输至关重要,而且在面对低功耗需求、设备管理和故障诊断时,都有着不可或缺的作用。
本文将深入探讨STM32WB的连接状态监测机制。首先会讨论为什么需要监测连接状态,然后介绍STM32WB提供的相关工具和技术。随后,会详细解释如何使用这些工具来实时跟踪和管理连接状态,以及如何解读和响应不同的连接状态事件。通过这些内容,能够更好地理解和利用STM32WB的无线连接功能,为其应用带来更高的可靠性和效率。
最近在弄ST的教程,需要样片的可以加群申请:615061293/925643491 。
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32WB55RGV6
视频教学
https://www.bilibili.com/video/BV1ENmpYREfu/
STM32WB55RG开发(5)----监测STM32WB连接状态
样品申请
https://www.wjx.top/vm/OhcKxJk.aspx#
源码下载
参考程序
https://github.com/CoreMaker-lab/STM32WB55_SENSOR
https://gitee.com/CoreMaker/STM32WB55_SENSOR
选择芯片型号
配置时钟源
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
配置时钟树
RTC时钟配置
RF wakeup时钟配置
查看开启STM32_WPAN条件
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
配置HSEM
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
资料下载链接:https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32WB/17_STM32WB-System-Hardware-Semaphore-(HSEM)_J.pdf
开启HSEM如下。
配置IPCC
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
资料下载链接:https://www.st.com/content/ccc/resource/training/technical/product_training/group0/d3/17/dc/8a/bf/ef/4f/10/STM32WB-System-Inter-Processor-communication-controller-IPCC/files/STM32WB-System-Inter-Processor-communication-controller-IPCC.pdf/jcr:content/translations/en.STM32WB-System-Inter-Processor-communication-controller-IPCC.pdf
开启如下所示。
配置RTC
启动RF
开启蓝牙
配置为自定义模板。
命名设备名,输入myDevice
配置BLE GATT,输入mySVC
配置mySVC,输入myCharWrite
LED配置
查看原理图,对应LED分别为PB0,PB1,PB5。
配置如下所示。
设置工程信息
工程文件设置
参考文档
下图展示了 BLE 协议栈中的事件回调函数 以及这些事件的作用和触发位置,特别是在处理 BLE 应用中的 ACI 事件时,用户可以选择两种不同的方法来处理事件:
- 使用“switch case”事件处理程序
- 使用事件回调框架
图中列出了几个主要事件回调:
● hci_disconnection_complete_event():连接结束事件,适用于 GAP 中的中央设备或外设。
● hci_le_connection_complete_event():建立连接完成事件,表示两个设备之间的连接成功建立,适用于 GAP 中的中央设备或外设。
● aci_gatt_attribute_modified_event():当 GATT 客户端修改了服务器端的某个属性时,服务器端会触发该事件,适用于 GATT 的服务器端。
● aci_gatt_notification_event():当 GATT 服务器端发送通知给客户端时,在客户端生成该事件,适用于 GATT 的客户端。
● aci_gatt_indication_event():当 GATT 服务器端向客户端发送指示(Indication)时,在客户端生成该事件,适用于 GATT 客户端。
● aci_gap_pass_key_req_event():在配对过程中需要提供密钥时触发,安全管理器应用层应在接收到事件后调用 aci_gap_pass_key_resp() 进行密钥的反馈,适用于 GAP 中的中央设备或外设。
● aci_gap_pairing_complete_event():配对过程成功或失败后触发,适用于 GAP 中的中央设备或外设。
● aci_gap_bond_lost_event():当设备的绑定关系丢失时触发,通常是由于远端设备删除了绑定信息。应用层在接收到该事件后,可以调用 aci_gap_allow_rebond() 以允许设备重新绑定,适用于 GAP 外设。
● aci_att_read_by_group_type_resp_event():当客户端请求读取组类型时,返回包含符合读取条件的属性句柄和类型的响应,适用于 GATT 客户端。
● aci_att_read_by_type_resp_event():当客户端请求读取指定类型的属性时,返回包含符合读取条件的属性值和类型的响应,适用于 GATT 客户端。
● aci_gatt_proc_complete_event():表示 GATT 流程已完成,适用于 GATT 客户端。
● hci_le_advertising_report_event():在扫描过程中发现设备时触发,报告扫描到的设备信息,适用于 GAP 中的中央设备。
这些事件为 BLE 应用中的配对、绑定、安全管理和 GATT 操作提供了重要的反馈机制。开发者可以通过这些事件在应用层实现相应的业务逻辑。
SVCCTL_App_Notification
SVCCTL_App_Notification函数是一个蓝牙事件处理器,用于响应和处理STM32WB BLE堆栈中发生的各种事件。
该代码实现了一个 BLE 事件回调函数 SVCCTL_App_Notification,用于处理 STM32WB BLE 应用中的各种 BLE 事件。主要逻辑分为以下几个部分:
- 断开连接事件 (HCI_DISCONNECTION_COMPLETE_EVT_CODE):
○ 当连接断开时触发该事件。 - 连接事件 (HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE):
○ 当 BLE 连接成功建立时触发该事件。 - 连接更新事件 (HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE):
○ 当连接参数更新完成时触发,打印更新后的连接参数。 - 厂商特定事件 (HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE):
○ 处理各种 GAP 和 GATT 相关的自定义事件:
■ 按键通知 (ACI_GAP_KEYPRESS_NOTIFICATION_VSEVT_CODE)
■ 密码请求 (ACI_GAP_PASS_KEY_REQ_VSEVT_CODE):当需要密码时,通过调用 aci_gap_pass_key_resp 提供固定的 PIN。
■ 数字比较 (ACI_GAP_NUMERIC_COMPARISON_VALUE_VSEVT_CODE):进行数字比较并确认。
■ 配对完成 (ACI_GAP_PAIRING_COMPLETE_VSEVT_CODE):检查配对状态并打印结果。
■ GATT 指示 (ACI_GATT_INDICATION_VSEVT_CODE):当服务器发送指示时,确认接收。
在HCI_DISCONNECTION_COMPLETE_EVT_CODE中添加一个LED控制函数。
/* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);/* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
在HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE中添加一个LED控制函数。
/* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);/* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
在主程序中添加LED初始化程序。
/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);/* USER CODE END 2 */
结果演示
通过手机和STM32WB建立连接和断开连接可以查看到LED电平变化。
连接上LED1亮灯,LED2灭灯。
断开蓝牙链接。
连接上LED1灭灯,LED2亮灯。