HC-05 蓝牙模块 AT 指令实战:STM32 配置 5 个关键参数与常见错误排查
在嵌入式系统开发中,无线通信已成为不可或缺的一部分。HC-05 蓝牙模块因其成本效益和易用性,成为许多开发者的首选。本文将深入探讨如何通过 AT 指令配置 HC-05 模块,并集成到 STM32 项目中。
1. HC-05 模块基础认知
HC-05 是一款基于蓝牙 2.0+EDR 规范的串口通信模块,工作在 2.4GHz ISM 频段。它支持主从两种模式切换,最大传输距离约 10 米(开放空间)。模块核心特性包括:
- 双工作模式:数据模式(默认)和 AT 命令模式
- 通信接口:UART(TTL 电平)
- 供电电压:3.3V-5V DC
- 典型功耗:配对时 <40mA,待机时 <2.5mA
模块引脚定义如下表:
| 引脚 | 功能描述 |
|---|---|
| EN | AT模式使能(高电平激活) |
| VCC | 电源输入(3.3-5V) |
| GND | 接地 |
| TXD | 串行数据发送 |
| RXD | 串行数据接收 |
| STATE | 连接状态指示 |
注意:部分版本模块的 EN 引脚可能标记为 KEY,功能相同。
2. STM32 硬件连接与初始化
2.1 电路连接方案
推荐使用 STM32F4 系列芯片,其硬件连接方式如下:
// GPIO 配置示例(以USART2为例) #define HC05_UART USART2 #define HC05_TX_PIN GPIO_Pin_2 #define HC05_RX_PIN GPIO_Pin_3 #define HC05_EN_PIN GPIO_Pin_4 #define HC05_STATE_PIN GPIO_Pin_5 #define HC05_GPIO_PORT GPIOA // 电平转换电路(5V转3.3V) // TXD线:STM32 -> 1KΩ -> HC05_RX // └---> 2KΩ -> GND2.2 HAL 库初始化代码
void HC05_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 38400; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); // 使能EN引脚 HAL_GPIO_WritePin(HC05_GPIO_PORT, HC05_EN_PIN, GPIO_PIN_SET); }3. 核心 AT 指令配置实战
3.1 进入 AT 命令模式
- 硬件触发:EN引脚拉高后重新上电
- 软件验证:发送"AT\r\n"应返回"OK"
int HC05_EnterATMode(UART_HandleTypeDef *huart) { char cmd[] = "AT\r\n"; char resp[10]; HAL_UART_Transmit(huart, (uint8_t*)cmd, strlen(cmd), 100); HAL_UART_Receive(huart, (uint8_t*)resp, sizeof(resp), 500); if(strstr(resp, "OK") != NULL) { return 0; // 成功 } return -1; // 失败 }3.2 五大关键参数配置
3.2.1 设备名称设置(AT+NAME)
int HC05_SetName(const char *name) { char cmd[32]; sprintf(cmd, "AT+NAME=%s\r\n", name); // ...发送命令并验证响应... }3.2.2 配对密码设置(AT+PSWD)
安全提示:避免使用默认密码"1234"或"0000"
int HC05_SetPassword(const char *pwd) { char cmd[32]; sprintf(cmd, "AT+PSWD=\"%s\"\r\n", pwd); // ...发送命令... }3.2.3 角色模式设置(AT+ROLE)
| 参数值 | 角色模式 |
|---|---|
| 0 | 从机模式 |
| 1 | 主机模式 |
| 2 | 回环模式 |
int HC05_SetRole(uint8_t role) { if(role > 2) return -1; char cmd[16]; sprintf(cmd, "AT+ROLE=%d\r\n", role); // ...发送命令... }3.2.4 串口参数设置(AT+UART)
典型配置格式:AT+UART=38400,0,0
(波特率,停止位,校验位)
int HC05_SetUART(uint32_t baud, uint8_t stop, uint8_t parity) { char cmd[32]; sprintf(cmd, "AT+UART=%lu,%d,%d\r\n", baud, stop, parity); // ...发送命令... }3.2.5 模块复位(AT+RESET)
int HC05_Reset(void) { const char cmd[] = "AT+RESET\r\n"; // ...发送命令... HAL_Delay(2000); // 等待重启完成 }4. 常见错误排查指南
4.1 无响应问题排查流程
- 检查电源电压(3.3V稳定供电)
- 确认EN引脚状态(AT模式需高电平)
- 验证波特率设置(默认38400)
- 检查串口线序(交叉连接TX-RX)
4.2 典型错误代码分析
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回ERROR | 指令格式错误 | 确保以"\r\n"结尾 |
| 乱码 | 波特率不匹配 | 重新同步波特率 |
| 连接不稳定 | 电源噪声 | 增加100μF电容 |
| 无法配对 | 角色配置冲突 | 检查主从模式设置 |
4.3 状态指示灯解读
- 快闪(2次/秒):等待配对
- 慢闪(1次/2秒):AT模式就绪
- 常亮:已建立连接
5. 高级应用技巧
5.1 多模块组网配置
实现两个HC-05模块直连的配置步骤:
- 配置模块A为主机:
AT+ROLE=1 - 设置查询密码:
AT+PSWD=xxxx - 绑定模块B地址:
AT+BIND=xxxx,xx,xxxxxx - 模块B设为从机:
AT+ROLE=0
5.2 低功耗优化方案
// 启用休眠模式(需特定固件支持) int HC05_EnableSleep(void) { const char cmd[] = "AT+SLEEP=1\r\n"; // ...发送命令... }5.3 固件升级方法
- 通过USB-TTL连接模块的PIO0/PIO1
- 使用CSR BCSP工具烧录新固件
- 注意:不同硬件版本需对应特定固件
在实际项目中,我发现最常出现的问题是波特率配置不一致导致的通信失败。特别是在切换AT模式和数据模式时,务必确认当前模式的波特率设置。一个实用的调试技巧是使用逻辑分析仪捕捉串口信号,直接观察实际通信波形。