> 技术文档 > STM32外设系列—HC-05(蓝牙)_hc05

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


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

❤欢迎关注我的知乎:对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上查看,验证通信是否正常。