提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
偶然中的一个小项目中需要使用到stm32的硬件流控,但是在实际使用时发现,官方的参考手册关于流控方面说的很简单,看起来也是不明不白地 ,只是知道RTS、CTS两个引脚来控制收发 ,但是具体是怎么实现的?需要我们开发者在软件中需要做什么?网上很多博客资源也都是互相借鉴居多,仅仅讲述了原理,完全没有涉及到代码层面怎么具体使用。所以在完成了流控功能测试后,写下了第一篇博客,也许能给有疑问的同学一些帮助。
一、硬件流控的疑问
在刚开始准备使用流控的时候,有几个问题不清楚:
1. CTS、RTS怎么配置?
2. CTS信号的有效性判断、RTS信号的控制,是不是需要程序内处理?
3. 在查找相关资料的时候,还看到有的同学问,怎么配置接收缓冲器?
下面我们针对这三个问题,一一作出详细解答 ,这三个问题清楚了 ,硬件流控的使用及实现过程,应该也明白了。
二、疑问点的解答
- 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);
}
- 在解答第二个问题前,我想强调一下,我们使用的叫硬件流控,既然强调了硬件,那就说明在我们配置好流控功能后,并不需要我们在软件层面再做其他处理。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引脚也会被同步拉低。 - 说完上面两个问题后,第三个问题应该也很明确了 ,所谓的接收缓冲器就是DR寄存器,也就不用再额外配置什么了。
总结
本人只是在使用过程中,将自己的心得记录下来,可能会有不足或者纰漏之处。各位同学如有在产品中使用,还请自己验证完善。转载请注明出处!