下面通过485半双工的通信过程,记录USART串口的几个使能位、标志位。
说明:USART_IT_TC 和 USART_IT_RXNE是一个常量,并不代表(TC、RXNE)这两位。
一、以发送多个字符为例:
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.
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/12557.html