STM32 USART1串口通信实验:HAL库+DMA+中断,115200波特率#/x控制(含理论波特率计算)

发布时间:2026/10/15 4:17:18
STM32 USART1串口通信实验:HAL库+DMA+中断,115200波特率#/x控制(含理论波特率计算)
学院信息科学与工程学院 专业通信工程实验平台STM32F103C8T6 最小系统板板载 CH340 USB 转 TTL PC 串口助手开发环境Keil MDK-ARM 5.43aArm Compiler 6.24 STM32CubeF1HAL 库 CMSIS完成日期2026-10-141. 实验目的理解串口通信协议、RS-232、RS-485 标准及电平区别理解 USB/TTL 转串口模块CH340工作原理。使用 HAL 库配置 USART1115200-8-N-1实现 STM32 与 PC 串口助手双向通信。掌握串口查询方式、中断方式、DMA 方式三种发送/接收编程模型。用 Keil 软件仿真逻辑分析仪观察 TX 引脚波形分析实际波特率。2. 实验器材序号器材型号/规格数量1STM32 最小系统核心板STM32F103C8T6Cortex-M372MHz64KB Flash12PC 计算机Windows 10/1113USB 数据线Mini-USB / Type-C板载 CH34014串口助手软件SSCOM / XCOM / 友善串口调试助手13. 实验原理3.1 串口协议UART/USARTUART通用异步收发器采用异步串行通信帧格式1 位起始位低电平 5~8 位数据位LSB 先传 可选校验位 1~2 位停止位高电平双方事先约定相同的波特率bps每位时间宽度 1/波特率没有时钟线靠双方时钟采样对齐本实验配置115200 bps8 数据位无校验1 停止位简称 115200-8-N-1。3.2 RS-232 / RS-485 / TTL 电平区别标准电平范围逻辑1逻辑0传输距离通信方式TTLCMOS/MCU0 ~ 3.3V2.4V ~ 3.3V0 ~ 0.4V 0.5 m单端点对点RS-232±12VMAX232 转换-3V ~ -15V3V ~ 15V~15 m单端点对点RS-485±2V ~ ±6V差分 A/BABAB~1200 m差分多点总线关键区别TTL是 MCU 引脚电平不能直接连电脑电脑没有 RS-232 口了且电平不兼容RS-232用负逻辑、±12V 电平需要 MAX232 芯片做 TTL↔RS232 转换RS-485用差分信号抗干扰强支持多节点工业现场常用3.3 CH340 USB 转 TTL 模块原理CH340 是沁恒WCH公司生产的 USB 总线转换芯片功能USB 侧模拟一个 USB 串口设备COM 口PC 装驱动后识别为USB-SERIAL CH340 (COMx)TTL 侧提供 TXD / RXD 两根 3.3V TTL 引脚直接连 MCU 的 USART RX/TX板载 CH340 的 STM32 最小系统板插 USB 线后CH340 的 TXD 接 STM32 的 PA10(RX)CH340 的 RXD 接 STM32 的 PA9(TX)交叉连接PC 串口助手发的数据 → CH340 → STM32 PA10STM32 PA9 发的数据 → CH340 → PC 串口助手3.4 STM32F103 USART1 资源USART1 挂在APB2总线上最高 72MHzTX PA9RX PA10默认复用功能支持发送/接收、中断、DMAUSART1_TX DMA1 Channel4USART1_RX DMA1 Channel5波特率发生器BRR fPCLK2 / (16 × 波特率)4. 任务一USART1 基本收发 上位机控制4.1 硬件连接STM32F103C8T6 最小系统板板载 CH340直接用 USB 线连 PC 即可无需外部杜邦线PC (USB) ──USB线── CH340 (板载) ──TTL交叉── STM32 USART1 PA9 (TX) ── CH340 RXD PA10(RX) ── CH340 TXD设备管理器中识别为USB-SERIAL CH340 (COMx)。4.2 CubeMX / HAL 配置要点配置项值USART1 ModeAsynchronous异步Baud Rate115200Word Length8 BitsParityNoneStop Bits1Data DirectionTX/RXPA9AF Push Pull复用推挽PA10Input Floating浮空输入USART1 InterruptEnabled接收中断DMA1 Channel4USART1_TX内存→外设字节Normal4.3 程序功能STM32 上电后通过 USART1 每秒发送一次字符串hello windows!\r\n使用 DMA 方式发送上位机串口助手发送字符#→ STM32 暂停发送上位机发送字符x→ STM32 恢复发送其他字符原样回显4.4 核心代码main.c 关键片段/* USART1 初始化115200-8-N-1 */huart1.InstanceUSART1;huart1.Init.BaudRate115200;huart1.Init.WordLengthUART_WORDLENGTH_8B;huart1.Init.StopBitsUART_STOPBITS_1;huart1.Init.ParityUART_PARITY_NONE;huart1.Init.ModeUART_MODE_TX_RX;/* DMA1 Channel4 USART1_TX */hdma_usart1_tx.InstanceDMA1_Channel4;hdma_usart1_tx.Init.DirectionDMA_MEMORY_TO_PERIPH;hdma_usart1_tx.Init.MemIncDMA_MINC_ENABLE;hdma_usart1_tx.Init.PeriphDataAlignmentDMA_PDATAALIGN_BYTE;hdma_usart1_tx.Init.MemDataAlignmentDMA_MDATAALIGN_BYTE;hdma_usart1_tx.Init.ModeDMA_NORMAL;__HAL_LINKDMA(huart1,hdmatx,hdma_usart1_tx);/* 主循环DMA 发送 1秒延时 */while(1){if(tx_paused0){HAL_UART_Transmit_DMA(huart1,(uint8_t*)hello_msg,sizeof(hello_msg)-1);HAL_Delay(1000);}}/* 接收中断回调处理 # / x 控制 */voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(rx_byte#)tx_paused1;/* 暂停 */if(rx_bytex)tx_paused0;/* 恢复 */HAL_UART_Receive_IT(huart1,(uint8_t*)rx_byte,1);/* 重新挂起 */}4.5 编译结果Program Size: Code16148 RO-data972 RW-data28 ZI-data496 .\Objects\uart_test.axf - 0 Error(s), 0 Warning(s).5. 任务二中断方式 DMA 方式5.1 中断方式接收在HAL_UART_MspInit()中使能USART1_IRQn设置优先级实现USART1_IRQHandler()→ 调用HAL_UART_IRQHandler(huart1)调用HAL_UART_Receive_IT(huart1, rx_byte, 1)启动逐字节接收中断每收到 1 字节触发HAL_UART_RxCpltCallback()在回调里处理#/x并重新挂起下一次接收优点CPU 不用轮询收到数据才进中断效率高。5.2 DMA 方式发送配置 DMA1_Channel4USART1_TX方向内存→外设调用HAL_UART_Transmit_DMA(huart1, buf, len)DMA 自动把 buf 的 len 个字节搬到 USART_DR 寄存器DMA 发送期间 CPU 可以做别的事发完进中断通知 CPU本实验主循环每秒发一次用 DMA 发送时 CPU 在HAL_Delay(1000)里等不影响对比方式CPU 占用适用场景查询HAL_UART_Transmit高一直等简单发送中断HAL_UART_Transmit_IT中字节中断中等长度数据DMAHAL_UART_Transmit_DMA极低硬件自动搬大批量、高波特率连续发送6. 任务三Keil 仿真逻辑分析仪测波特率6.1 仿真配置Debug 选项选Use SimulatorSARMCM3初始化文件加载sim_init.iniMAP 0x40000000, 0x400FFFFF READ WRITE开放外设寄存器区读写权限否则报 access violationLogic Analyzer 添加观测信号PA9 GPIOA-IDR 0x2006.2 波特率理论计算由 USART BRR 寄存器推导本实验时钟配置为HSI 8MHzUSART1 挂 APB2fPCLK2 8 MHz。USART 波特率公式BRR fPCLK2 / (16 × 波特率)代入 fPCLK2 8 MHz目标波特率 115200BRR 8000000 / (16 × 115200) 4.34028BRR 寄存器是 12 位整数 4 位小数整数部分 4小数部分 0.34028 × 16 5.44 → 四舍五入 5即 5/16 0.3125实际写入 BRR 的值 4 5/16 4.3125反推实际波特率实际波特率 8000000 / (16 × 4.3125) 8000000 / 69 ≈ 115942 bps6.3 实测结果项目理论值实际值误差波特率115200 bps115942 bps0.64%1 位时间宽度8.681 µs8.625 µs-0.64%一帧10 位时间86.81 µs86.25 µs-0.64%误差 0.64% 在串口通信允许范围±2%内上位机可以正常接收。6.4 波形分析在 Logic Analyzer 中观察 PA9USART1_TX空闲时 PA9 为高电平逻辑 1每发一个字节出现一个起始位低电平 8 个数据位 1 个停止位高电平每位宽度约8.625 µs对应 115942 bps两帧之间间隔 1 秒HAL_Delay(1000)时序状态正确起始位为低、停止位为高、LSB 先传7. 思考题7.1 只接 TX-RX、RX-TX不接 GND 能传文件吗不能正常工作。原因UART 是单端信号TX 输出的高低电平是相对**GND0V**而言的双方 GND 不共地时TX 的 3.3V 相对于 RX 的 GND 可能变成不定电压两边地电位不同有地环流/电位差即使偶尔能识别也会因为共模电压超标导致数据乱码或完全不通必须共地双方 GND 连在一起才有共同的 0V 参考电平7.2 两台笔记本通过 USB/TTL 转 RS232 模块传大文件文件大小 S 字节每字节传 10 位1 起始 8 数据 1 停止理论传输时间 S × 10 / 波特率秒例1 MB 文件115200 bps时间 1048576 × 10 / 115200 ≈ 91 秒实际还要加协议帧头、校验、应答间隔时间更长提高波特率如 921600可缩短到约 11 秒但受线缆质量和 CH340 驱动限制8. 实验结果项目结果STM32 上电发送 “hello windows!”✅ 串口助手每秒收到一次不加重连续发送是否丢包✅ 不丢DMA中断方式稳定上位机发#✅ STM32 暂停发送上位机发x✅ STM32 恢复发送DMA 发送✅ CPU 占用极低实际波特率✅ 115942 bps误差 0.64%时序波形✅ 起始位低、停止位高、LSB 先传9. 工程文件清单stm32f103_uart_hal/ ├── User/ │ ├── main.c # 主程序 │ └── stm32f1xx_hal_conf.h # HAL 配置启用 UART 模块 ├── HAL_Driver/ # STM32F1xx HAL 源码 ├── Drivers/ # CMSIS 设备头 ├── CMSIS/ # 启动文件 startup_stm32f103_md_ac6.s ├── Objects/ │ └── uart_test.hex # 烧录文件 ├── sim_init.ini # 仿真初始化MAP 外设区 ├── stm32f103_uart_hal.uvprojx # Keil 工程 └── docs/ # 实验报告