1. 项目概述STM32串口通信基础实践这个项目实现了一个基础的STM32串口通信功能让STM32单片机通过USART接口持续向上位机(Windows系统)发送Hello Windows!字符串。作为嵌入式开发的入门级实验它涵盖了STM32外设配置、串口通信协议、上位机交互等核心知识点。我选择STM32F103C8T6这款经典的蓝莓派开发板作为硬件平台它不仅价格亲民而且外设丰富特别适合初学者练手。整个项目采用Keil MDK开发环境使用HAL库进行开发大大降低了底层寄存器操作的复杂度。提示对于刚接触STM32的开发者建议从HAL库开始学习它封装了大量底层操作让我们可以更专注于功能实现。2. 硬件准备与环境搭建2.1 所需硬件清单STM32F103C8T6开发板(核心板)USB转TTL模块(推荐CH340G芯片)杜邦线若干电脑(Windows系统)2.2 开发环境配置安装Keil MDK-ARM开发环境安装STM32F1系列芯片支持包安装ST-Link驱动(或其他调试器驱动)准备串口调试助手(推荐使用SSCOM或XCOM)我实测发现CH340G芯片的稳定性比PL2303要好很多特别是在115200波特率下工作时。建议购买时优先选择CH340G方案的USB转TTL模块。3. 工程创建与基础配置3.1 新建Keil工程打开Keil MDK选择Project - New μVision Project选择STM32F103C8T6作为目标器件在Manage Run-Time Environment中勾选HAL库相关组件3.2 时钟树配置在STM32CubeMX中配置时钟树HSE时钟源选择8MHz外部晶振系统时钟设置为72MHzAPB1总线时钟设为36MHzAPB2总线时钟设为72MHz这里要特别注意USART1挂载在APB2总线上其时钟频率直接影响串口波特率的精度。4. USART外设配置详解4.1 串口参数设置通过STM32CubeMX配置USART1模式异步通信(Asynchronous)波特率115200数据位8位停止位1位校验位无硬件流控禁用4.2 GPIO引脚配置USART1默认使用以下引脚TX: PA9(复用推挽输出)RX: PA10(浮空输入)在CubeMX中需要将PA9配置为Alternate Function Push Pull模式PA10配置为Input floating模式。5. 代码实现与功能开发5.1 主程序逻辑int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t msg[] Hello Windows!\r\n; while (1) { HAL_UART_Transmit(huart1, msg, sizeof(msg), HAL_MAX_DELAY); HAL_Delay(500); } }5.2 串口发送函数解析HAL_UART_Transmit函数参数说明huart: USART句柄指针pData: 待发送数据缓冲区指针Size: 发送数据长度Timeout: 超时时间(毫秒)注意在嵌入式系统中换行需要同时发送回车(\r)和换行(\n)这与PC端编程有所不同。6. 调试与问题排查6.1 常见问题及解决方案无法识别串口检查USB转TTL驱动是否安装正确确认TX/RX线是否接反(STM32的TX接模块的RX)检查波特率设置是否一致接收乱码确认双方波特率一致检查时钟配置是否正确尝试降低波特率测试无法下载程序检查BOOT0/BOOT1引脚状态确认调试器连接正常尝试先擦除芯片再下载6.2 逻辑分析仪使用在没有示波器的情况下可以使用Keil的逻辑分析仪功能观察波形在Debug模式下打开Logic Analyzer添加USART1_TX引脚(PA9)设置采样频率为1MHz运行程序观察波形正常波形应该能看到规则的115200波特率的串行数据波形。7. 进阶优化方案7.1 重定向printf通过重写fputc函数可以使用标准库的printf函数输出#include stdio.h int __io_putchar(int ch) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, HAL_MAX_DELAY); return ch; }7.2 中断方式发送改用中断方式可以提高效率HAL_UART_Transmit_IT(huart1, msg, sizeof(msg));需要在CubeMX中使能USART1全局中断并适当处理中断回调函数。8. 项目总结与扩展建议通过这个基础项目我们掌握了STM32串口通信的基本配置和使用方法。在实际开发中还可以考虑以下扩展方向添加接收功能实现双向通信采用DMA方式提高传输效率实现自定义通信协议结合传感器数据做实时传输我在实际测试中发现当连续发送数据时适当加入少量延时(10-50ms)可以提高通信稳定性。另外对于需要长时间运行的系统建议添加看门狗和错误重传机制。