弄清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模块可以被使用。

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

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

     

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

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

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

 

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

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

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

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

 

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

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

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

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

 

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

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

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

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

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

 

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

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

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

对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步。

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