如何使用STM32 USART进行串口通信
·
STM32 USART串口通信实验完整步骤指南
实验概述
实验目标
- 掌握STM32CubeMX配置USART串口通信
- 实现STM32与PC的串口数据收发
- 学习中断和DMA通信原理
- 完成三个递进式实验任务
实验设备
- STM32F103C8T6开发板
- USB转TTL串口模块
- Windows 11 PC
- XCOM V2.8串口助手
第一部分:开发环境搭建
1.2 硬件连接
STM32F103C8T6 <-> USB转TTL模块
PA9 (TX) -> RXD
PA10 (RX) -> TXD
3.3V -> 3.3V
GND -> GND
BOOT0 -> GND(正常启动模式)
第二部分:STM32CubeMX配置
2.1 创建新工程
步骤1:选择芯片
1. 启动STM32CubeMX
2. 点击"Start New Project"
3. 选择"MCU Selector"
4. 输入"STM32F103C8"并选择STM32F103C8Tx
步骤2:系统配置
RCC配置:
- High Speed Clock (HSE): Crystal/Ceramic Resonator
SYS配置:
- Debug: Serial Wire

2.2 时钟配置

时钟树设置
1. 点击"Clock Configuration"标签页
2. 按以下参数配置:
- HSE: 8MHz
- PLL Source Mux: HSE
- PLLMUL: x9
- System Clock: 72MHz
- APB1 Prescaler: /2 → 36MHz
- APB2 Prescaler: /1 → 72MHz
3. 确认所有时钟显示为绿色
2.3 USART1配置

引脚配置
1. 左侧"Connectivity" → "USART1"
2. Mode: Asynchronous
3. 自动分配引脚:PA9(TX), PA10(RX)
参数配置
Parameter Settings:
- Baud Rate: 115200
- Word Length: 8 Bits
- Parity: None
- Stop Bits: 1
- Data Direction: Receive and Transmit
中断配置
NVIC Settings:
- √ USART1 global interrupt
- Preemption Priority: 0
2.4 DMA配置(任务3需要)
DMA通道配置
1. "Connectivity" → "USART1" → "DMA Settings"
2. 点击"Add"
3. 配置参数:
- DMA Request: USART1_TX
- Direction: Memory To Peripheral
- Priority: High
- Mode: Normal
DMA中断配置
1. "System Core" → "DMA"
2. 找到"DMA1 Channel4" (USART1_TX)
3. √ DMA1 channel4 global interrupt
2.5 GPIO配置(可选)
LED配置
1. "System Core" → "GPIO"
2. 配置PC13为GPIO_Output
3. 用于程序运行状态指示
2.6 工程生成
工程设置
Project Manager:
- Project Name: USART_Experiment
- Project Location: 选择工程目录
- Toolchain/IDE: MDK-ARM V5
Code Generator:
- √ Generate peripheral initialization as a pair of '.c/.h' files
- √ Set all free pins as analog
生成代码
1. 点击"GENERATE CODE"
2. 等待代码生成完成
3. 点击"Open Project"启动Keil
第三部分:Keil工程配置
3.1 工程设置
目标配置
Project → Options for Target:
- Device: STM32F103C8
- Xtal (MHz): 8.0
- Use MicroLIB: √ (重要!)
输出配置
Output:
- Create HEX File: √
- Debug Information: √
调试配置
Debug:
- Use: ST-Link Debugger
- Settings: 确认SWD连接正常
3.2 编译设置
1. 点击"Rebuild All"编译工程
2. 确认0 Error(s), 0 Warning(s)
3. 连接ST-Link下载器
4. 点击"Download"烧录程序
第四部分:实验代码实现
任务1:无延时连续发送(观察数据丢失)
代码实现
/* USER CODE BEGIN PV */
uint8_t message[] = "hello windows!\r\n";
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
// 任务1:简单初始化
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
// 不加延时的连续发送
HAL_UART_Transmit(&huart1, message, sizeof(message)-1, 1000);
// 注意:这里没有HAL_Delay()
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
实验步骤
1. 编译下载任务1代码
2. 打开XCOM V2.8串口助手
3. 设置:115200波特率,8数据位,1停止位,无校验
4. 打开串口观察接收数据
5. 记录是否出现数据丢失现象

预期现象
- 数据快速连续显示
- 可能出现数据不完整或乱码
- 串口助手可能卡顿或无响应
任务2:中断方式控制发送
代码实现
/* USER CODE BEGIN PV */
uint8_t rx_data;
uint8_t tx_enable = 1;
uint8_t message[] = "hello windows!\r\n";
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
// 启动串口接收中断
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
if(tx_enable)
{
HAL_UART_Transmit(&huart1, message, sizeof(message)-1, 1000);
HAL_Delay(100); // 添加延时避免数据丢失
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
// 串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(rx_data == '#')
{
tx_enable = 0; // 暂停发送
}
else if(rx_data == '*')
{
tx_enable = 1; // 继续发送
}
// 重新启动接收中断
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
}
}
/* USER CODE END 4 */
实验步骤
1. 编译下载任务2代码
2. 打开XCOM V2.8
3. 观察初始数据发送
4. 在发送区输入"#"并发送,观察是否暂停
5. 输入"*"并发送,观察是否继续
6. 测试多次切换
预期现象
- 正常接收"hello windows!"消息
- 发送"#"后停止发送
- 发送"*"后恢复发送
- 控制响应及时准确
mmexport1760864932900
任务3:DMA方式高速发送
代码实现
/* USER CODE BEGIN PV */
uint8_t rx_data;
uint8_t tx_enable = 1;
uint8_t dma_tx_enable = 1;
uint32_t tx_count = 0;
uint8_t dma_tx_buffer[64];
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
// 启动串口接收中断
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
// 初始化DMA发送
sprintf((char*)dma_tx_buffer, "DMA Mode Startup\r\n");
HAL_UART_Transmit_DMA(&huart1, dma_tx_buffer, strlen((char*)dma_tx_buffer));
HAL_Delay(100);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
// DMA发送模式
if(dma_tx_enable && tx_enable)
{
if(huart1.gState == HAL_UART_STATE_READY)
{
tx_count++;
sprintf((char*)dma_tx_buffer, "DMA Count: %lu Hello Windows!\r\n", tx_count);
HAL_UART_Transmit_DMA(&huart1, dma_tx_buffer, strlen((char*)dma_tx_buffer));
}
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
// 串口接收中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(rx_data == '#')
{
tx_enable = 0; // 暂停发送
}
else if(rx_data == '*')
{
tx_enable = 1; // 继续发送
}
else if(rx_data == 'd')
{
dma_tx_enable = 1; // 开启DMA模式
}
else if(rx_data == 'n')
{
dma_tx_enable = 0; // 关闭DMA模式
}
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
}
}
// DMA传输完成回调
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// DMA传输完成处理
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // LED闪烁指示
}
}
/* USER CODE END 4 */
实验步骤
1. 编译下载任务3代码
2. 打开XCOM V2.8
3. 观察DMA高速发送效果
4. 测试控制命令:
- "#":暂停发送
- "*":继续发送
- "d":开启DMA模式
- "n":关闭DMA模式
5. 观察LED闪烁指示DMA传输
预期现象
- DMA模式发送速度明显更快
- CPU占用率低,可同时执行其他任务
- LED随DMA传输完成而闪烁
- 控制命令响应正常
mmexport1760870883883
第五部分:XCOM V2.8使用指南
5.1 基本设置
1. 串口选择:设备管理器中的COM号
2. 波特率:115200
3. 数据位:8
4. 停止位:1
5. 校验位:无
6. 流控制:无
5.2 操作流程
1. 选择正确的COM端口
2. 设置通信参数
3. 点击"打开串口"
4. 在接收区观察数据
5. 在发送区输入控制命令
6. 点击"发送"按钮
5.3 高级功能
- 保存数据:点击"保存显示数据"
- 清除显示:点击"清除显示"
- 自动换行:勾选"自动换行"
- HEX显示:可切换十六进制显示
第六部分:实验结果记录
6.1 任务1结果
| 测试条件 | 现象描述 | 数据丢失情况 |
|---|---|---|
| 无延时连续发送 | 数据快速滚动 | 严重丢失 |
| 115200波特率 | 显示不完整 | 频繁发生 |
| XCOM V2.8接收 | 软件偶尔卡顿 | 缓冲区溢出 |
6.2 任务2结果
| 控制命令 | 预期功能 | 实际效果 | 响应时间 |
|---|---|---|---|
| # | 暂停发送 | ✅ 正常停止 | <100ms |
| * | 继续发送 | ✅ 正常恢复 | <100ms |
| 其他字符 | 无影响 | ✅ 忽略处理 | - |
6.3 任务3结果
| 测试项目 | DMA模式 | 普通模式 | 性能对比 |
|---|---|---|---|
| 发送速度 | 高速 | 中速 | DMA快30% |
| CPU占用 | 低 | 高 | DMA优势明显 |
| 数据完整性 | 良好 | 良好 | 两者相当 |
| 实时性 | 优秀 | 良好 | DMA更稳定 |
第七部分:故障排除
7.1 常见问题及解决
问题1:无数据输出
原因:BOOT0引脚未接地
解决:BOOT0接GND,按复位键
问题2:数据乱码
原因:波特率不匹配
解决:检查时钟配置,确保72MHz系统时钟
问题3:命令无响应
原因:中断未正确配置
解决:检查NVIC设置,确保中断使能
问题4:DMA不工作
原因:DMA通道配置错误
解决:检查DMA方向和优先级设置
7.2 调试技巧
1. 使用LED指示灯辅助调试
2. 添加启动信息确认程序运行
3. 通过printf重定向输出调试信息
4. 使用不同颜色区分不同任务输出
第八部分:实验总结
8.1 技术要点掌握
- ✅ STM32CubeMX配置USART串口
- ✅ HAL库串口通信编程
- ✅ 中断原理及应用
- ✅ DMA通信原理及优势
- ✅ 串口调试工具使用
8.2 实验成果
- 成功完成三个递进式任务
- 掌握了中断和DMA通信技术
- 理解了不同发送方式的性能差异
- 建立了完整的嵌入式开发流程
8.3 扩展应用
本实验技术可应用于:
- 工业控制系统数据采集
- 物联网设备通信
- 嵌入式系统调试接口
- 多设备间数据交换
附录
附录A:完整代码模板
[见前面各任务的代码实现部分]
附录B:STM32引脚定义
USART1:
PA9 - TX (数据发送)
PA10 - RX (数据接收)
LED指示:
PC13 - 板载LED(可选)
启动配置:
BOOT0 - 接地(用户闪存模式)
BOOT1 - 无关(通常接地)
附录C:参考资料
- STM32F103C8T6数据手册
- STM32CubeMX用户手册
- HAL库编程指南
- XCOM V2.8使用说明
更多推荐

所有评论(0)