STM32 USART串口通信实验完整步骤指南

实验概述

实验目标

  1. 掌握STM32CubeMX配置USART串口通信
  2. 实现STM32与PC的串口数据收发
  3. 学习中断和DMA通信原理
  4. 完成三个递进式实验任务

实验设备

  • 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 实验成果

  1. 成功完成三个递进式任务
  2. 掌握了中断和DMA通信技术
  3. 理解了不同发送方式的性能差异
  4. 建立了完整的嵌入式开发流程

8.3 扩展应用

本实验技术可应用于:

  • 工业控制系统数据采集
  • 物联网设备通信
  • 嵌入式系统调试接口
  • 多设备间数据交换

附录

附录A:完整代码模板

[见前面各任务的代码实现部分]

附录B:STM32引脚定义

USART1:
  PA9  - TX (数据发送)
  PA10 - RX (数据接收)

LED指示:
  PC13 - 板载LED(可选)

启动配置:
  BOOT0 - 接地(用户闪存模式)
  BOOT1 - 无关(通常接地)

附录C:参考资料

  1. STM32F103C8T6数据手册
  2. STM32CubeMX用户手册
  3. HAL库编程指南
  4. XCOM V2.8使用说明
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐