【STM32】串口原理

news/2025/2/11 1:30:48/

单片机有自己的RX(接收端),TX(发送端),有的需要再共同接一个底线,为了保证有相同的参考电势,数据如果是高电平的话,发送过去也是高电平

1.轮询方式

在这里插入图片描述
CPU需要时刻注意发送数据寄存器是否为空,如果为空,CPU需要将内存变量数据搬运到发送数据寄存器中,发送数据寄存器的数据会放到发送移位寄存器中去,然后会通过TX发送出去,当发送出去后,发送数据寄存器为空,CPU需要继续搬运。
同理:
在这里插入图片描述
CPU需要一直检测接受数据寄存器中的值是否非空,如果非空,CPU需要将接受数据寄存器中的数据搬运到内存变量中, RX接受到数据后,将数据搬运到接受移位寄存器,然后搬运到接受数据寄存器
相关函数及使用:

 HAL_UART_Transmit(&huart2, (uint8_t*)message,strlen(message), HAL_MAX_DELAY);

在这里插入图片描述

     HAL_UART_Receive(&huart2,(uint8_t*)message,2, HAL_MAX_DELAY);HAL_Delay(1000);HAL_UART_Transmit(&huart2, (uint8_t*)message,2, HAL_MAX_DELAY);

在这里插入图片描述
轮询方式占用cpu资源,并且只能发送定长数据,下面介绍中断方式

2.中断方式

在这里插入图片描述
中断模式下当数据从发送移位寄存器发送出去,会触发发送数据寄存器空中断,此时才需要CPU将数据从内存变量搬运到发送数据寄存器中
同理:
在这里插入图片描述
当收到数据并将数据移动到接受数据寄存器,会触发接受数据寄存器非空中断,此时需要CPU来搬运数据到内存变量中,当数据接受完时,我们调用串口中断函数,对接受的数据进行处理,这样就可以节省CPU资源,CPU就可以做其他的事.

在轮询方式的函数后面加IT,也不需要最后一个参数,最后一个参数代表的意思是假如是接受数据,程序会阻塞等待最后一个参数时间,如果没有接受完,则不再接受,程序向下继续。
使用中断模式的话,当数据接受完的话才会调用回调函数,在回调函数中处理接受的数据
在这里插入图片描述

3.DMA模式

中断模式中其实还是需要CPU来搬运数据的,有没有其他办法呢?
DMA直接内存访问,可以实现寄存器和内存之间搬运数据,不使用CPU来搬运

DMA模式设置
在这里插入图片描述
把之前的函数IT换成DMA即可

4.不定长数据接收

这个用到了串口空闲中断,当RX引脚无后续数据进入时,触发串口空闲中断,调用回调函数来处理数据
回调函数如下:

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

在这里插入图片描述
在这里插入图片描述
但是有一个问题就是使用HAL_UARTEx_ReceiveToIdle_DMA这个函数,DMA传输过半中断也会调用回调函数HAL_UARTEx_RxEventCallback
在这里插入图片描述
就是这个时50字节,当发送单片机字节超过25就会调用回调函数,也就是返回给上位机的只有25个字节
在这里插入图片描述
所以需要关闭DMA的传输过半中断在使用HAL_UARTEx_ReceiveToIdle_DMA的时候

 __HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);//第一个参数时串口二的接收,第二个参数表示DMA的过半中断,关闭

在这里插入图片描述


http://www.ppmy.cn/news/1571018.html

相关文章

deepseek笔记

文章目录 deepseek 手机appdeepseek apideepseek的底层原理?个人感悟 deepseek 字面意思是深度求索,看这个名字就和人工智能有关。 百度了下 公司名称叫做 杭州深度求索人工智能基础技术研究有限公司。 deepseek 手机app 抱着好奇的心理,下载了一个&am…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…

软件工程与土木工程的不同

观看本视频后,你将能够认识到软件工程与土木工程的不同,描述软件工程是如何不断变化的,并阐述项目管理模式为何不太适用于软件开发。一种常见且不利于 DevOps 工作的做法是,把软件工程工作当作土木工程来做。 对于一个土木工程的项…

Lua中文语言编程源码-第十一节,其它小改动汉化过程

__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样? 这里描述自己在使用AI进行数据分析(数据清洗)过程中的几个小故事: 1. 变量名的翻译 有一个项目是某医生自己收集的数据,变量名使用的是中文,分…

初识C语言、C语言的学习方向总述与入门

目录 1. 什么是C语言? 2. 第一个C语言程序 3. 数据类型 4. 变量、常量 4.1 定义变量的方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 5. 字符串转义字符注释 5.1 字符串 5.2 转义字符 6. 注释 7. 选择语句 8. 循环语句 …

【Linux】Socket编程—UDP

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…

tomcat如何配置保存7天滚动日志

在 Tomcat 中,logging.properties 文件是用于配置 Java 日志框架(java.util.logging)的。若要实现 catalina.out 日志保存 7 天,且每天的日志文件名带有时间戳,可以按以下步骤进行配置: 1. 备份原配置 在修…