STM32外设系列—HC-05(蓝牙)

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、蓝牙及HC-05简介

蓝牙(Bluetooth)是一种无线技术标准,可在固定设备、移动设备和楼宇个人域网之间进行短距离数据交换,工作在2.4 - 2.485GHz的ISM波段的UHF无线电波频段。它最初由爱立信公司于1994年创制,作为RS232数据线的替代方案,能连接多个设备,解决数据同步难题。

HC-05是一款常用的蓝牙串口模块,支持主从模式切换,广泛应用于各类嵌入式项目中。其具备以下特点:

  • 易用性:硬件连接和软件配置相对简单,方便开发者快速上手。
  • 性价比高:价格较为亲民,在对成本敏感的项目中具有优势。
  • 模式灵活:可设置为主模式或从模式,能满足不同的应用场景需求。

二、硬件连接

将HC-05与STM32连接时,需要注意以下引脚连接:

  • 电源连接:HC-05的VCC连接到STM32的3.3V(注意,有些HC-05模块也支持5V供电,但需确认模块规格),GND连接到STM32的GND,为模块提供稳定电源。
  • 串口连接:HC-05的TX(发送端)连接到STM32的RX(接收端,例如PA10引脚) ;HC-05的RX(接收端)连接到STM32的TX(发送端,例如PA9引脚),用于数据的收发通信。

三、HC-05模块配置(使用AT指令)

HC-05模块默认工作在从机模式,波特率为9600bps。若需更改配置,可通过以下步骤利用AT指令进行设置:

  1. 进入配置模式:按住HC-05模块上的按钮(部分模块有此按钮),再给模块上电,此时模块上的LED会慢速闪烁,表示进入配置模式。
  2. 连接串口工具:使用USB转TTL模块连接HC-05模块,并将USB端连接到电脑,通过串口调试助手发送AT指令。注意,配置模式下,HC-05的默认波特率为38400bps。
  3. 常用AT指令
    • AT:检查模块是否连接正常,若正常,模块会回复“OK”。
    • AT+NAME=名字:配置HC-05的名称,配置成功后返回“OK”,例如“AT+NAME=MyHC05” 。
    • AT+PSWD=密码:设置配对密码,如“AT+PSWD=1234”。
    • AT+UART=波特率,停止位,校验:设置串口参数,例如“AT+UART=115200,0,0”表示设置波特率为115200,一位停止位,无校验。
  4. 退出配置模式:配置完成后,断电重新上电,模块按新配置开始工作,LED快速闪烁。

四、STM32软件配置(以STM32F103为例)

  1. 初始化GPIO:将连接HC-05的STM32引脚(如PA9、PA10)配置为串口功能对应的复用推挽输出和浮空输入模式。
  2. 初始化USART:设置串口的波特率、数据位、停止位、校验位等参数,使能串口。
  3. 编写数据收发函数
    • 发送数据:使用HAL库函数HAL_UART_Transmit发送数据到HC-05模块。例如:
void USART_SendString(UART_HandleTypeDef *huart, char *str)
{
    while(*str != '\0')
    {
        HAL_UART_Transmit(huart, (uint8_t *)str, 1, 0xFFFF);
        str++;
    }
}
- **接收数据**:可采用中断方式或轮询方式。以中断方式为例,使能串口接收中断,在中断处理函数中处理接收到的数据。
// 使能接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);

// 中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    // 处理接收到的数据,例如存储到数组
    RxBufferArray[RxBufferIndex] = RxBuffer;
    RxBufferIndex++;
    // 继续开启接收中断
    HAL_UART_Receive_IT(huart, (uint8_t *)&RxBuffer, 1);
}

五、完整代码示例(STM32F103)

#include "stm32f1xx_hal.h"

UART_HandleTypeDef huart1;
char RxBuffer;
uint8_t RxBufferArray[100];
uint8_t RxBufferIndex = 0;

// 系统时钟配置函数
void SystemClock_Config(void)
{
    // 具体配置代码省略
}

// GPIO初始化函数
static void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    // PA9配置为复用推挽输出(TX)
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    // PA10配置为浮空输入(RX)
    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// USART1初始化函数
static void MX_USART1_UART_Init(void)
{
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

// 发送字符串函数
void USART_SendString(UART_HandleTypeDef *huart, char *str)
{
    while(*str != '\0')
    {
        HAL_UART_Transmit(huart, (uint8_t *)str, 1, 0xFFFF);
        str++;
    }
}

// 接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    RxBufferArray[RxBufferIndex] = RxBuffer;
    RxBufferIndex++;
    HAL_UART_Receive_IT(huart, (uint8_t *)&RxBuffer, 1);
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    // 开启接收中断
    HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);

    while (1)
    {
        // 示例:接收到数据后回传
        if(RxBufferIndex > 0)
        {
            USART_SendString(&huart1, (char *)RxBufferArray);
            RxBufferIndex = 0;
        }
    }
}

六、通信测试

  1. 确保STM32和HC-05模块电源正常,连接无误。
  2. 使用手机或其他蓝牙设备,搜索并连接HC-05模块(连接时需输入设置的配对密码)。
  3. 打开蓝牙调试APP,发送数据,观察STM32是否能正确接收并处理;STM32发送的数据也可在APP上查看,验证通信是否正常。
步骤: 1. 两个蓝牙模块必须一个作为主机,另一个作为从机才能建立连接(上电后,从机一直处于接受状态,等待被连接。而主机则主动发出信号,寻找目标从机,前提是该目标从机的mac地址事先被写入到主机的flash芯片中储存) 2. 蓝牙模块上电前一直按住key按键不放,上电后松开,此时LED灯处于慢闪状态(每秒闪1次),提示已经进入AT指令响应状态,可以进行接收AT指令控制 3. PC端打开安可信串口助手(带AT指令),打开相应的串口,发送AT+ROLE?\n查询该模块的主从角色,如果为0,则为从机,如果为1则为主机。本例中,此模块(图中左边的HC-05模块)设为主机,则发送AT+ROLE=1\n,设为主机,成功返回OK 4. 发送AT+ADDR?\n查询此模块的mac地址,本例中为98d3:33:80ebdf,记下来稍后为从机的地址绑定用。同样的方法将另一个模块(图中右边的HC-05模块)设置为从机(AT+ROLE=0\n),并且查询到mac地址为98d3:36:aac2 5. 向主机串口中发送AT+BIND=98d3,36,aac2\n绑定从机的mac地址,成功则返回OK。发送AT+CMODE=0\n将主机设为指定蓝牙地址连接模式(即只允许主机向绑定好mac地址的蓝牙从机设备发起连接) 6. 同样地,向从机串口发送AT+BIND=983d,33,80ebdf\n绑定主机的mac地址,成功则返回OK。发送AT+CMODE=0\n将从机也设为指定蓝牙地址连接模式(即只允许从机接受绑定好mac地址的蓝牙主机设备发起的连接) 7. 至此,主从机均设置完毕。主从两模块松开key键重新上电,LED都快闪(每秒闪2次),表明均处于等待配对状态,随后大约几秒钟后,LED闪烁频率发生变化(不确定),表明已经侦测到目标设备,正在建立连接。随后大约一秒钟,很快 LED变成慢双闪状态(每2秒闪一次,每次连闪2下),提示已经配对成功,可以通过蓝牙协议传输数据了 8. 此时,在串口助手中发送一串字符,如果另一个蓝牙模块的串口助手里收到了同样的字符,且回送的字符,对方亦能收到,则通信成功。
### HC-05蓝牙模块使用说明及配置教程 #### 工作原理 HC-05是一种基于蓝牙2.1标准的无线通信模块,支持主从模式切换。该模块通过UART接口与微控制器(如STM32)连接并交换数据[^1]。 #### 传输方式 HC-05采用异步串行通讯协议进行数据传输,在默认设置下波特率为9600bps。当两个设备配对成功后即可建立双向透明的数据通道用于发送和接收信息流。 #### 模块种类 市场上存在多种版本的HC系列蓝牙产品,其中HC-05属于经典型通用型号之一,具备良好的兼容性和稳定性;而其他变种可能针对特定应用场景做了优化改进。 #### 手机与STM32通信实现方法 ##### 蓝牙模块配置 为了使HC-05能够正常工作并与手机端应用程序交互,需对其进行必要的参数设定操作。这通常涉及到修改本地名称、PIN码等基本信息项,并确保其处于可被发现状态以便后续配对过程顺利开展[^2]。 ##### 代码编写要点 对于嵌入式开发而言,利用C/C++编程语言完成如下功能至关重要: - **串口初始化** ```c void UART_Init(void){ // 初始化USART外设寄存器... } ``` - **中断服务函数定义** 当接收到有效字符时触发相应处理逻辑: ```c void USART_IRQHandler(void){ if (USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET){ char ch = USART_ReceiveData(USARTx); ProcessReceivedChar(ch); } } ``` - **接收数据包解析算法设计** 根据实际需求制定合理的帧结构来封装待传递的内容片段,从而提高系统的可靠性和效率。 ##### 上位机数据包配置建议 在PC侧运行专门定制好的图形界面工具辅助测试阶段的操作流程,比如调整波特率数值或者输入自定义命令字符串等等。 #### 调试技巧分享 在整个项目实施过程中难免会遇到各种各样的挑战,因此积累一些实用的经验是非常有帮助的。例如合理运用LED指示灯监控当前连接状况变化趋势,借助逻辑分析仪捕捉异常信号特征进而定位潜在问题所在位置等手段均能显著提升工作效率。 #### 总结经验教训 综上所述,掌握好HC-05硬件特性和软件驱动机制只是第一步而已,更重要的是要善于总结归纳过往经历中的得失之处,不断探索更佳实践方案以满足日益增长的应用场景要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值