news 2026/10/2 17:08:08

STM32 UART串口笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 UART串口笔记

串口(UART)一帧 = 1 个字节,硬件物理层面:起始位 + 8 位数据位 + 校验位(可选)+ 停止位,这完整一套叫 1 帧,传输 1 字节(0~255)。

TTL 串口:TX、RX、GND 三条线实现设备间通讯。

补充:TTL 电平一般 3.3V/5V;RS232 是正负差分电平,二者不能直连。

阻塞式串口通讯(串口轮询)

UART 配置:System Core 里的 SYS 选择 Serial Wire(SWD,仅调试下载,和 UART 功能本身无关);Connectivity 里打开 UART1/UART2,模式选 Asynchronous(异步)。

调用函数:

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  • 第 1 个参数:串口句柄指针,例&huart1/&huart2

  • 第 2 个参数:数据缓冲区指针,数组可以直接写数组名,因为也是地址,可以用(uint8_t *)强制转换消除一下警告

  • 第 3 个参数:已知的收发数据(数组/字符串)长度,可以写已知的固定长度,也可以用strlen和sizeof直接读data,在本文设置为2

  • 第 4 个参数:超时时间,单位 ms,输入HAL_MAX_DELAY为无限等待时间。

注意事项

  1. |是按位或,不是逻辑或;if 判断条件里逻辑或必须用||;同理区分&按位与 和&&逻辑与。
  2. 数组名是地址常量,不可直接赋值。对数组赋值只能逐个元素赋值或者使用内存拷贝函数。
  3. 发送字符串时可以使用 strlen 获取有效字符长度;接收字符串时硬件收到\0,所以收到的不是 C 字符串,禁止直接使用 strlen。

串口中断(_IT,发送/接收寄存器非空中断)

UART 配置:System Core 里的 SYS 选择 Serial Wire(SWD,仅调试下载,和 UART 功能本身无关);Connectivity 里打开 UART1/UART2,模式选 Asynchronous(异步)

调用函数:函数中断版函数后缀为_IT,没有超时参数

HAL_UART_Receive_IT(&huart2, receivedata, 2); HAL_UART_Transmit_IT(&huart2, receivedata, 2);
  • 注意,该串口中断属于非阻塞函数,调用函数只是启动一次收发,函数立刻返回,不会等待收发完成,因此不要像之前一样在 while 循环里调用HAL_UART_Receive_IT,否则旧接收任务还没完成就被新任务打断。
  • 我们要在stm32f1xx_it.c找到USART2_IRQHandler(void);ctrl加左键点击进入HAL_UART_IRQHandler(&huart2),找到弱定义回调:void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)。
  • 然后在 main.c 或者其他 C 文件中重写这个回调函数,回调内部处理收到的数据,并且再次调用HAL_UART_Receive_IT开启下一轮接收。
  • 存储接收数据的数组记得挪到main.c文件开头改为全局变量,因为要在callback函数中调用

DMA 串口传输

DMA 通道自动搬运串口数据,传输完成后触发中断通知 CPU,大幅减少 CPU 占用。

配置:在前面串口中断配置的基础上,在Connectivity-UART2-DMA Settings,添加 TX、RX 的 DMA 通道;内存开启地址自增,UART 外设寄存器地址固定,外设地址自增关闭。

DMA 函数后缀为 DMA,也是非阻塞,也要使用callback函数:

HAL_UART_Receive_DMA(&huart2, receivedata, 2); HAL_UART_Transmit_DMA(&huart2, receivedata, 2);

串口接收不定长数据(空闲中断 IDLE)

原理:UART 总线在收到数据后,一段时间没有新字节,触发 IDLE 空闲中断,配合 DMA 实现不定长接收。

不定长数据收发支持阻塞、普通中断、DMA 三种模式,不同的模式使用前面讲的三种模式的配置,只需要把代码前缀改为HAL_UARTEx_ReceiveToIdle就好了,后缀还是和之前三种模式一样,但是中断和DMA所需的回调函数不是之前那个,在之前同样的位置搜索void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size),替换我们之前的回调函数就好了。

DMA 空闲不定长接收代码(这里第三个参数要用回调函数的Size入参,是本次收到的字节数):

HAL_UARTEx_ReceiveToIdle_DMA(&huart2, receivedata, Size);

DMA 默认开启半传输 HT 中断,收到一半缓冲区数据就会进入回调,容易误处理,空闲中断场景建议添加以下代码关闭半传输中断:

__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 17:07:36

MySQL 基础篇(三):一文掌握 MySQL 常见数据类型

目录 本文内容概要 一、常见数据类型分类 二、数值类型 2.1 BIT 类型 2.2 整数类型 ---- TINYINT 类型 2.3 小数类型 2.3.1 浮点数 ---- FLOAT 类型 2.3.2 定点数 ---- DECIMAL 类型 2.4 文本/二进制类型 2.4.1 CHAR 类型 2.4.2 VARCHAR 类型 2.4.3 CHAR 和 VARCHA…

作者头像 李华
网站建设 2026/10/2 17:07:05

AI换装视频怎么做?原理、工具选型与一致性修复全流程

这几天朋友圈、短视频首页,全是同一种类型的视频:一个人站在原地,衣服唰一下就换成了另一套,动作、表情、光线甚至背景都没动过,只有服装变了。评论区清一色在问怎么做的,有人说是特效剪辑,有人…

作者头像 李华
网站建设 2026/10/2 17:05:48

AI学习作战地图:2026大模型时代工具、框架与实战路线

1. 这不是一张“好看但没用”的知识图谱,而是一张能直接铺在桌面上干活的AI学习作战地图你点开过多少份“AI学习路线图”?PDF文件下载下来,前三页是宏大的时代背景、技术演进时间轴、几个大厂Logo拼贴,翻到中间突然出现“掌握PyTo…

作者头像 李华
网站建设 2026/10/2 17:05:47

Hindsight开源工具:掘Chromium浏览器历史取证全指南

“Hindsight”这名字起得很有意思。在心理学里,它指“事后聪明”——事情发生后觉得自己早就知道结果的那种错觉。放在数字取证领域,这名字就变得非常贴切了:我们没法穿越回过去,但通过分析设备里遗留的痕迹,确实能在某…

作者头像 李华
网站建设 2026/10/2 17:05:46

AI-Native SDLC实战:用Claude Code与CLAUDE.md编排智能体开发流程

1. 从"人写代码"到"人管智能体":AI-Native SDLC到底改了什么这两年"AI-Native"这个词被喊得很响,但真正落到软件开发生命周期(SDLC)里,大多数团队其实还停留在"给编辑器装个补全插…

作者头像 李华