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

2023-09-10 18:16:24

概述

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

硬件准备

首先需要准备一个开发板,这里我准备的是WB55RG 的开发板:
在这里插入图片描述

视频教学

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

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

样品申请

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建立连接,然后等待可以看见是否能正确获取句柄。
在这里插入图片描述

在这里插入图片描述

更多推荐

Redis面试题(三)

文章目录前言一、怎么理解Redis事务?二、Redis事务相关的命令有哪几个?三、Rediskey的过期时间和永久有效分别怎么设置?四、Redis如何做内存优化?五、Redis回收进程如何工作的?六、加锁机制总结前言怎么理解Redis事务?Redis事务相关的命令有哪几个?Rediskey的过期时间和永久有效分别怎么设

系统架构设计师(第二版)学习笔记----系统分析与设计及测试

【原文链接】系统架构设计师(第二版)学习笔记----软件测试文章目录一、结构化方法1.1结构化开发方法1.2结构化分析使用的手段1.3结构化分析的步骤1.4数据流图(DFD)的基本元素1.5数据流图(DFD)方法建模过程1.6数据字典的组成1.7概要设计的主要任务1.8结构化开发的准则1.9耦合的类型1.10内聚的类型

Linux系统--多线程

文章目录线程的概念创建线程线程退出一、线程的概念线程在进程内部执行,是OS调度的基本单位。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都

面试系列之《Linux&Shell》(更新中)

1.用awk命令实现一个词频统计。假设文件名“data”,文件内容:ABCDACDDBCC1.1.python实现因为不熟悉awk命令,当时用python实现的:res_dict={}withopen('./data','r',encoding='utf-8')asfp:forlineinfp:foriteminlin

Android 图片加载框架Glide源码详解

我们看Glide的源码从Glide类入手,使用的时候我们先调用的with方法,源码中with有3个多载的方法:下图翻译过来就是activity用FragmentActivityApplicationcontext用with(Context)还有一个with(View)的殊途同归,最后都是调用了getRetriever(

[激光原理与应用-68]:如何消除50Hz工频干扰和差分信号应对工频干扰

目录一、什么工频干扰1.1什么工频干扰1.2工频干扰的幅度1.3工频干扰如何进入设备1.4工频干扰的负面影响二、如何消除工频干扰2.1要消除工频干扰,可以考虑以下方法:2.2要具体消除工频干扰,可以采取以下措施2.3使用差分信号消除工频干扰:三、单端信号传输和差分信号传输比较一、什么工频干扰1.1什么工频干扰50Hz的

【网络技术】计算机网络介绍

写在前面计算机网络是指将多台计算机连接起来,使它们能够相互通信和共享资源的系统。它是现代计算机科学中的重要分支之一,为全球范围内的信息交流和数据传输提供了基础。本文将介绍计算机网络的基础概念、体系结构、协议、常见问题等的知识。一、基本介绍1.计算机网络是什么?计算机网络是由若干台计算机和与之相连的通信设备组成的系统,这

记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)这篇文章,主要内容是记录使用DockerCompose部署《XAPI项目》遇道的问题及解决方案目录📚本地MySQL数据如何导入到容器内的MySQL中❎解决报错:docker-xapi-backend-1|q.GetUserInfoByUserAccounterr

KMP算法

1.典型例题28.找出字符串中第一个匹配项的下标-力扣(LeetCode)题干:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbut

Spring WebFlux使用未加前缀的双通配符模式绕过安全性CVE-2023-34034

文章目录0.前言漏洞漏洞介绍描述1.参考文档2.基础介绍3.解决方案3.1.升级版本4.漏洞修复源码分析5.漏洞利用示例0.前言背景:公司项目扫描到WebFlux中使用"**"作为模式会导致SpringSecurity和SpringWebFlux之间CVE-2023-34034漏洞漏洞高|2023年7月18日|CVE-

LVS+Keepalived群集

LVS+Keepalived群集一、Keepalived实现原理1、原理2、Keepalived体系主要模块及其作用3、Keepalived工具介绍4、合格的集群应该具备的特性二、Keepalived的部署三、LVS+Keepalived高可用集群部署1.部署共享存储2.配置负载调度器(主、备相同)3.配置节点服务器4

热文推荐