USART硬件流控的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

偶然中的一个小项目中需要使用到stm32的硬件流控,但是在实际使用时发现,官方的参考手册关于流控方面说的很简单,看起来也是不明不白地 ,只是知道RTS、CTS两个引脚来控制收发 ,但是具体是怎么实现的?需要我们开发者在软件中需要做什么?网上很多博客资源也都是互相借鉴居多,仅仅讲述了原理,完全没有涉及到代码层面怎么具体使用。所以在完成了流控功能测试后,写下了第一篇博客,也许能给有疑问的同学一些帮助。


一、硬件流控的疑问

在刚开始准备使用流控的时候,有几个问题不清楚:
1. CTS、RTS怎么配置?
2. CTS信号的有效性判断、RTS信号的控制,是不是需要程序内处理?
3. 在查找相关资料的时候,还看到有的同学问,怎么配置接收缓冲器?
下面我们针对这三个问题,一一作出详细解答 ,这三个问题清楚了 ,硬件流控的使用及实现过程,应该也明白了。

二、疑问点的解答

  1. CTS、RTS是片上外设USART的功能引脚,所以配置就和TX、RX引脚差不多。下面以我使用的STM32F0407ZGT6为例说明 ,下面直接上代码,程序使用标准库。
void usart3init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); 	//rx
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);    //tx
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_USART3);    //cts
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_USART3);    //rts
	
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11|GPIO_Pin_13 |GPIO_Pin_14; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
	GPIO_Init(GPIOB,&GPIO_InitStructure); 
	
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	
  	USART_Init(USART3, &USART_InitStructure); 
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  	USART_Cmd(USART3, ENABLE);  

  	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		
	NVIC_Init(&NVIC_InitStructure);	
}
  1. 在解答第二个问题前,我想强调一下,我们使用的叫硬件流控,既然强调了硬件,那就说明在我们配置好流控功能后,并不需要我们在软件层面再做其他处理。CTS信号的检测、RTS信号的控制,都是由USART外设自身硬件来处理的。至于怎么实现的?我们分开说明:
    CTS:
    首先对于发送端来说cts是一个输入信号的引脚,我们在配置的时候是上拉的,这样引脚电平的高低就是由接收端的rts引脚来控制了。当接收端接收到1个字节时(注意是一个字节,不是一帧)会拉高自身rts引脚,等待处理完后再次拉低自身rts引脚。在这期间,接收端的rts引脚为高电平状态时,发送端的cts引脚也是高电平,这种情况下,发送端的DR寄存器的数据是无法发送出去的 ,发送端的SR寄存器的TC是为0的。
    RTS:
    对于接收端来说rts是一个输出信号引脚,当在接收端未接收到任何数据的时候,SR寄存器的RXNE位为0 ,此时rts引脚为低电平,当接收端收到一个字节后,SR寄存器的RXNE位为1 ,这时USART控制器会自动的把rts引脚拉高,这是发送端就不会再发送数据了,等待接收端读取了DR寄存器的数据,SR寄存器的RXNE位会被自动清0 ,此时rts引脚也会被同步拉低。
  2. 说完上面两个问题后,第三个问题应该也很明确了 ,所谓的接收缓冲器就是DR寄存器,也就不用再额外配置什么了。

总结

本人只是在使用过程中,将自己的心得记录下来,可能会有不足或者纰漏之处。各位同学如有在产品中使用,还请自己验证完善。转载请注明出处!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值