从零构建STM32蓝牙LED控制系统硬件接线到手机App开发的完整指南在物联网和智能家居蓬勃发展的今天无线控制技术已成为嵌入式开发者的必备技能。本文将带你用最经济的STM32F103C8T6开发板俗称蓝莓派和HC-06蓝牙模块打造一个完整的手机无线LED控制系统。不同于单纯的理论讲解我们将采用项目驱动式学习通过一个看得见、摸得着的实际项目让你在动手实践中掌握蓝牙通信的核心技术。1. 硬件准备与电路搭建1.1 所需材料清单在开始前请确保准备好以下硬件STM32F103C8T6开发板核心板带USB转串口芯片为佳HC-06蓝牙模块注意区分主从模式建议选用从机版LED灯及220Ω限流电阻杜邦线若干建议使用不同颜色区分功能微型面包板可选方便临时搭建电路USB转TTL模块仅用于初始蓝牙配置非必需提示HC-06模块有多个版本购买时确认通信波特率常见为9600或115200这将影响后续代码配置。1.2 电路连接详解正确的硬件连接是项目成功的基础。按照以下步骤进行接线电源连接HC-06的VCC引脚 → STM32的5V输出HC-06的GND引脚 → STM32的GND串口通信线路HC-06的TXD → STM32的PA3USART2_RXHC-06的RXD → STM32的PA2USART2_TXLED控制电路LED正极 → STM32的PC13通过220Ω电阻LED负极 → GND// 引脚功能定义后续代码会用到 #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC #define USART2_TX_PIN GPIO_Pin_2 #define USART2_RX_PIN GPIO_Pin_3 #define USART2_PORT GPIOA连接完成后建议用万用表检查各连接点是否导通特别是电源和地线之间不应短路。初次上电时HC-06模块上的红色指示灯应常亮蓝色指示灯应间隔闪烁表示进入可配对状态。2. 蓝牙模块配置与测试2.1 AT指令基础配置HC-06模块出厂时可能需要进行基本配置。如果没有USB转TTL模块我们可以利用STM32本身作为中介来发送AT指令搭建临时调试环境将STM32的USART1PA9-TX, PA10-RX通过CH340等芯片连接到电脑在代码中设置USART1和USART2之间的数据转发常用AT指令集AT测试指令应返回OKATNAMEname设置蓝牙名称ATPINxxxx设置配对密码通常为4位数字ATBAUDx设置波特率1-9600,2-19200,...,4-115200// 示例通过串口助手发送AT指令的转发代码 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART1); USART_SendData(USART2, ch); // 转发到蓝牙模块 } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART2); USART_SendData(USART1, ch); // 返回到串口助手 } }2.2 手机端连接测试配置完成后使用手机进行连接测试在手机应用商店搜索安装蓝牙串口助手推荐Serial Bluetooth Terminal打开手机蓝牙设置搜索并配对名为你设置的设备默认可能是HC-06配对密码输入你设置的PIN码默认常为1234打开蓝牙串口App选择已配对的HC-06设备成功连接后HC-06模块的蓝色指示灯应从闪烁变为常亮。此时在手机App中发送任意字符应该能在串口助手中看到回显。3. STM32固件开发3.1 开发环境搭建我们使用Keil MDK作为开发环境安装Keil uVision5建议使用5.23以上版本安装STM32F1xx Device Family Pack新建工程选择STM32F103C8T6作为目标设备配置工程使用标准外设库StdPeriph Lib或HAL库本文示例使用StdPeriph注意确保在Options for Target → C/C选项卡中勾选Use MicroLIB这是串口printf重定向所必需的。3.2 关键代码实现完整的工程应包含以下核心功能模块USART2初始化蓝牙通信接口void USART2_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 启用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 配置TX(PA2)为复用推挽输出 GPIO_InitStruct.GPIO_Pin USART2_TX_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(USART2_PORT, GPIO_InitStruct); // 配置RX(PA3)为浮空输入 GPIO_InitStruct.GPIO_Pin USART2_RX_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(USART2_PORT, GPIO_InitStruct); // USART参数配置 USART_InitStruct.USART_BaudRate baudrate; USART_InitStruct.USART_WordLength USART_WordLength_8b; USART_InitStruct.USART_StopBits USART_StopBits_1; USART_InitStruct.USART_Parity USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, USART_InitStruct); // 启用USART2接收中断 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART2_IRQn); USART_Cmd(USART2, ENABLE); }LED控制初始化void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin LED_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(LED_PORT, GPIO_InitStruct); GPIO_ResetBits(LED_PORT, LED_PIN); // 初始状态关闭 }蓝牙数据处理逻辑// 全局变量 uint8_t bluetoothBuffer[64]; uint8_t bluetoothIndex 0; void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) { uint8_t receivedChar USART_ReceiveData(USART2); // 简单协议1开灯0关灯 if(receivedChar 1) { GPIO_SetBits(LED_PORT, LED_PIN); USART_SendData(USART2, O); // 发送确认 } else if(receivedChar 0) { GPIO_ResetBits(LED_PORT, LED_PIN); USART_SendData(USART2, F); // 发送确认 } // 可选实现更复杂的命令解析 bluetoothBuffer[bluetoothIndex] receivedChar; if(receivedChar \n || bluetoothIndex sizeof(bluetoothBuffer)-1) { bluetoothBuffer[bluetoothIndex] \0; // 这里可以添加更复杂的命令处理逻辑 bluetoothIndex 0; } } }4. 手机App开发与系统集成4.1 使用现成蓝牙串口App对于快速验证可以使用现有的蓝牙串口App推荐AppAndroidSerial Bluetooth TerminaliOSLightBlue功能较基础基本功能测试发送1应点亮LED并收到O回应发送0应熄灭LED并收到F回应4.2 自定义App开发Android示例如果你想更进一步可以开发专属控制App。以下是Android Studio中的核心代码片段蓝牙权限配置AndroidManifest.xmluses-permission android:nameandroid.permission.BLUETOOTH/ uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN/ uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/蓝牙连接核心代码// 初始化蓝牙适配器 BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter(); // 搜索并连接HC-06 SetBluetoothDevice pairedDevices bluetoothAdapter.getBondedDevices(); for (BluetoothDevice device : pairedDevices) { if (device.getName().equals(HC-06)) { BluetoothSocket socket device.createRfcommSocketToServiceRecord( UUID.fromString(00001101-0000-1000-8000-00805F9B34FB)); socket.connect(); OutputStream outputStream socket.getOutputStream(); InputStream inputStream socket.getInputStream(); break; } } // 发送控制命令 public void sendCommand(char cmd) { try { outputStream.write(cmd); } catch (IOException e) { e.printStackTrace(); } }简单UI界面activity_main.xmlButton android:idid/btnOn android:text开灯 android:onClickonClickOn/ Button android:idid/btnOff android:text关灯 android:onClickonClickOff/4.3 系统优化与功能扩展基础功能实现后可以考虑以下增强功能状态反馈让STM32定时发送LED当前状态在App中显示真实设备状态而非假设状态多设备控制扩展协议支持控制多个LED示例协议格式LED1:ON\n、LED2:OFF\n安全增强实现简单的握手协议添加命令校验码低功耗优化当长时间不操作时让STM32进入睡眠模式通过蓝牙数据唤醒// 示例带校验的简单协议 void processCommand(uint8_t* cmd) { if(cmd[0] # cmd[3] *) { uint8_t checksum cmd[1] ^ cmd[2]; if(checksum cmd[4]) { // 校验通过执行命令 if(cmd[1] L) { if(cmd[2] 1) GPIO_SetBits(LED_PORT, LED_PIN); else if(cmd[2] 0) GPIO_ResetBits(LED_PORT, LED_PIN); } } } }5. 常见问题排查与调试技巧5.1 硬件连接问题现象可能原因解决方法蓝牙模块不亮电源接反或电压不足检查VCC/GND连接确认5V输出正常蓝牙灯亮但不闪烁模块可能损坏尝试AT指令测试必要时更换模块手机搜不到设备模块处于非可发现模式按住模块上的按键上电进入AT模式重新配置LED不响应接线错误或电阻过大检查PC13连接确认限流电阻为220Ω5.2 通信问题排查无数据接收确认USART2的TX/RX线没有接反检查代码中的波特率设置与HC-06模块一致使用逻辑分析仪或示波器检查USART2引脚是否有信号数据乱码确认双方的数据格式一致8数据位1停止位无校验检查系统时钟配置是否正确特别是使用非标准晶振时间歇性通信中断检查电源稳定性蓝牙模块对电压波动敏感确保地线连接良好避免共地噪声5.3 高级调试技巧利用printf调试// 重定向printf到USART1 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET); return ch; } // 在代码中插入调试信息 printf(系统启动完成当前波特率%d\n, baudrate);状态指示灯使用不同颜色的LED表示不同状态示例蓝色-等待连接绿色-数据通信红色-错误状态协议分析工具使用Wireshark配合蓝牙嗅探器分析通信过程开发简易的上位机软件可视化数据流6. 项目扩展与进阶应用掌握了基础蓝牙控制后可以尝试以下扩展方向物联网云平台集成通过ESP8266将STM32连接到WiFi将蓝牙数据转发到MQTT服务器实现远程网页控制多模块组网使用多个HC-06模块构建简单Mesh网络实现设备间的数据中继传感器数据采集添加温湿度传感器如DHT11通过蓝牙定时上报环境数据手机App实现数据图表展示低功耗优化设计改用STM32L系列低功耗MCU实现BLE蓝牙如HC-08模块通信优化电源管理使用纽扣电池供电// 示例低功耗模式下的蓝牙唤醒 void enterStopMode(void) { // 配置唤醒源为USART2接收中断 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line EXTI_Line3; // PA3对应EXTI3 EXTI_InitStruct.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger EXTI_Trigger_Rising; EXTI_InitStruct.EXTI_LineCmd ENABLE; EXTI_Init(EXTI_InitStruct); // 进入停止模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // 唤醒后需要重新配置系统时钟 SystemInit(); }完成这个项目后你会发现STM32蓝牙应用开发的核心在于理解串口通信原理和掌握基本的外设编程方法。这套技术栈可以轻松迁移到电机控制、智能家居、穿戴设备等各种应用场景中。
手把手教你用STM32F103C8T6和HC-06蓝牙模块,实现手机App无线控制LED灯
发布时间:2026/6/4 17:19:49
从零构建STM32蓝牙LED控制系统硬件接线到手机App开发的完整指南在物联网和智能家居蓬勃发展的今天无线控制技术已成为嵌入式开发者的必备技能。本文将带你用最经济的STM32F103C8T6开发板俗称蓝莓派和HC-06蓝牙模块打造一个完整的手机无线LED控制系统。不同于单纯的理论讲解我们将采用项目驱动式学习通过一个看得见、摸得着的实际项目让你在动手实践中掌握蓝牙通信的核心技术。1. 硬件准备与电路搭建1.1 所需材料清单在开始前请确保准备好以下硬件STM32F103C8T6开发板核心板带USB转串口芯片为佳HC-06蓝牙模块注意区分主从模式建议选用从机版LED灯及220Ω限流电阻杜邦线若干建议使用不同颜色区分功能微型面包板可选方便临时搭建电路USB转TTL模块仅用于初始蓝牙配置非必需提示HC-06模块有多个版本购买时确认通信波特率常见为9600或115200这将影响后续代码配置。1.2 电路连接详解正确的硬件连接是项目成功的基础。按照以下步骤进行接线电源连接HC-06的VCC引脚 → STM32的5V输出HC-06的GND引脚 → STM32的GND串口通信线路HC-06的TXD → STM32的PA3USART2_RXHC-06的RXD → STM32的PA2USART2_TXLED控制电路LED正极 → STM32的PC13通过220Ω电阻LED负极 → GND// 引脚功能定义后续代码会用到 #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC #define USART2_TX_PIN GPIO_Pin_2 #define USART2_RX_PIN GPIO_Pin_3 #define USART2_PORT GPIOA连接完成后建议用万用表检查各连接点是否导通特别是电源和地线之间不应短路。初次上电时HC-06模块上的红色指示灯应常亮蓝色指示灯应间隔闪烁表示进入可配对状态。2. 蓝牙模块配置与测试2.1 AT指令基础配置HC-06模块出厂时可能需要进行基本配置。如果没有USB转TTL模块我们可以利用STM32本身作为中介来发送AT指令搭建临时调试环境将STM32的USART1PA9-TX, PA10-RX通过CH340等芯片连接到电脑在代码中设置USART1和USART2之间的数据转发常用AT指令集AT测试指令应返回OKATNAMEname设置蓝牙名称ATPINxxxx设置配对密码通常为4位数字ATBAUDx设置波特率1-9600,2-19200,...,4-115200// 示例通过串口助手发送AT指令的转发代码 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART1); USART_SendData(USART2, ch); // 转发到蓝牙模块 } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART2); USART_SendData(USART1, ch); // 返回到串口助手 } }2.2 手机端连接测试配置完成后使用手机进行连接测试在手机应用商店搜索安装蓝牙串口助手推荐Serial Bluetooth Terminal打开手机蓝牙设置搜索并配对名为你设置的设备默认可能是HC-06配对密码输入你设置的PIN码默认常为1234打开蓝牙串口App选择已配对的HC-06设备成功连接后HC-06模块的蓝色指示灯应从闪烁变为常亮。此时在手机App中发送任意字符应该能在串口助手中看到回显。3. STM32固件开发3.1 开发环境搭建我们使用Keil MDK作为开发环境安装Keil uVision5建议使用5.23以上版本安装STM32F1xx Device Family Pack新建工程选择STM32F103C8T6作为目标设备配置工程使用标准外设库StdPeriph Lib或HAL库本文示例使用StdPeriph注意确保在Options for Target → C/C选项卡中勾选Use MicroLIB这是串口printf重定向所必需的。3.2 关键代码实现完整的工程应包含以下核心功能模块USART2初始化蓝牙通信接口void USART2_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 启用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 配置TX(PA2)为复用推挽输出 GPIO_InitStruct.GPIO_Pin USART2_TX_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(USART2_PORT, GPIO_InitStruct); // 配置RX(PA3)为浮空输入 GPIO_InitStruct.GPIO_Pin USART2_RX_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(USART2_PORT, GPIO_InitStruct); // USART参数配置 USART_InitStruct.USART_BaudRate baudrate; USART_InitStruct.USART_WordLength USART_WordLength_8b; USART_InitStruct.USART_StopBits USART_StopBits_1; USART_InitStruct.USART_Parity USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, USART_InitStruct); // 启用USART2接收中断 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART2_IRQn); USART_Cmd(USART2, ENABLE); }LED控制初始化void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin LED_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(LED_PORT, GPIO_InitStruct); GPIO_ResetBits(LED_PORT, LED_PIN); // 初始状态关闭 }蓝牙数据处理逻辑// 全局变量 uint8_t bluetoothBuffer[64]; uint8_t bluetoothIndex 0; void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) { uint8_t receivedChar USART_ReceiveData(USART2); // 简单协议1开灯0关灯 if(receivedChar 1) { GPIO_SetBits(LED_PORT, LED_PIN); USART_SendData(USART2, O); // 发送确认 } else if(receivedChar 0) { GPIO_ResetBits(LED_PORT, LED_PIN); USART_SendData(USART2, F); // 发送确认 } // 可选实现更复杂的命令解析 bluetoothBuffer[bluetoothIndex] receivedChar; if(receivedChar \n || bluetoothIndex sizeof(bluetoothBuffer)-1) { bluetoothBuffer[bluetoothIndex] \0; // 这里可以添加更复杂的命令处理逻辑 bluetoothIndex 0; } } }4. 手机App开发与系统集成4.1 使用现成蓝牙串口App对于快速验证可以使用现有的蓝牙串口App推荐AppAndroidSerial Bluetooth TerminaliOSLightBlue功能较基础基本功能测试发送1应点亮LED并收到O回应发送0应熄灭LED并收到F回应4.2 自定义App开发Android示例如果你想更进一步可以开发专属控制App。以下是Android Studio中的核心代码片段蓝牙权限配置AndroidManifest.xmluses-permission android:nameandroid.permission.BLUETOOTH/ uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN/ uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/蓝牙连接核心代码// 初始化蓝牙适配器 BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter(); // 搜索并连接HC-06 SetBluetoothDevice pairedDevices bluetoothAdapter.getBondedDevices(); for (BluetoothDevice device : pairedDevices) { if (device.getName().equals(HC-06)) { BluetoothSocket socket device.createRfcommSocketToServiceRecord( UUID.fromString(00001101-0000-1000-8000-00805F9B34FB)); socket.connect(); OutputStream outputStream socket.getOutputStream(); InputStream inputStream socket.getInputStream(); break; } } // 发送控制命令 public void sendCommand(char cmd) { try { outputStream.write(cmd); } catch (IOException e) { e.printStackTrace(); } }简单UI界面activity_main.xmlButton android:idid/btnOn android:text开灯 android:onClickonClickOn/ Button android:idid/btnOff android:text关灯 android:onClickonClickOff/4.3 系统优化与功能扩展基础功能实现后可以考虑以下增强功能状态反馈让STM32定时发送LED当前状态在App中显示真实设备状态而非假设状态多设备控制扩展协议支持控制多个LED示例协议格式LED1:ON\n、LED2:OFF\n安全增强实现简单的握手协议添加命令校验码低功耗优化当长时间不操作时让STM32进入睡眠模式通过蓝牙数据唤醒// 示例带校验的简单协议 void processCommand(uint8_t* cmd) { if(cmd[0] # cmd[3] *) { uint8_t checksum cmd[1] ^ cmd[2]; if(checksum cmd[4]) { // 校验通过执行命令 if(cmd[1] L) { if(cmd[2] 1) GPIO_SetBits(LED_PORT, LED_PIN); else if(cmd[2] 0) GPIO_ResetBits(LED_PORT, LED_PIN); } } } }5. 常见问题排查与调试技巧5.1 硬件连接问题现象可能原因解决方法蓝牙模块不亮电源接反或电压不足检查VCC/GND连接确认5V输出正常蓝牙灯亮但不闪烁模块可能损坏尝试AT指令测试必要时更换模块手机搜不到设备模块处于非可发现模式按住模块上的按键上电进入AT模式重新配置LED不响应接线错误或电阻过大检查PC13连接确认限流电阻为220Ω5.2 通信问题排查无数据接收确认USART2的TX/RX线没有接反检查代码中的波特率设置与HC-06模块一致使用逻辑分析仪或示波器检查USART2引脚是否有信号数据乱码确认双方的数据格式一致8数据位1停止位无校验检查系统时钟配置是否正确特别是使用非标准晶振时间歇性通信中断检查电源稳定性蓝牙模块对电压波动敏感确保地线连接良好避免共地噪声5.3 高级调试技巧利用printf调试// 重定向printf到USART1 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET); return ch; } // 在代码中插入调试信息 printf(系统启动完成当前波特率%d\n, baudrate);状态指示灯使用不同颜色的LED表示不同状态示例蓝色-等待连接绿色-数据通信红色-错误状态协议分析工具使用Wireshark配合蓝牙嗅探器分析通信过程开发简易的上位机软件可视化数据流6. 项目扩展与进阶应用掌握了基础蓝牙控制后可以尝试以下扩展方向物联网云平台集成通过ESP8266将STM32连接到WiFi将蓝牙数据转发到MQTT服务器实现远程网页控制多模块组网使用多个HC-06模块构建简单Mesh网络实现设备间的数据中继传感器数据采集添加温湿度传感器如DHT11通过蓝牙定时上报环境数据手机App实现数据图表展示低功耗优化设计改用STM32L系列低功耗MCU实现BLE蓝牙如HC-08模块通信优化电源管理使用纽扣电池供电// 示例低功耗模式下的蓝牙唤醒 void enterStopMode(void) { // 配置唤醒源为USART2接收中断 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line EXTI_Line3; // PA3对应EXTI3 EXTI_InitStruct.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger EXTI_Trigger_Rising; EXTI_InitStruct.EXTI_LineCmd ENABLE; EXTI_Init(EXTI_InitStruct); // 进入停止模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // 唤醒后需要重新配置系统时钟 SystemInit(); }完成这个项目后你会发现STM32蓝牙应用开发的核心在于理解串口通信原理和掌握基本的外设编程方法。这套技术栈可以轻松迁移到电机控制、智能家居、穿戴设备等各种应用场景中。