概述
在嵌入式領(lǐng)域中,STM32WB 系列微控制器以其雙核架構(gòu)和強(qiáng)大的無(wú)線連接能力而著稱。特別是其藍(lán)牙5.0的功能使得這款微控制器非常適合那些需要低功耗和高性能無(wú)線連接的應(yīng)用。然而,在實(shí)際的應(yīng)用中,合理和有效地管理藍(lán)牙連接是非常關(guān)鍵的,尤其是當(dāng)設(shè)備需要斷開(kāi)或重新建立連接時(shí)。
本文將針對(duì)STM32WB平臺(tái),提供如何利用其HAL庫(kù)和Bluetooth stack來(lái)斷開(kāi)藍(lán)牙連接的方法。我們將首先了解如何通過(guò)aci_hal_get_link_status函數(shù)獲取當(dāng)前的藍(lán)牙連接狀態(tài),然后,我們將使用hci_disconnect函數(shù)來(lái)斷開(kāi)這些連接。
最近在弄ST的課程,需要樣片的可以加群申請(qǐng):615061293 。
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是WB55RG 的開(kāi)發(fā)板:
視頻教學(xué)
[https://www.bilibili.com/video/BV1U14y16712
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#
源碼下載
[https://download.csdn.net/download/qq_24312945/88324454]
選擇芯片型號(hào)
配置時(shí)鐘源
HSE與LSE分別為外部高速時(shí)鐘和低速時(shí)鐘,在本文中使用外置的時(shí)鐘源,故都選擇Crystal/Ceramic Resonator選項(xiàng),如下所示:
配置時(shí)鐘樹(shù)
RTC時(shí)鐘配置
RFWKP時(shí)鐘配置
查看開(kāi)啟STM32_WPAN條件
可以看到,需要開(kāi)啟RF、RTC、RCC、IPCC、HSEM。
配置HSEM
硬件信號(hào)量(HSEM)模塊用于管理多個(gè)進(jìn)程之間共享的訪問(wèn)權(quán)限和資源同步。
開(kāi)啟HSEM如下。
配置IPCC
通信控制器(IPCC)模塊的主要用于cpu之間的信號(hào)消息交換。
開(kāi)啟如下所示。
配置RTC
啟動(dòng)RF
開(kāi)啟藍(lán)牙
配置為自定義模板。
命名設(shè)備名
配置BLE GATT
配置SVC
LED配置
查看原理圖可以得知PB0為藍(lán)色LED,PB1為綠色LED。
配置PB0、PB1為輸出IO。
設(shè)置工程信息
工程文件設(shè)置
參考文檔
https://wiki.st.com/stm32mcu/wiki/Connectivity:STM32WB_HeartRate
HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE事件可以判斷是否構(gòu)建完成。
SVCCTL_App_Notification
SVCCTL_App_Notification函數(shù)是一個(gè)藍(lán)牙事件處理器,用于響應(yīng)和處理STM32WB BLE堆棧中發(fā)生的各種事件。
事件處理的主要內(nèi)容:
- 斷開(kāi)連接事件 (HCI_DISCONNECTION_COMPLETE_EVT_CODE)
- 元事件 (HCI_LE_META_EVT_CODE)
- 這部分處理了幾個(gè)子事件,如HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE(連接更新完成)和HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE(新的連接建立完成)。
- 廠商特定調(diào)試事件 (HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE)
"在HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE事件中,我們能夠判斷Bluetooth Low Energy(BLE)設(shè)備是否已成功建立了一個(gè)新的連接。相反,在HCI_DISCONNECTION_COMPLETE_EVT_CODE事件里,我們可以確認(rèn)是否一個(gè)已存在的連接已經(jīng)被斷開(kāi)。這兩個(gè)事件為我們提供了監(jiān)控BLE連接狀態(tài)的重要手段,從而使我們能夠更好地管理設(shè)備的連接生命周期。"
在HCI_DISCONNECTION_COMPLETE_EVT_CODE中添加一個(gè)IO翻轉(zhuǎn)函數(shù)。
/* USER CODE BEGIN EVT_DISCONN_COMPLETE */
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
/* USER CODE END EVT_DISCONN_COMPLETE */
在HCI_DISCONNECTION_COMPLETE_EVT_CODE中添加一個(gè)IO翻轉(zhuǎn)函數(shù)。
ACI_HAL_GET_LINK_STATUS
aci_hal_get_link_status函數(shù)描述中,它返回的Link_Status數(shù)組有8個(gè)元素,這意味著該設(shè)備可以管理最多8個(gè)Bluetooth Low Energy(BLE)連接。每一個(gè)元素代表一個(gè)可能的BLE連接的狀態(tài)。
因此,當(dāng)你想獲取每一個(gè)BLE連接的狀態(tài)并據(jù)此執(zhí)行某些操作(例如斷開(kāi)連接)時(shí),你需要循環(huán)遍歷這8個(gè)可能的連接。
在ble_hci_le.h中有該函數(shù)的說(shuō)明,要使用這個(gè)函數(shù)獲取當(dāng)前連接的句柄并隨后斷開(kāi)連接,可以這樣做:
聲明兩個(gè)數(shù)組來(lái)存儲(chǔ)函數(shù)返回的連接狀態(tài)和連接句柄。
調(diào)用aci_hal_get_link_status函數(shù)獲取這些值。
遍歷連接狀態(tài)數(shù)組,查找任何標(biāo)記為已連接的連接(例如,值為0x02或0x05)。
對(duì)于每個(gè)已連接的狀態(tài),從連接句柄數(shù)組中取得相應(yīng)的連接句柄,并使用hci_disconnect函數(shù)來(lái)斷開(kāi)連接。
在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;//連接成功標(biāo)志位
uint32_t connect_num=0;//斷開(kāi)連接計(jì)數(shù)器
/* USER CODE END 0 */
在app_ble.c中引用connect_flag變量,可以在連接成功侯讓該標(biāo)志位為1。
/* USER CODE BEGIN Includes */
extern uint8_t connect_flag;//連接成功標(biāo)志位
/* USER CODE END Includes */
可以在HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE(連接更新完成)事件中添加標(biāo)志位定義,將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 */
在主程序中延時(shí)5S左右之后斷開(kāi)連接,遍歷連接狀態(tài)數(shù)組,查找任何標(biāo)記為已連接的連接(例如,值為0x02或0x05)。
對(duì)于每個(gè)已連接的狀態(tài),從連接句柄數(shù)組中取得相應(yīng)的連接句柄,并使用hci_disconnect函數(shù)來(lái)斷開(kāi)連接。
/* 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 */
//檢查連接標(biāo)志,如果連接成功,則進(jìn)行處理
if(connect_flag)
{
if(connect_num< 5000)
connect_num++;
else
{
connect_num=0;
// 初始化連接句柄變量
uint16_t Connection_Handle1=0;
// 定義存儲(chǔ)連接狀態(tài)和連接句柄的數(shù)組
uint8_t linkStatus[8];
uint16_t linkHandles[8];
tBleStatus status;
// 獲取當(dāng)前的連接狀態(tài)
status = aci_hal_get_link_status(linkStatus, linkHandles);
// 檢查是否成功獲取連接狀態(tài)
if (status == BLE_STATUS_SUCCESS) {
// 遍歷所有可能的連接
for (int i = 0; i < 8; i++) {
// 判斷當(dāng)前連接是否處于Peripheral或Central角色
if (linkStatus[i] == 0x02 || linkStatus[i] == 0x05) {
// 斷開(kāi)與此連接句柄關(guān)聯(lián)的連接
hci_disconnect(linkHandles[i], 0x13); // 使用適當(dāng)?shù)臄嚅_(kāi)原因
}
}
}
// 重置連接標(biāo)志
connect_flag=0;
}
}
HAL_Delay(1);
}
/* USER CODE END 3 */
hci_disconnect
這是一個(gè)藍(lán)牙HCI (Host Controller Interface) 命令的函數(shù)實(shí)現(xiàn),名為 hci_disconnect。HCI是藍(lán)牙規(guī)范中定義的一個(gè)接口,允許主機(jī)與藍(lán)牙控制器之間的通信。
在ble_hci_le.h中有該函數(shù)的說(shuō)明,要使用這個(gè)函數(shù)終止現(xiàn)有的藍(lán)牙連接,可以這樣做:
對(duì)應(yīng)的參數(shù)有:
Connection_Handle:這是一個(gè)標(biāo)識(shí)符,指明要斷開(kāi)的連接。其有效值范圍為 0x0000 到 0x0EFF。
Reason:這是一個(gè)表示終止連接原因的參數(shù)。以下是可能的原因及其值:
0x05: 認(rèn)證失敗 (Authentication Failure)
0x13: 遠(yuǎn)程用戶終止了連接 (Remote User Terminated Connection)
0x14: 由于資源不足,遠(yuǎn)程設(shè)備終止了連接 (Remote Device Terminated Connection due to Low Resources)
0x15: 由于關(guān)閉電源,遠(yuǎn)程設(shè)備終止了連接 (Remote Device Terminated Connection due to Power Off)
0x1A: 不支持的遠(yuǎn)程特性 (Unsupported Remote Feature)
0x3B: 不可接受的連接參數(shù) (Unacceptable Connection Parameters)
所以可以用0x13進(jìn)行藍(lán)牙斷開(kāi)。
結(jié)果演示
通過(guò)手機(jī)和STM32WB建立連接,然后等待可以看見(jiàn)是否能正確獲取句柄。
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5827瀏覽量
170377 -
BLE
+關(guān)注
關(guān)注
12文章
660瀏覽量
59416 -
藍(lán)牙連接
+關(guān)注
關(guān)注
0文章
12瀏覽量
3743 -
STM32WB55
+關(guān)注
關(guān)注
0文章
26瀏覽量
1325
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論