
STM32F103C8T6与HC-05蓝牙模块实战打造智能LED远程控制系统在物联网技术蓬勃发展的今天无线控制已成为嵌入式开发中的基础技能。STM32F103C8T6作为性价比极高的ARM Cortex-M3内核微控制器搭配HC-05蓝牙模块能够快速构建一套完整的手机远程控制系统。本文将带您从硬件连接到软件配置完整实现通过手机APP控制LED灯的功能。1. 硬件准备与连接1.1 所需材料清单STM32F103C8T6开发板蓝色小板HC-05蓝牙模块建议选择带底板版本USB转TTL串口模块用于初始配置LED灯及220Ω限流电阻杜邦线若干智能手机Android/iOS均可1.2 硬件连接示意图正确的硬件连接是项目成功的第一步。HC-05蓝牙模块与STM32的连接遵循串口通信的基本规则HC-05引脚STM32连接点说明VCC3.3V电源正极GNDGND电源地TXDPA10(RX)数据发送端RXDPA9(TX)数据接收端EN不连接使能引脚STATE不连接状态指示注意HC-05模块的TXD应连接STM32的RX引脚RXD连接TX引脚这是串口通信的标准接法。LED连接示例LED正极 → PB12引脚LED负极 → 220Ω电阻 → GND2. HC-05蓝牙模块配置2.1 AT指令模式进入方法HC-05模块在使用前通常需要进行基本参数配置。进入AT指令模式的特殊操作断开模块电源按住模块上的小按钮如有或短接EN引脚至高电平保持按住状态的同时接通电源模块指示灯变为慢闪约2秒一次表示进入AT模式2.2 常用AT指令集通过串口调试助手发送以下指令波特率通常为38400AT # 测试指令应返回OK ATNAMEMyLEDCtrl # 设置蓝牙名称 ATPSWD1234 # 设置配对密码 ATUART9600,0,0 # 设置通信波特率 ATROLE0 # 设置为从模式配置完成后断开电源重新上电模块将进入正常工作模式指示灯快速闪烁表示等待连接。3. STM32软件开发环境搭建3.1 开发工具准备推荐使用以下工具链组合Keil MDK-ARM或STM32CubeIDESTM32CubeMX用于外设初始化串口调试助手如SSCOM、Putty等手机端蓝牙调试APP如蓝牙串口3.2 工程创建与配置使用STM32CubeMX快速初始化外设选择STM32F103C8T6型号启用USART1模式AsynchronousBaud Rate: 9600Word Length: 8 BitsParity: NoneStop Bits: 1配置GPIOPA9为USART1_TXPA10为USART1_RXPB12为GPIO_Output连接LED生成代码后在Keil中打开工程添加以下关键代码4. 核心代码实现4.1 串口接收中断处理在stm32f1xx_it.c中添加串口中断处理void USART1_IRQHandler(void) { if(USART1-SR USART_SR_RXNE){ uint8_t receivedChar USART1-DR; if(receivedChar 1){ GPIOB-BSRR GPIO_BSRR_BS12; // LED ON } else if(receivedChar 0){ GPIOB-BSRR GPIO_BSRR_BR12; // LED OFF } USART1-DR receivedChar; // 回显接收到的字符 } }4.2 主程序逻辑在main.c中添加简单控制逻辑int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { // 主循环保持空转所有处理在中断中完成 } }5. 手机端控制实现5.1 蓝牙调试APP选择推荐使用以下免费APPAndroid: 蓝牙串口终端iOS: LightBlue或Serial Bluetooth Terminal5.2 通信协议设计为扩展性考虑建议设计简单协议格式命令功能LED1开启LEDLED0关闭LEDSTAT获取状态在STM32代码中可相应扩展处理if(strncmp((char*)rxBuffer, LED1, 4) 0){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); USART_SendString(LED ON\r\n); }6. 进阶功能与优化6.1 多LED控制扩展通过修改协议格式可实现多路LED控制#define LED_NUM 3 uint16_t LED_Pins[LED_NUM] {GPIO_PIN_12, GPIO_PIN_13, GPIO_PIN_14}; void ControlLED(uint8_t index, uint8_t state) { if(index LED_NUM) return; HAL_GPIO_WritePin(GPIOB, LED_Pins[index], state ? GPIO_PIN_SET : GPIO_PIN_RESET); }6.2 状态反馈机制添加状态查询功能手机端可主动获取当前LED状态if(strncmp((char*)rxBuffer, STAT, 4) 0){ char statusMsg[32]; sprintf(statusMsg, LED1:%d LED2:%d\r\n, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12), HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13)); USART_SendString(statusMsg); }6.3 低功耗优化对于电池供电场景可启用STM32的低功耗模式void EnterLowPowerMode(void) { HAL_UART_DeInit(huart1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); // 唤醒后需重新配置时钟 MX_USART1_UART_Init(); }7. 常见问题排查7.1 蓝牙无法连接检查模块供电是否稳定3.3V确认手机已输入正确配对密码验证模块波特率与STM32设置一致7.2 数据收发异常检查TX/RX接线是否正确交叉确保双方串口参数波特率、数据位等完全一致在STM32端添加数据回显功能辅助调试7.3 LED不响应测量GPIO引脚实际输出电平检查LED极性是否接反确认中断服务程序被正确触发在实际项目中我遇到过因波特率微小的不匹配导致通信失败的情况。后来发现某些HC-05模块的实际波特率与标称值存在约2%的偏差通过示波器测量实际波形才找到问题根源。这也提醒我们硬件调试时不能完全依赖理论参数。