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

news2025/1/22 14:39:38

STM32WB55开发----3.断开蓝牙连接

  • 概述
  • 硬件准备
  • 视频教学
  • 样品申请
  • 选择芯片型号
  • 配置时钟源
  • 配置时钟树
  • RTC时钟配置
  • 查看开启STM32_WPAN条件
  • 配置HSEM
  • 配置IPCC
  • 配置RTC
  • 启动RF
  • 开启蓝牙
  • LED配置
  • 设置工程信息
  • 工程文件设置
  • 参考文档
  • SVCCTL_App_Notification
  • ACI_HAL_GET_LINK_STATUS
  • hci_disconnect
  • 结果演示

概述

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

硬件准备

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

视频教学

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

STM32WB55开发(1)----监测STM32WB连接状态

样品申请

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

选择芯片型号

在这里插入图片描述

配置时钟源

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

持安科技何艺:基于可信验证的应用访问安全模型 | CCS2023演讲分享

近日&#xff0c;2023CCS成都网络安全大会在成都举办&#xff0c;大会由四川省互联网信息办公室指导&#xff0c;成都市互联网信息办公室、成都高新技术产业开发区管理委员会联合主办&#xff0c;无糖信息技术有限公司承办。 持安科技创始人兼CEO何艺受邀参与2023CCS大会金融安…

数据结构与算法——复习总结

线性表 线性表括顺序表和链式表。 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或删除操作的线性表。应用&#xff1a;表达式求值&#xff0c;函数递归调用 队列&#xff08;Queue&#xff09;是只允许在一端进行插入&#xff0c;在另一端删除的线性表。应用&…

Ae 效果:CC Snowfall

模拟/CC Snowfall Simulation/CC Snowfall CC Snowfall&#xff08;CC 飘雪&#xff09;可用来模拟带景深、光效和运动模糊的雪花飘落效果。 ◆ ◆ ◆ 效果属性说明 Flakes 雪花 用于设置场景中雪花的数量。 默认值 10000。 Size 大小 用于设置雪花的大小。 默认值 3.00。 …

iOS IdiotAVplayer实现视频分片缓存

文章目录 IdiotAVplayer 实现视频切片缓存一 iOS视频边下边播原理一 分片下载的实现1 分片下载的思路2 IdiotAVplayer 实现架构 三 IdiotAVplayer 代码解析IdiotPlayerIdiotResourceLoaderIdiotDownLoader IdiotAVplayer 实现视频切片缓存 一 iOS视频边下边播原理 初始化AVUR…

Kafka3.0.0版本——消费者(offset的默认维护位置)

目录 一、offset的默认维护位置1.1、offset的默认维护位置概述1.2、offset的默认维护位置图解 二、消费者offset的案例 一、offset的默认维护位置 1.1、offset的默认维护位置概述 Kafka0.9版本之前&#xff0c;consumer默认将offset保存在Zookeeper中。从Kafka0.9版本开始&am…

强大的JTAG边界扫描(2):BSDL文件介绍

文章目录 1. 什么是BSDL文件&#xff1f;2. BSDL文件的获取方式1&#xff1a;BSDL Library方式2&#xff1a;各芯片的官方网站Xilinx BSDL文件获取Altera BSDL文件获取Microsemi FPGA BSDL文件获取ST BSDL文件获取 3. BSDL文件示例4. BSDL文件的应用 1. 什么是BSDL文件&#xf…

C语言_指针(1)

文章目录 前言一、指针数组1.1利用指针数组模拟出二维数组 二、数组指针2.1数组名是数组首元素的地址2.2 二维数组传参2.3 一级指针传参2.4 二级指针传参 三. 函数指针四 . typedef 重命名 前言 指针数组是由指针组成的数组。它的每个元素都是一个指针&#xff0c;可以指向任何…

【算法与数据结构】530、LeetCode二叉搜索树的最小绝对差

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉搜索树的性质是左子树的所有节点键值小于中间节点键值&#xff0c;右子树的所有节点键值大于中间节…

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录 Q1、什么是Spring Bean&#xff1f;和对象有什么区别Q2、配置Bean有哪几种方式&#xff1f;Q3、Spring支持的Bean有哪几种作用域&#xff1f;Q4、单例Bean的优势是什么&#xff1f;Q5、Spring的Bean是线程安全的吗&#xff1f;Q6、Spring如何处理线程并发问题&#xf…

uview 组件 u-form-item 点击事件

问题 click"showCalendar(false)"点击没反应 原因&#xff1a; 组件未定义此事件&#xff0c;可使用原生点击事件.native click.native"showCalendar()" <u-form-item label"开始时间" label-width"150" right-icon"arrow…

戳气球00

题目链接 戳气球 题目描述 注意点 求戳破所有的气球所能获得硬币的最大数量0 < nums[i] < 1001 < n < 300 解答思路 初始只想到深度优先遍历暴力搜索所有情况找到获得硬币的最大数量&#xff0c;但是时间复杂度很高一定会超时参照题解使用动态规划解决本题&am…

机器人中的数值优化(十五)——PHR增广拉格朗日乘子法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

Python中的进度条显示方案

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 大家好&#xff0c;我是迷途小书童! tqdm 是一个非常常用的 Python 进度条库&#xff0c;它可以在循环迭代和 IO 操作期间添加一个进度条&#xff0c;直观地显示循环迭代的进程。 tqdm 是在 2013 年发布的&#xff0c;目的是为 Pyth…

netrw模拟nerdtree的go命令连续打开多个文件

vim9自带的文件浏览器netrw功能很强大。过去用惯了nerdtree的我&#xff0c;对netrw的文件操作还要适应一些时间。 使用netrw一段时间后发现它没有nerdtree的go命令的替代操作&#xff0c;今天就自制一个。 一、制作go命令&#xff1a; nerdtree的go命令功能&#xff1a;就是…

NetSuite 客户销售团队更新方法辨析

在NetSuite中如果想将销售团队与客户数据进行隔离&#xff0c;采用的方法是“在客户上定义销售团队&#xff0c;同时将销售团队成员的访问角色进行Employee Restrictions”。 其中&#xff0c;Employee Restrictions的主题我们过去发过几篇&#xff0c;大家可以参考。 NetSui…

【Blender】Blender入门学习

目录 0 参考视频教程0.1 Blender理论知识0.2 Blender上手实践0.3 FBX模型导入Unity 1 Blender的窗口介绍1.1 主界面1.2 模型编辑窗口 2 Blender的基本操作2.1 3D视图的平移2.2 3D视图的旋转2.3 3D视图的缩放2.4 修改快捷键2.5 使物体围绕选择的物体旋转2.6 四视图的查看2.7 局部…

Vivado 2017.04版本安装教程

文章目录 前言一、vivado 简介二、vivado 下载三、vivado 安装四、vivado 申请证书五、关闭升级提醒六、资源自取 前言 本文记录了在 windows 11 下安装 vivado 2017 的详细步骤。 一、vivado 简介 Vivado 是 Xilinx 公司于 2012 推出的新一代集成设计环境&#xff0c;虽然目…

【初阶C语言】操作符2---表达式求值

前言&#xff1a;本节重点介绍操作符的使用&#xff0c;如&#xff0c;优先级高低、类型转换等 一、逻辑操作符 前言&#xff1a;逻辑操作符包括逻辑与&#xff08;&&&#xff09;和逻辑或&#xff08;||&#xff09;&#xff0c;操作对象&#xff1a;两个 1.逻辑与&…

LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

10.Xaml ListBox控件

1.运行界面 2.运行源码 a.Xaml 源码 <Grid Name="Grid1"><!--IsSelected="True" 表示选中--><ListBox x:Name="listBo