大家好,我是专注分享职业规划/技术科普/智能生活有关原创文章的allen康哥。
蓝牙在嵌入式开发中是经常使用的模块,今天介绍下在使用单片机开发中蓝牙模块的配置和使用。
1.模块选型
常见的蓝牙模块类型:
经典蓝牙(BR/EDR):如HC-05、HC-06(通过AT指令配置)。
低功耗蓝牙(BLE):如JDY-08、TI CC2541、Nordic nRF系列等。
集成协议栈的模块:如ESP32(支持蓝牙+WiFi)。
HC-05,这款模块适合初学者,就是通过UART直接通信。下面就以这款模块为例。
2. 硬件连接(以HC-05为例)
| 蓝牙模块引脚 | STM32引脚 | 说明 |
| VCC | 3.3V/5V | 注意模块电压要求 |
| GND | GND | 共地 |
| TXD | USART_RX | 如PA3(USART2) |
| RXD | USART_TX | 如PA2(USART2) |
| KEY | GPIO/3.3V | 用于进入AT模式 |
注意:
部分模块需在AT模式下配置(如HC-05需拉高KEY引脚再上电)。
3. 软件配置
1.启用USART外设:
使用STM32CubeMX配置USART为异步模式(Asynchronous)。
设置波特率(如9600、115200,需与蓝牙模块匹配)。
启用USART中断(如需接收数据)。
2.编写串口收发代码:
// 发送数据到蓝牙模块
char msg[] = "Hello Bluetooth!rn";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
// 接收数据(中断模式)
uint8_t rx_buffer[128];
HAL_UART_Receive_IT(&huart2, rx_buffer, 1); // 每次接收1字节
3.中断回调处理:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART2) {
// 处理接收到的数据(例如存入缓冲区)
static uint8_t index = 0;
rx_buffer[index++] = rx_byte;
if (rx_byte == 'n' || index >= sizeof(rx_buffer)-1) {
rx_buffer[index] = '';
process_data(rx_buffer); // 自定义数据处理函数
index = 0;
}
// 重新启用接收中断
HAL_UART_Receive_IT(&huart2, &rx_byte, 1);
}
}
4.蓝牙模块配置(AT指令)
通过发送AT指令修改蓝牙模块参数(如名称、配对码):
// 进入AT模式(HC-05需拉高KEY引脚后重启)
HAL_Delay(1000);
char at_cmd[] = "AT+NAME=MY_STM32rn";
HAL_UART_Transmit(&huart2, (uint8_t*)at_cmd, strlen(at_cmd), HAL_MAX_DELAY);
常见AT指令(HC-05为例):
AT+NAME=<name>:设置设备名称。
AT+PSWD=<pin>:设置配对码(如1234)。
AT+UART=<baud>,<stop>,<parity>:设置波特率。
5.解析数据
帧格式:[Start][Data][Checksum][End]
示例:$DATA,123,456,789#($为起始符,#为结束符)。
void process_data(uint8_t *data) {
if (data[0] == '$' && data[strlen(data)-1] == '#') {
// 提取有效数据并处理
sscanf((char*)data, "$%[^#]", payload);
// 进一步解析payload(如逗号分隔)
}
}
6.调试工具
串口调试助手:验证蓝牙模块基础功能。
手机APP:如nRF Connect(BLE)、Bluetooth Terminal(经典蓝牙)。
逻辑分析仪:抓取UART信号排查通信问题。
资源链接:
HC-05 Datasheet
https://www.alldatasheet.com/datasheet-pdf/pdf/3042/MOTOROLA/HC05.html
3436