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

下面通过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.

 

 

  • 15
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值