手机蓝牙发送指令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 (密码一般是 1234 或 0000)

  3. 连接成功后

  4. 发送:

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

五、常见问题排查

现象 原因
没反应 波特率不是 9600
乱码 晶振不是 8MHz
能配对但收不到 TX/RX 接反
LED 不亮 引脚不对 / 没接电阻
只能接收一次 没清中断标志
相关推荐
lkjaslkdj14 分钟前
河马引力与图拉斯凯芙拉手机壳对比:一个可测试的防摔结构,两个1mm薄度内的日常量化基准
智能手机
金色光环42 分钟前
【DSP学习】C2000_PWM中断程序_笔记
笔记·单片机·学习
智购科技智能售货柜1 小时前
顾客已经关门,视觉售货柜还在处理旧画面:延迟积压怎么查?~YH
python·单片机·嵌入式硬件·物联网·eclipse
糖糖单片机设计1 小时前
基于 STM32 的智能电蚊香控制系统
stm32·单片机·嵌入式硬件
zhangrelay3 小时前
Arduino-MEGA-ESP单片机理论课笔记-01入门-02硬件-03开发环境-2026
笔记·单片机·嵌入式硬件·学习·机器人
AlanAshley3 小时前
手机与电脑的屏幕计时器熄屏区别及协议栈
单片机·智能手机·电脑
AlanAshley3 小时前
电脑烧屏的软件与硬件原因全解析
单片机·嵌入式硬件·电脑
ScilogyHunter4 小时前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
szxinmai主板定制专家4 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
笨笨饿4 小时前
#60_# 一、Photoshop 2025 如何批量导出 PSD 文件中的所有图层为独立 PNG 图片
stm32·单片机·嵌入式硬件·物联网·ui·51单片机·photoshop