STM32蓝牙BLE通信学习指南
引言
蓝牙低功耗(BLE)是一种无线通信技术,适用于低功耗应用,如物联网设备、传感器和健康监测器等。STM32系列微控制器具有内置的蓝牙无线通信模块,可以方便地实现BLE通信功能。本文将介绍如何使用STM32实现蓝牙BLE通信,并提供代码案例作为参考。
内容大纲
本文将介绍以下内容来实现蓝牙BLE通信:
-
STM32开发环境配置
-
创建BLE项目
-
初始化蓝牙BLE模块
-
设置蓝牙BLE广播
-
建立BLE连接
-
实现BLE数据传输
-
结束BLE连接
-
STM32开发环境配置
首先,我们需要配置STM32开发环境。如果你还没有安装开发环境,可以从STMicroelectronics官方网站下载和安装最新版的STM32CubeIDE。安装完成后,打开STM32CubeIDE,创建一个新的STM32项目。
- 创建BLE项目
在STM32CubeIDE中,选择File -> New -> STM32 Project创建新的项目。在弹出的对话框中,选择你的STM32开发板型号和芯片型号,然后点击Next。
在下一步选择界面,你可以选择使用HAL库或标准外设库进行开发。选择你熟悉的库,然后点击Finish创建项目。
- 初始化蓝牙BLE模块
在创建BLE项目后,我们需要初始化蓝牙BLE模块。在main.c文件中,找到MX_BLE_Init函数。该函数会在main函数前调用,我们需要在此处初始化蓝牙BLE模块。
以下是一个示例代码:
void MX_BLE_Init(void)
{
// 初始化蓝牙BLE模块
// 1. 开启蓝牙BLE模块时钟
__HAL_RCC_BLE_CLK_ENABLE();
// 2. 配置蓝牙BLE引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 3. 初始化蓝牙BLE模块
hble.Instance = USART2;
hble.Init.BaudRate = 115200;
hble.Init.WordLength = USART_WORDLENGTH_8B;
hble.Init.StopBits = USART_STOPBITS_1;
hble.Init.Parity = USART_PARITY_NONE;
hble.Init.Mode = USART_MODE_TX_RX;
hble.Init.HwFlowCtl = USART_HWCONTROL_NONE;
hble.Init.OverSampling = USART_OVERSAMPLING_16;
HAL_USART_Init(&hble);
// 4. 启动蓝牙BLE模块
HAL_USART_Start(&hble);
}
上述代码中,我们使用USART2作为蓝牙BLE模块的串口。根据你的开发板型号和引脚连接,可能需要修改引脚配置。
- 设置蓝牙BLE广播
在初始化蓝牙BLE模块后,我们需要设置蓝牙BLE广播以使其可被其他设备发现。在main.c文件中,找到MX_BLE_Advertising函数。该函数会在main函数后调用,我们需要在此处设置蓝牙BLE广播。
以下是一个示例代码:
void MX_BLE_Advertising(void)
{
// 设置蓝牙BLE广播
// 1. 创建广播参数
BLE_Advertising_ParamsTypeDef advParams;
advParams.Mode = BLE_ADV_MODE_CONNECTABLE_UNDIRECTED;
advParams.Type = BLE_ADV_TYPE_ADV_IND;
advParams.Interval = 160; // 广播间隔为160ms
advParams.TxPower = BLE_ADV_TX_POWER_HIGH;
// 2. 设置广播参数
HAL_BLE_SetAdvertisingParams(&advParams);
// 3. 创建广播数据
uint8_t advData[] = {0x02, 0x01, 0x06, 0x1A, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
// 4. 设置广播数据
HAL_BLE_SetAdvertisingData(advData, sizeof(advData));
// 5. 启动广播
HAL_BLE_StartAdvertising();
}
上述代码中,我们创建了一个广播参数结构体advParams,设置了广播模式、类型、间隔和发射功率。然后,我们创建了一个广播数据数组advData,并设置广播数据。最后,我们启动了广播。
- 建立BLE连接
当其他设备接收到我们的广播后,可以发起BLE连接。在main.c文件中,找到MX_BLE_Connection函数。该函数会在main函数后调用,我们需要在此处建立BLE连接。
以下是一个示例代码:
void MX_BLE_Connection(void)
{
// 建立BLE连接
// 1. 等待连接事件
BLE_Connection_EventTypeDef connEvent;
HAL_BLE_WaitForConnectionEvent(&connEvent);
// 2. 建立连接
HAL_BLE_EstablishConnection(&connEvent);
// 3. 等待连接完成事件
BLE_Connection_Complete_EventTypeDef connCompEvent;
HAL_BLE_WaitForConnectionCompleteEvent(&connCompEvent);
// 4. 打印连接信息
printf("Connected to device: %s\n", connCompEvent.DeviceName);
printf("Connection address: %x:%x:%x:%x:%x:%x\n", connCompEvent.Address[0], connCompEvent.Address[1],
connCompEvent.Address[2], connCompEvent.Address[3], connCompEvent.Address[4], connCompEvent.Address[5]);
}
上述代码中,我们使用HAL_BLE_WaitForConnectionEvent函数等待连接事件,然后使用HAL_BLE_EstablishConnection函数建立连接。接着,我们等待连接完成事件,并打印连接信息。
- 实现BLE数据传输
当BLE连接建立后,我们可以通过蓝牙BLE通信传输数据。在main.c文件中,找到MX_BLE_DataTransmit函数。该函数会在main函数后调用,我们需要在此处实现BLE数据传输。
以下是一个示例代码:
void MX_BLE_DataTransmit(void)
{
// 实现BLE数据传输
// 1. 发送数据
uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
HAL_BLE_SendData(data, sizeof(data));
// 2. 等待数据接收完成
HAL_BLE_WaitForDataReceived();
// 3. 接收数据
uint8_t receivedData[10];
HAL_BLE_ReceiveData(receivedData, sizeof(receivedData));
// 4. 打印接收到的数据
printf("Received data: ");
for (int i = 0; i < sizeof(receivedData); i++)
{
printf("%02x ", receivedData[i]);
}
printf("\n");
}
上述代码中,我们使用HAL_BLE_SendData函数发送数据,然后使用HAL_BLE_WaitForDataReceived函数等待数据接收完成。接着,我们使用HAL_BLE_ReceiveData函数接收数据,并打印接收到的数据。
- 结束BLE连接
当BLE通信完成后,我们需要结束BLE连接。在main.c文件中,找到MX_BLE_Disconnection函数。该函数会在main函数后调用,我们需要在此处结束BLE连接。
以下是一个示例代码:
void MX_BLE_Disconnection(void)
{
// 结束BLE连接
// 1. 断开连接
HAL_BLE_Disconnect();
// 2. 等待断开连接事件
BLE_Disconnection_EventTypeDef disconnEvent;
HAL_BLE_WaitForDisconnectionEvent(&disconnEvent);
// 3. 打印断开连接
作者:无敌暴龙战士-