探索TXE、TC、RXNE标志位在串口通信中的轮询与中断应用

浅谈一下STM32串口中断之TXE,TC,RXNE标志位

之前做一个项目,用到了串口中断,但是对TXE、TC和RXNE标志位的作用和使用方法不是很清楚,导致在调试过程中遇到了一些问题。通过查阅相关资料和实际操作,我对这三个标志位有了更深入的了解,因此决定写这篇博客,分享我的经验和心得。如果对您有所帮助,点点关注,不迷路哦

墨小羽ovo个人主页

前言

在STM32中,串口通信是一种常用的通信方式,而串口中断是一种高效的通信方式,它可以在数据发送或接收时自动触发中断,从而实现数据的实时处理。在串口中断中,TXE、TC和RXNE是三个非常重要的标志位,它们分别表示发送数据寄存器为空、发送完成和接收数据寄存器非空。本文将简要介绍这三个标志位的作用和使用方法。

写这篇博客的原因

1.串口发送数据的时候出现丢包,调试代码调试不出来
2.我区分不出来串口中断,发送一串字符串时候,是不是每次都触发中断,还是只触发一次中断,是发送完第一个字符就触发串口发送中断,还是发送完所有字符才触发中断。

1. 串口通信代码编写流程

在STM32中,串口通信的代码编写流程如下:1. 配置串口引脚和时钟。2. 配置串口参数,如波特率、数据位、停止位等。3. 配置串口中断,如发送中断、接收中断等。初始化NVIC4. 启动串口。5. 在中断服务程序中处理数据发送和接收。

在这里插入图片描述

1.1 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) 和void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)

1.第一个函数用于获取串口标志位的状态,第二个函数 用于清除标志位
2.这两个函数是轮询的方式,即不断检查标志位的状态,直到标志位为1或者超时。这种方式虽然简单,但是效率较低,因此在实际应用中,通常会使用中断的方式来处理数据发送和接收。

1.2 USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)和void USART_ITClearPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)

1.函数用于使能或禁用串口中断,

2.第二个函数是清除中断标志位的

1.3 USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

函数用于向串口发送数据,其中USARTx表示串口类型,Data表示要发送的数据。函数返回值为void类型,没有返回值。

1.4 USART_ReceiveData(USART_TypeDef* USARTx)

函数用于从串口接收数据,其中USARTx表示串口类型。函数返回值为uint16_t类型,表示接收到的数据。

2.发送接收示意图

在这里插入图片描述

2.1 发送示意图

在这里插入图片描述

个人理解:
1.当要发送一个字符时,数据A放入TDR后,发送到移位寄存器后,触发TXE标志位,然后发送完成,触发TC标志位。

2. TXE标志位

TXE标志位表示发送数据寄存器为空,即可以发送数据。当发送数据寄存器为空时,TXE标志位会被置1,此时可以发送数据。在发送数据时,需要先判断TXE标志位是否为1,如果为1,则可以将数据写入发送数据寄存器,否则需要等待TXE标志位为1。

2.1 轮询方式发送-TXE标志位的使用

在发送数据时,需要先判断TXE标志位是否为1,如果为1,则可以将数据写入发送数据寄存器,否则需要等待TXE标志位为1。例如,以下代码演示了如何使用TXE标志位发送数据:
(1)发送一个字符

USART_SendData(USART1, 'A');

(2)发送两个字符(错误示范)

USART_SendData(USART1, 'A');USART_SendData(USART1, 'B');
原因:1.USART_SendData()函数只是将数据放在TDR寄存器中,
2.还没来得及发送到移位寄存器,就又往TDR寄存器中放数据,导致数据丢失

(3)发送多个字符(正确示范)

USART_SendData (USART1,"H');
while (USART_GetFlagstatus(USART1,USART_FLAG_TXE) == RESET);USART_SendData (USART1,'K');
while (USART_GetFlagStatus ( USART1,USART_FLAG_TXE) == RESET);USART_SendData (USART1,”G');
while (USART_GetFlagstatus( USART1,USART_FLAG_TXE) == RESET);

输出运行结果:
HKG
(4)发送字符串
在这里插入图片描述

1.发送字符串时,最后加一个TC标志位的判断

2.不然,当发送最后一个字符时候,TXE标志位变为1,而此时最后一个字符只是发送到了移位寄存器,还没来得及
发送出去,所以需要等待TC标志位为1,才能关闭串口发送
,不然会导致数据丢失

2.2 中断方式发送-TXE标志位的使用

补充:1.TXE:发送寄存器空中断,使能TXE后
,当TDR发送数据寄存器为空时,会触发中断,在中断服务程序中发送数据。
2.TXE在复位后,默认为1,即默认开启发送中断。所以如果没有真正发送数据,TXE中断都会
触发,影响程序运行,所以初始化时候需要关闭TXE中断。
3. 使用TXE中断,发送字符,都是在中断服务程序中发送的。
示例程序:
void USART_SendByte(USART_TypeDef* USARTx, uint8_t *Data)
{
pDataByte = Data;
USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); //使能发送中断
}
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_SendData(USART1, *pDataByte);
pDataByte++;
if (*pDataByte == ‘\0’)
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //发送完毕,关闭发送中断
}
}
}

3. TC标志位

TC标志位表示发送完成,即数据已经发送完毕。当数据发送完毕时,TC标志位会被置1,此时可以关闭串口发送中断,或者进行其他操作。在发送数据时,需要先判断TC标志位是否为1,如果为1,则可以关闭串口发送中断,否则需要等待TC标志位为1。
在这里插入图片描述

理解:
1.使用TC标志位,需要先读SR寄存器,再写入DR寄存器,或者是通过写入’0’来清除。

3.1 轮询方式发送-TC标志位的使用

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData (USART1,"H');
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData (USART1,"k');
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData (USART1,"G');
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

运行结果:
HKG

3.2 中断方式发送-TC标志位的使用

1. 使用TC标志位,是发送一个字节后进入中断的,后续的发送都是在中断服务函数中进行的。

2.可以在初始化时候,USART_ITConfig(USART1, USART_IT_TC, ENABLE);使能TC中断

  USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节USART_Cmd(USART1, ENABLE); //使能USART1

示例程序:
1.使用TC标志位,需要先读SR寄存器,再写入DR寄存器,或者是通过写入’0’来清除。

void USART_SendByte(USART_TypeDef* USARTx, uint8_t *Data)
{pDataByte = Data;USART_ClearFlag(USARTX,USART_FLAG_TC); //清除TC标志位USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次}void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_TC) != RESET){USART_SendData(USART1, *pDataByte++);if (*pDataByte == '\0'){USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断.}}
}

4. RXNE标志位

在这里插入图片描述

理解:
1.当接收到一个字符时,数据A放入RDR寄存器,然后触发RXNE标志位,然后读取RDR寄存器中的数据,最后清除RXNE标志位。
补充: 当接收移位寄存器从RX引脚接收到
一个字节的数据后,数据会自动存入RDR寄存器,并触发RXNE标志位。这时候RXNE等于1,说明数据可以读出来。
2.当接收缓冲区为空时,RXNE标志位为0,此时可以等待接收数据。

3.当接收缓冲区非空时,RXNE标志位为1,此时可以读取接收缓冲区中的数据。

4.1 轮询方式接收-RXNE标志位的使用

  1. 有了TXE的经验
    2.不断轮询获取
    RXNE标志位,当RXNE为1时,读取RDR寄存器中的数据,然后清除RXNE标志位。

示例程序:

uint8_t USART ReceiveByte(USART_TypeDef USARTx)
{
while(USART_GetF1agStatus(USARTx,USART_FLAG_RXNE)==RESET);
return (uint8_tfUSART_ReceiveData(USART1) ; 
)

4.2 中断方式接收-

RXNE标志位的使用

注意:

1.初始化完串口接收中断的代码后,当接收数据时候,硬件会自动将数据放入RDR寄存器中,然后触发RXNE标志位

2. 硬件会检测到接收数据,自动跳转到中断处理函数

接收1个字节触发一次接收中断

3.RXNE(Receive Data register not empty interrupt)- 每接受到一个字节产生中断,接受寄存器不为空时,产生中断 —读寄存器DR清零,也可软件手动清零

使用方法:

1. 开启中断,初始化NVIC

NVIC结构体

NVIC_InitTypeDef NVIC_InitStructure;
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

2. 在中断服务函数中,读取RDR寄存器中的数据,然后清除RXNE标志位。

3. 在中断处理函数中,读取RXNE标志位,当RXNE==1时,说明接收到数据,可以读出数据了

void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{uint16_t Data = USART_ReceiveData(USART1);// 处理接收到的数据USART_ClearITPendingBit(USART1, USART_IT_RXNE);//可以把接收的数据再打印出来USART_SendData(USART1, Data);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
}

参考资料

海创电子-STM32F103入门篇,阶段-阶段二

STM32串口通信
keysking串口原理与中断模式收发

总结

TXE、TC和RXNE等标志位在串口通信中扮演着至关重要的角色,它们的状态直接决定了数据的发送和接收过程。通过深入了解轮询和中断两种模式的工作原理和应用场景,我们可以更加灵活地选择适合自己项目的通信方式,从而实现更高效、更可靠的串口通信。希望本教程能够对大家在物联网开发过程中有所帮助。最后呢,在编写博客的过程中,我尽量保持内容的准确性和完整性,但也难免会有疏漏或错误之处。欢迎各位读者指出其中的问题,帮助我不断进步。谢谢大家的阅读,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】——决策树模型

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

材料科学SCI期刊,IF=6+,2个月录用,审稿速度非常快

一、期刊名称 Journal of Materials Research and Technology 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:6.2 中科院分区:2区 三、期刊简介 《材料研究与技术杂志》为发表与材料加工、性能和性能相关的理论…

el-tree 获取当前勾选节点的选中状态以及选中值对象 触发check-change多次事件问题原因

1.需求 现在需要一个树状结构的资产树 但是现在需求是 获取当前选中的值的状态是选中还是取消选中 然后再用当前选中 or 取消选中的值 进行 选中 or 取消选中的操作 一开始使用的是 check-change 方法 接收参数如图 但是我勾选父节点 或者 子节点后 他会打印一堆数据 是因…

园区智慧能源可视化:智能监控与优化能源管理

通过图扑可视化技术,搭建智慧光伏园区,实时监控园区光伏系统的运行状态,分析数据并优化能源管理,提高发电效率和维护效率,助力园区实现绿色可持续发展。

Java-01-源码篇-04集合-04-Properties

目录 一,简介 二,源码讲解 2.1 Properties 继承结构 2.2 Properties 属性分析 2.3 Properties 构造器 2.4 Properties 加载配置资源文件 2.4.1 load(inputStream) 2.4.2 load(Reader) 2.4.3 load0(LineReader lr) 2.4.4 load测试 2.5 Properti…

电子产品分销商 DigiKey 在新视频系列中探索智能城市中的AI

电子产品分销商DigiKey推出了一系列新视频,深入探讨了AI在智能城市中的集成应用。这个名为“智能世界中的AI”的系列是其“城市数字”视频系列的第四季,它审视了城市环境中从基础设施到公共服务的多种AI硬件和软件的部署情况。 该系列由电子制造商莫仕&…

VMware取消中文支持,替换vSAN解决方案提上日程!

What is vSAN ? 是一款软件定义的企业存储解决方案,支持超融合基础架构系统。vSAN与VMware vSphere 完全集成在一起,作为ESXi Hypervisor内的分布式软件层,通过整合、池化ESXi各个主机上的存储资源,为vSphere虚拟化平…

Python静态类型检查工具库之mypy使用详解

概要 在 Python 开发中,类型错误是常见的问题,尤其在大型项目中,类型错误可能导致代码难以调试和维护。为了提高代码的可靠性和可维护性,静态类型检查工具如 mypy 应运而生。mypy 是一个静态类型检查工具,它通过在 Python 代码中添加类型注释,实现编译时的类型检查,帮助…

【数据库】MySQL基本操作语句

目录 一、SQL语句 1.1 SQL分类 1.2 SQL语言规范 1.3 数据库对象与命名 1.3.1 数据库的组件(对象): 1.3.2 命名规则: 1.4 SQL语句分类 二、基本命令 2.1 查看帮助信息 2.2 查看支持的字符集 2.3 查看默认使用的字符集 2.4 修改默认字符集 2.5…

【Python画图-seaborn驯化】一文学会seaborn画因子变量图catplot函数使用技巧

【Python画图-seaborn驯化】一文学会seaborn画因子变量图catplot函数使用技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内…

人工智能项目论文复现

文章目录 (一)技术学习任务Ⅰ、机器学习之聚类1、基本介绍概念2、聚类分析基本介绍3、K均值聚类4、K近邻分类模型(KNN)5、均值漂移聚类6、代码实现7、上述三种算法总结 Ⅱ、机器学习其他常用技术1、决策树基本知识2、异常检测概念3、主成分分析4、决策树…

JVM:介绍

文章目录 一、什么是JVM二、JVM的功能1、解释和运行2、内存管理3、即时编译 三、常见的JVM四、Java虚拟机规范五、HotSpot发展历程 一、什么是JVM JVM的全称为Java Virtual Machine,Java虚拟机。本质上是一个运行在计算机上的程序,职责是运行Java字节码…

python办公自动化之分析日志文件

实现效果:根据关键字xx搜索关键字在日志的占比 前提:把日志保存到txt文件里 代码: # 读取准备好的日志文件log_file log_filelog_file.txt with open(log_file,r) as logfile:textlogfile.readlines() # 设置搜索的关键字&#xf…

相机,手机,行车记录仪及监控视频修复软件: Stellar Repair for Video

天津鸿萌科贸发展有限公司是 Stellar 系列数据恢复软件的授权代理商。 Stellar Repair for Video 是一款强大的工具,用于修复从主流相机品牌(如佳能、尼康、索尼)、行车记录仪、监控录像机、手机和其他视频设备拍摄的无法访问和损坏的视频。…

下载linux的吐槽

本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…

面向过程编程详解

目录 前言1. 面向过程编程的定义2. 面向过程编程的特点2.1 过程和函数2.2 顺序执行2.3 全局变量2.4 控制结构 3. 面向过程编程的应用场景3.1 系统级编程3.2 科学计算3.3 小型项目 4. 面向过程编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 C语言5.2 Pascal5.3 Fortran …

PMP 认证权威吗?对项目…业生涯的发展有帮助?

PMP认证到底权威吗? 首先在我看来,PMP认证是否权威要从各个角度进行综合考虑。入行这么多年个人也有不少的体会,那么我们就从多个角度进行分析一下,PMP认证的权威性与促进方面。 在深入探讨这个话题前,我分享一下近期…

DDR3 (四)

1 DDR3 8倍预取 DDR3相比DDR2外部IO时钟又提高了一倍,因此DDR3外部IO时钟是内核时钟的4倍,再加上双沿采样,因此DDR3可以实现8倍预取 2 DDR3 芯片位宽 DDR3使用8倍预取技术,指的是芯片位宽(DQ数据线位宽&#xff09…

智慧产业应用实训实践基地-信息类专业实践实验室-嵌入式、物联网、移动互联网、云计算、大数据、人工智能、区块链实训室

智慧产业实践基地面向信息类专业群,以智慧灯杆、智慧交通、智慧设施在智慧产业中的实际实践为项目原型,软硬件开源、开放,海量的技术资料和实训课程。整个系统运用了嵌入式、物联网、移动互联网、云计算、大数据、人工智能、区块链等综合交叉…

收藏!2024年程序员的实用神器_new relic idea

前言 Chat GPT的升级节奏让人们越来越惊讶的同时,也让大家感觉到了压力,在如此快节奏的互联网世界中,开发人员需要不断学习与更新知识,保持领先地位并高效地交付高质量软件。 无论是集成开发环境 (IDE)、版本控制系统、测试工具…