手机蓝牙发送指令STM32串口接收控制 LED 亮灭

最经典的 STM32 蓝牙入门实验,逻辑非常简单:

手机蓝牙发送指令 → STM32 串口接收 → 控制 LED 亮灭

STM32F103 + HC‑05 蓝牙模块


一、硬件连接(非常重要)

1、HC‑05 蓝牙模块 ↔ STM32F103

HC‑05 STM32F103 说明
VCC 5V 蓝牙功耗较大
GND GND
TXD PA10 (USART1_RX) 蓝牙 → 单片机
RXD PA9 (USART1_TX) 单片机 → 蓝牙

注意

  • HC‑05 是 3.3V 电平容忍,RX 可直接接 STM32
  • 如果不确定,串 1k 电阻更安全

2、 LED 连接

LED STM32
正极 PB12(串联 220Ω 电阻)
负极 GND

二、软件设计思路

复制代码
手机蓝牙APP
     ↓
HC-05 串口
     ↓
USART1 接收中断
     ↓
判断收到 '1' / '0'
     ↓
PB12 输出高 / 低

三、核心源码(标准外设库)

1、LED 初始化

c 复制代码
// led.c
#include "led.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_SetBits(GPIOB, GPIO_Pin_12); // 默认熄灭
}
c 复制代码
// led.h
#ifndef __LED_H
#define __LED_H

void LED_Init(void);
#define LED_ON()  GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define LED_OFF() GPIO_SetBits(GPIOB, GPIO_Pin_12)

#endif

2、串口初始化(蓝牙)

c 复制代码
// usart.c
#include "usart.h"
#include "stm32f10x_usart.h"

void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // PA9 TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // PA10 RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;   // HC-05 默认波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);

    // 开启接收中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

3、串口中断(核心逻辑)

c 复制代码
// usart.c(续)
#include "led.h"

void USART1_IRQHandler(void)
{
    uint8_t data;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        data = USART_ReceiveData(USART1);

        if(data == '1')
        {
            LED_ON();      // 手机发 1 → LED亮
        }
        else if(data == '0')
        {
            LED_OFF();     // 手机发 0 → LED灭
        }
    }
}

4、 main.c

c 复制代码
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"

int main(void)
{
    LED_Init();
    USART1_Init();

    while(1)
    {
        // 主循环什么都不用做
    }
}

参考代码 STM32蓝牙接收让LED亮 www.youwenfan.com/contentcsv/103461.html

四、手机端操作

安卓 APP 推荐

  • 蓝牙串口助手
  • Serial Bluetooth Terminal

操作步骤

  1. 打开手机蓝牙

  2. 搜索并配对 HC‑05 (密码一般是 12340000

  3. 连接成功后

  4. 发送:

    复制代码
    1  → LED 亮
    0  → LED 灭

五、常见问题排查

现象 原因
没反应 波特率不是 9600
乱码 晶振不是 8MHz
能配对但收不到 TX/RX 接反
LED 不亮 引脚不对 / 没接电阻
只能接收一次 没清中断标志
相关推荐
AOI小白新手上路1 天前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan20121 天前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
lupai1 天前
手机在网状态接口实测效果与质量评估
大数据·python·智能手机·api接口
jianqiang.xue1 天前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
Messy create1 天前
【BMS-AFE-温度检测】
stm32·单片机·能源
东莞市永盛电气1 天前
三相208V变380V变压器,出海工业设备供电适配方案
python·单片机·嵌入式硬件
桃蹊、1 天前
串口/网络透传实战:FreeRTOS 多任务架构与连接池设计
stm32·物联网·wifi·freertos
新晨单片机设计1 天前
S001A-基于STM32单片机超声波视力保护仪【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
星河单片机1 天前
STM32驱动Y01-3IN1空气质量模块+OLED显示完整教程
stm32·单片机·嵌入式硬件·空气质量·甲醛检测·二氧化碳检测·tvoc检测
玩转单片机与嵌入式1 天前
深入浅出TinyML 21:INT8量化改变了模型中的哪些数据?
stm32·深度学习·tinyml