弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)

本文详细解析了485半双工通信过程中,USART串口的使能位与标志位操作。从初始化串口、使能发送接收中断到数据发送接收流程,介绍了关键寄存器的设置与状态标志位的处理,适用于理解和实现基于USART的串口通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面通过485半双工的通信过程,记录USART串口的几个使能位、标志位。

 

说明:USART_IT_TC 和 USART_IT_RXNE是一个常量,并不代表(TC、RXNE)这两位。

   #define USART_IT_TC                          ((uint16_t)0x0626)
   #define USART_IT_RXNE                        ((uint16_t)0x0525)

 

一、以发送多个字符为例:

       1. 初始化串口(UE使能位)

由于这个程序非常通用,也比较长。 

注意的一点,初始化中,对UE进行使能; 即USART模块可以被使用。

 

     

 2. 使能(USART)的发送或接收中断位(TCIE、RXNEIE)

通过对485的使能脚的高、低电平的控制,达到串口分别收、发的控制。

 

以上,1-2步,主要是对USART的控制寄存器(CR)的3个使能位进行设置。

 

3. 将需要发送的数据放到USART->DR中,触发中断

当需要发送一组字符时,首先将第一个字符放到USART->DR中,然后开启发送使能中断。

USART就会将该字符发送出去。

 

  4. 发送完1个字节之后,进行入中断服务, 进入中断服务函数USARTx_IRQHandler(TC、RXNE)

当第一个字符被发送完之后,DR(数据寄存器)为空,此时,TC被硬件置位,产生中断。

在中断函数里面,再次调用字符(字节)发送函数,并且清除TC标志位。

不停地触发发送中断,直到所有字符被发送完。    

 

以上3-4步,涉及对状态寄存器(USART_SR)的标志位的操作。

对SR操作的函数: 

        1. USART_ClearITPendingBit(USART2, USART_IT_TC)  //清除待处理的发送完成中断标志位

         2. USART_ClearFlag(USART3,USART_FLAG_TC);      //清除发送完成标志位

          

         3. USART_ClearITPendingBit(USART2, USART_IT_RXNE) //清除待处理的接收完成中断标志位

         4. USART_ClearFlag(USART3,USART_FLAG_ RXNE);    //清除接收完成标志位

注意:1和2 , 3和4的作用完全一样;只是名称不同,在不同场合中应用更加明确。

 

 

二、接收数据的过程,是一样的。只是不需要第3步。

(初始化---使能接收----接收到数据,触发中断---中断服务程序)

 

三、补充一点

有时候,我们会遇到下面的代码:(这个代码和上面的代码不在一个工程里面)

上述代码是通过串口1,发送一串字符,例如: char *s = "hello."

一定要注意: 这里并不需要配置: 

这时因为,上述的发送函数,使用的while(),读取的是 USART->SR中的TC位。

这个TC位,是由硬件置位的。每次发送完1个字符后,硬件自动置位为1.

 

 

### 正确清除STM32 USART中断标志位的方法 对于USART中断标志位的管理,在发送数据的过程中非常重要的一环就是确保能够正确地清除这些标志位,以防止误触发或其他异常情况的发生。在串口初始化之后以及每次完成一次完整的数据帧发送后,应当及时清除发送完成(TC)标志位[^2]。 ```c // 清除发送完成标志位 void clear_USART_TC_flag(void){ USART_ClearFlag(USART1, USART_FLAG_TC); } ``` 除了TC标志之外,还有其他几种常用的USART状态标志也需要关注: - **接收数据寄存器非空 (RXNE)**:表示接收到新字符并已存储于接收缓冲区中; - **过载错误 (ORE)**:表明发生了溢出错误; - **噪声检测错误 (NF)**:指示存在噪声错误; - **帧错误 (FE)**:意味着出现了帧格式错误; 针对上述提到的不同类型的标志位,可以采用相应的API函数来进行清理工作。例如,要清除此类特定的状态标志,则可利用`USART_ClearITPendingBit()` 函数指定具体的待清除项。 ```c // 清理指定的USART中断请求挂起 void clear_USART_specific_IT_pending_bit(uint32_t IT_Pending_Bit){ USART_ClearITPendingBit(USART1, IT_Pending_Bit); } // 示例:清除接收数据寄存器非空中断请求挂起 clear_USART_specific_IT_pending_bit(USART_IT_RXNE); // 或者直接使用宏定义的方式 #define CLEAR_USART_RXNE() do { \ USART_ClearITPendingBit(USART1, USART_IT_RXNE);\ } while(0) CLEAR_USART_RXNE(); ``` 为了更高效地处理多个可能发生的事件,建议开发者们根据实际应用场景编写专门的服务程序来统一管理响应各种不同的中断源,并合理安排优先级顺序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值