0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32WB55开发(3)----断开蓝牙连接

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 15:43 次阅读

概述

嵌入式领域中,STM32WB 系列微控制器以其双核架构和强大的无线连接能力而著称。特别是其蓝牙5.0的功能使得这款微控制器非常适合那些需要低功耗和高性能无线连接的应用。然而,在实际的应用中,合理和有效地管理蓝牙连接是非常关键的,尤其是当设备需要断开或重新建立连接时。
本文将针对STM32WB平台,提供如何利用其HAL库和Bluetooth stack来断开蓝牙连接的方法。我们将首先了解如何通过aci_hal_get_link_status函数获取当前的蓝牙连接状态,然后,我们将使用hci_disconnect函数来断开这些连接。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。

硬件准备

首先需要准备一个开发板,这里我准备的是WB55RG 的开发板:

在这里插入图片描述

视频教学

[https://www.bilibili.com/video/BV1U14y16712

样品申请

[https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

[https://download.csdn.net/download/qq_24312945/88324454]

选择芯片型号

在这里插入图片描述

配置时钟

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
在这里插入图片描述

配置时钟树

在这里插入图片描述

RTC时钟配置

在这里插入图片描述
RFWKP时钟配置

在这里插入图片描述

查看开启STM32_WPAN条件

可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
在这里插入图片描述

配置HSEM

硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
开启HSEM如下。
在这里插入图片描述

配置IPCC

通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
开启如下所示。

在这里插入图片描述

配置RTC

在这里插入图片描述

启动RF

在这里插入图片描述

开启蓝牙

在这里插入图片描述

配置为自定义模板。
在这里插入图片描述

命名设备名

在这里插入图片描述

配置BLE GATT

在这里插入图片描述

配置SVC
在这里插入图片描述

LED配置

查看原理图可以得知PB0为蓝色LED,PB1为绿色LED。

在这里插入图片描述

配置PB0、PB1为输出IO。

在这里插入图片描述

设置工程信息

在这里插入图片描述

工程文件设置

在这里插入图片描述

参考文档

https://wiki.st.com/stm32mcu/wiki/Connectivity:STM32WB_HeartRate
HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE事件可以判断是否构建完成。

在这里插入图片描述

SVCCTL_App_Notification

SVCCTL_App_Notification函数是一个蓝牙事件处理器,用于响应和处理STM32WB BLE堆栈中发生的各种事件。
事件处理的主要内容:

  1. 断开连接事件 (HCI_DISCONNECTION_COMPLETE_EVT_CODE)
  2. 元事件 (HCI_LE_META_EVT_CODE)
  3. 这部分处理了几个子事件,如HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE(连接更新完成)和HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE(新的连接建立完成)。
  4. 厂商特定调试事件 (HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE)

"在HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE事件中,我们能够判断Bluetooth Low Energy(BLE)设备是否已成功建立了一个新的连接。相反,在HCI_DISCONNECTION_COMPLETE_EVT_CODE事件里,我们可以确认是否一个已存在的连接已经被断开。这两个事件为我们提供了监控BLE连接状态的重要手段,从而使我们能够更好地管理设备的连接生命周期。"

在HCI_DISCONNECTION_COMPLETE_EVT_CODE中添加一个IO翻转函数。

/* USER CODE BEGIN EVT_DISCONN_COMPLETE */
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
      /* USER CODE END EVT_DISCONN_COMPLETE */

在这里插入图片描述
在HCI_DISCONNECTION_COMPLETE_EVT_CODE中添加一个IO翻转函数。
在这里插入图片描述

ACI_HAL_GET_LINK_STATUS

aci_hal_get_link_status函数描述中,它返回的Link_Status数组有8个元素,这意味着该设备可以管理最多8个Bluetooth Low Energy(BLE)连接。每一个元素代表一个可能的BLE连接的状态。
因此,当你想获取每一个BLE连接的状态并据此执行某些操作(例如断开连接)时,你需要循环遍历这8个可能的连接。

在这里插入图片描述

在ble_hci_le.h中有该函数的说明,要使用这个函数获取当前连接的句柄并随后断开连接,可以这样做:
声明两个数组来存储函数返回的连接状态和连接句柄。
调用aci_hal_get_link_status函数获取这些值。
遍历连接状态数组,查找任何标记为已连接的连接(例如,值为0x02或0x05)。
对于每个已连接的状态,从连接句柄数组中取得相应的连接句柄,并使用hci_disconnect函数来断开连接。

在这里插入图片描述

在main.c中添加ble_hci_le.h文件。

/* USER CODE BEGIN Includes */

#include "ble_hci_le.h"
/* USER CODE END Includes */

在main.c中添加变量。

/* USER CODE BEGIN 0 */
uint8_t connect_flag=0;//连接成功标志位
uint32_t connect_num=0;//断开连接计数器

/* USER CODE END 0 */

在app_ble.c中引用connect_flag变量,可以在连接成功侯让该标志位为1。

/* USER CODE BEGIN Includes */
extern uint8_t connect_flag;//连接成功标志位
/* USER CODE END Includes */

可以在HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE(连接更新完成)事件中添加标志位定义,将connect_flag置位位1。

/* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */
					HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
					connect_flag=1;
          /* USER CODE END HCI_EVT_LE_CONN_COMPLETE */

在这里插入图片描述
在主程序中延时5S左右之后断开连接,遍历连接状态数组,查找任何标记为已连接的连接(例如,值为0x02或0x05)。
对于每个已连接的状态,从连接句柄数组中取得相应的连接句柄,并使用hci_disconnect函数来断开连接。

/* Init code for STM32_WPAN */
  MX_APPE_Init();

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    MX_APPE_Process();

    /* USER CODE BEGIN 3 */
		//检查连接标志,如果连接成功,则进行处理
		if(connect_flag)
		{
			if(connect_num< 5000)
				connect_num++;
			else
			{
				connect_num=0;
				// 初始化连接句柄变量
				uint16_t Connection_Handle1=0;
				
				// 定义存储连接状态和连接句柄的数组
				uint8_t linkStatus[8];
				uint16_t linkHandles[8];
				tBleStatus status;
				// 获取当前的连接状态
				status = aci_hal_get_link_status(linkStatus, linkHandles);
				// 检查是否成功获取连接状态
				if (status == BLE_STATUS_SUCCESS) {
						// 遍历所有可能的连接
						for (int i = 0; i < 8; i++) {
								// 判断当前连接是否处于Peripheral或Central角色
								if (linkStatus[i] == 0x02 || linkStatus[i] == 0x05) { 
										// 断开与此连接句柄关联的连接
										hci_disconnect(linkHandles[i], 0x13); // 使用适当的断开原因
								}
						}
					}
				// 重置连接标志
				connect_flag=0;
			}
		}
		HAL_Delay(1);
		
  }
  /* USER CODE END 3 */

hci_disconnect

这是一个蓝牙HCI (Host Controller Interface) 命令的函数实现,名为 hci_disconnect。HCI是蓝牙规范中定义的一个接口,允许主机与蓝牙控制器之间的通信。
在这里插入图片描述

在ble_hci_le.h中有该函数的说明,要使用这个函数终止现有的蓝牙连接,可以这样做:
对应的参数有:
Connection_Handle:这是一个标识符,指明要断开的连接。其有效值范围为 0x0000 到 0x0EFF。
Reason:这是一个表示终止连接原因的参数。以下是可能的原因及其值:
0x05: 认证失败 (Authentication Failure)
0x13: 远程用户终止了连接 (Remote User Terminated Connection)
0x14: 由于资源不足,远程设备终止了连接 (Remote Device Terminated Connection due to Low Resources)
0x15: 由于关闭电源,远程设备终止了连接 (Remote Device Terminated Connection due to Power Off)
0x1A: 不支持的远程特性 (Unsupported Remote Feature)
0x3B: 不可接受的连接参数 (Unacceptable Connection Parameters)
所以可以用0x13进行蓝牙断开。
在这里插入图片描述

结果演示

通过手机和STM32WB建立连接,然后等待可以看见是否能正确获取句柄。
在这里插入图片描述

在这里插入图片描述

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙
    +关注

    关注

    112

    文章

    5428

    浏览量

    165663
  • BLE
    BLE
    +关注

    关注

    12

    文章

    608

    浏览量

    58837
  • 蓝牙连接
    +关注

    关注

    0

    文章

    12

    浏览量

    3614
  • STM32WB55
    +关注

    关注

    0

    文章

    25

    浏览量

    1159
收藏 人收藏

    评论

    相关推荐

    STM32WB55开发(1)----套件概述

    所使用的器件是我们自行设计的开发板,该开发板是基于 STM32WB55 系列微控制器所构建。STM32WBXX_VFQFPN68 不仅是一款评估套件,它还集成了众多现代化的无线通信技术
    的头像 发表于 12-01 15:40 591次阅读
    <b class='flag-5'>STM32WB55</b><b class='flag-5'>开发</b>(1)----套件概述

    STM32WB55开发(4)----配置串口打印Debug调试信息

    STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试
    的头像 发表于 12-01 15:48 425次阅读
    <b class='flag-5'>STM32WB55</b><b class='flag-5'>开发</b>(4)----配置串口打印Debug调试信息

    STM32WB55开发板单板设计

    STM32WB55开发板(一)单板设计-硬件介绍目录STM32WB55开发板(一)单板设计-硬件介绍前言简介参数介绍MCU方面开发板方面
    发表于 08-06 08:15

    STM32WB55是如何在RT-Thread系统上移植的

    STM32WB55在RT-Thread系统上移植官方蓝牙BLE功能硬件环境:(1)开发板:ST官方的stm32wb55-st-nucleo开发
    发表于 08-24 07:20

    STM32WB55开发板的功能是什么?

    STM32WB55开发板的功能是什么?
    发表于 11-08 06:36

    STM32WB55的相关资料推荐

    STM32WB55 蓝牙协议栈运行流程解析简介STM32WB55是ST公司近期推出的一颗双核(M0+M4)无线MCU,主要应用在BLE领域,同时也可以运行thread和zigbee等无线协议栈。协议
    发表于 02-07 08:47

    如何控制stm32wb55的电源呢

    我想了解如何控制 stm32wb55 的电源。我正在运行来自最新 stm32cube 的 PWR_STANDBY_RTC 示例。在待机状态下,我正在读取 900 uA。这似乎很高。我应该期待什么?
    发表于 12-20 07:24

    是否可以将MAC层代码集成到STM32WB55中?

    我正在使用 STM32WB55 微控制器,我在其中使用 BLE 并将我的主程序与我正在实现的代码集成在一起。 另一方面,我需要使用 LoRaWAN,为此我使用了 HOPERF RFM95 模块,其中
    发表于 12-27 08:36

    请问STM32WB55如何修改CPU2区?

    STM32WB55如何修改CPU2区?
    发表于 12-28 13:18

    为什么无法在STM32WB55 BLE服务器上发现GATT服务?

    我正在尝试使用 STM32WB55 Nucleo Pack 开发 BLE 应用程序。我将 cubeMX 与 STM32Cube_FW_WB_V1.8.0 包一起使用,为带有
    发表于 01-13 08:31

    stm32wb55 待机stop睡眠 唤醒后蓝牙工作不正常

    stm32wb55 待机stop睡眠 唤醒后蓝牙工作不正常? 进入待机睡眠,待机电流80微安那样,通过外部io口唤醒后,接着用手机的蓝牙连接stm
    发表于 06-16 21:14

    STM32WB55开发板(一)单板设计-硬件介绍

    STM32WB55开发板(一)单板设计-硬件介绍目录STM32WB55开发板(一)单板设计-硬件介绍前言简介参数介绍MCU方面开发板方面
    发表于 12-01 18:06 16次下载
    <b class='flag-5'>STM32WB55</b><b class='flag-5'>开发</b>板(一)单板设计-硬件介绍

    STM32WB55 蓝牙协议栈运行流程解析

    STM32WB55 蓝牙协议栈运行流程解析简介STM32WB55是ST公司近期推出的一颗双核(M0+M4)无线MCU,主要应用在BLE领域,同时也可以运行thread和zigbee等无线协议栈。协议
    发表于 12-04 12:36 17次下载
    <b class='flag-5'>STM32WB55</b> <b class='flag-5'>蓝牙</b>协议栈运行流程解析

    STM32WB55在RT-Thread系统上移植官方蓝牙BLE功能

    STM32WB55在RT-Thread系统上移植官方蓝牙BLE功能硬件环境:(1)开发板:ST官方的stm32wb55-st-nucleo开发
    发表于 12-04 12:51 17次下载
    <b class='flag-5'>STM32WB55</b>在RT-Thread系统上移植官方<b class='flag-5'>蓝牙</b>BLE功能

    stm32wb55 基于rtt的ble sample制作过程

    stm32wb55 基于rtt的ble sample制作过程准备活动硬件stm32wb55 nucleo开发stm32wb55 dangle软件rtthread
    发表于 12-20 19:39 12次下载
    <b class='flag-5'>stm32wb55</b> 基于rtt的ble sample制作过程