资讯动态

STM32CubeMX + Keil 5 配置JDY-31蓝牙串口通信的完整流程(从新建工程到手机控制舵机)

发布时间:2026/9/1 20:15:20 来源:尧图企业网站定制
STM32CubeMX Keil 5 配置JDY-31蓝牙串口通信的完整流程从新建工程到手机控制舵机在物联网和智能硬件开发中蓝牙通信因其低功耗、低成本的特点成为短距离无线控制的首选方案。本文将手把手带你完成STM32F103单片机通过JDY-31蓝牙模块与手机APP通信实现远程控制SG90舵机的完整开发流程。无论你是刚接触STM32的初学者还是对CubeMX配置感到困惑的开发者这篇教程都将为你提供清晰的步骤和深入的原理解析。1. 开发环境准备与硬件连接1.1 所需硬件清单在开始之前请确保你已准备好以下硬件设备STM32F103C8T6开发板蓝色药丸板JDY-31蓝牙模块注意选择3.3V电平版本SG90舵机工作电压4.8-6VUSB转TTL模块用于蓝牙模块初始配置杜邦线若干建议使用不同颜色区分功能提示购买JDY-31时务必向卖家索取完整的技术手册不同批次的模块可能在AT指令集上存在细微差异。1.2 硬件连接示意图正确的硬件连接是项目成功的第一步。以下是各模块间的接线方式设备引脚STM32引脚备注JDY-31 TXPA3 (USART2_RX)蓝牙发送接单片机接收JDY-31 RXPA2 (USART2_TX)蓝牙接收接单片机发送JDY-31 VCC3.3V注意电压匹配JDY-31 GNDGND共地至关重要SG90信号线PA6 (TIM3_CH1)PWM信号输出引脚注意舵机供电需单独使用5V电源避免从开发板直接取电导致电流不足。2. STM32CubeMX工程配置2.1 新建工程与时钟树配置打开STM32CubeMX选择New Project在芯片选择器中输入STM32F103C8选择对应型号在Pinout Configuration界面进行以下关键配置系统核心→ SYS → Debug: Serial Wire时钟配置→ RCC → HSE: Crystal/Ceramic Resonator时钟树配置步骤// 目标时钟配置 HCLK 72 MHz PCLK1 36 MHz (APB1总线) PCLK2 72 MHz (APB2总线)通过调节PLL倍频系数最终实现系统时钟72MHz的稳定运行。2.2 USART2串口配置蓝牙通信的核心是串口配置需特别注意以下参数在Connectivity选项卡中选择USART2配置参数如下Mode: AsynchronousBaud Rate: 115200 (必须与蓝牙模块保持一致)Word Length: 8 bitsParity: NoneStop Bits: 1Over Sampling: 16 samples启用串口中断NVIC Settings → USART2 global interrupt → Enabled优先级保持默认即可2.3 PWM输出配置舵机控制SG90舵机采用50Hz的PWM信号控制对应周期为20ms定时器TIM3配置Clock Source: Internal ClockChannel1: PWM Generation CH1Prescaler: 71 (72MHz/(711) 1MHz)Counter Period: 19999 (1MHz/20000 50Hz)Pulse: 初始值1500 (1.5ms中位)引脚分配TIM3_CH1 → PA62.4 生成工程代码完成所有配置后点击Project Manager选项卡设置Toolchain/IDE为MDK-ARM V5勾选Generate peripheral initialization as a pair of .c/.h files最后点击GENERATE CODE生成Keil工程3. Keil 5代码开发3.1 串口接收中断实现在生成的工程中我们需要完善串口中断回调函数/* 在main.c的USER CODE BEGIN PV部分添加 */ uint8_t rx_data 0; // 接收缓冲区 /* 在main()函数的初始化后添加 */ HAL_UART_Receive_IT(huart2, rx_data, 1); // 启动串口接收中断 /* 在USER CODE BEGIN 4部分添加回调函数 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART2) { switch(rx_data) { case o: // 开门指令 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, 500); // 0度 HAL_UART_Transmit(huart2, Door opened\r\n, 13, 100); break; case c: // 关门指令 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, 2500); // 180度 HAL_UART_Transmit(huart2, Door closed\r\n, 13, 100); break; default: HAL_UART_Transmit(huart2, Invalid command\r\n, 17, 100); } HAL_UART_Receive_IT(huart2, rx_data, 1); // 重新启用中断接收 } }3.2 PWM信号生成原理SG90舵机的控制信号解析PWM脉宽(ms)舵机角度对应寄存器值(72MHz)0.50°5001.590°15002.5180°2500计算公式实际脉宽 (CCR 1) / (TIM_CLK / (PSC 1))3.3 调试技巧与常见问题开发过程中可能会遇到以下问题及解决方案蓝牙模块无法连接检查VCC电压是否为3.3V确认TX/RX交叉连接使用AT指令检查模块波特率舵机抖动或不响应确保供电充足建议单独5V 2A电源检查PWM信号频率是否为50Hz接地线要短而粗串口数据乱码确认双方波特率一致检查时钟配置是否正确尝试降低波特率测试4. 手机APP配置与联合调试4.1 蓝牙调试APP选择推荐使用以下APP进行测试AndroidSerial Bluetooth TerminaliOSLightBlue通用型BLE调试助手这些APP都支持自定义按钮发送字符指令界面友好且稳定。4.2 指令集设计规范为扩展性考虑建议采用结构化指令协议格式[前缀][指令][参数][校验] 示例 #O! // 开门 #C! // 关门 #S90 // 转到90度位置在单片机端可升级解析逻辑if(rx_data[0] #) { switch(rx_data[1]) { case O: executeOpen(); break; case C: executeClose(); break; case S: setAngle(atoi(rx_data[2])); break; } }4.3 进阶功能扩展基于现有框架可轻松扩展更多功能多设备控制添加继电器控制灯光集成温湿度传感器反馈状态反馈void sendStatus() { char buf[32]; sprintf(buf, Current angle: %d\r\n, current_angle); HAL_UART_Transmit(huart2, (uint8_t*)buf, strlen(buf), 100); }安全机制添加配对密码验证实现指令CRC校验设置操作超时保护在实际项目中我发现模块化编程能大幅提高代码可维护性。将蓝牙处理、舵机控制和状态反馈分别封装成独立.c/.h文件通过清晰定义的接口交互这样当需要添加新功能时只需在相应模块中扩展不会影响整体架构稳定性。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价