手机蓝牙发送指令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 不亮 引脚不对 / 没接电阻
只能接收一次 没清中断标志
相关推荐
2401_8275012820 分钟前
51单片机(二):GPIO、中断、定时器与PWM
单片机·嵌入式硬件·51单片机
ACP广源盛139246256732 小时前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件
Bobolink_4 小时前
手机端和电脑端的网络环境配置有什么不同?
网络·智能手机·电脑·网络环境
辰哥单片机设计5 小时前
STM32音乐播放器
stm32·单片机·嵌入式硬件
周洲08305 小时前
STM32 串口指令控制系统|上位机下发命令控制 LED、继电器,通用指令解析框架
stm32·嵌入式硬件·mongodb
集芯微电科技有限公司5 小时前
PC3100H 专为TFT-LCD面板偏置电源设计双输出100m电流
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
广州灵眸科技有限公司6 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 系统操作-线进程操作
数据库·单片机·嵌入式硬件·算法·php
集芯微电科技有限公司7 小时前
各种大小尺寸TFT-LCD面板供电偏压电源方案IC
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
FREEDOM_X7 小时前
嵌入式——定时器工作原理
linux·c语言·单片机·嵌入式硬件·ubuntu
2401_827501288 小时前
51单片机(三)串口通信(UART)、Modbus协议
单片机·嵌入式硬件·51单片机