STM32上的USART2_CTS和USART2_RTS是啥,怎么用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32上的USART2_CTS和USART2_RTS是啥,怎么用?相关的知识,希望对你有一定的参考价值。

参考技术A

了解一下九针接口的引脚定义就知道了RTS“Request To Send”是请求发送,CTS“Clear To Send”是允许发送。

知识延展:

STM32代表ARM Cortex-M内核的32位微控制器,具有高性能,实时性强,低功耗,便于低电压操作等优点,同时还易于开发。

按内核架构分,有STM32F103“增强型”系、STM32F101“基本型”系列、STM32F105、STM32F107“互联型”系列。其中增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品,基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。

两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合,时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。

STM32:通过 USART 接收数据

【中文标题】STM32:通过 USART 接收数据【英文标题】:STM32: Receiving data via USART 【发布时间】:2014-08-14 22:44:44 【问题描述】:

我正在研究 STM32 Discovery(F10x 系列),我正在尝试通过 USART1 发送和接收数据。

int uart_putc(int c, USART_TypeDef* USARTx)

    assert_param(IS_USART_123_PERIPH(USARTx));

    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
    USARTx->DR =  (c & 0xff);
    return 0;


int uart_getc (USART_TypeDef* USARTx)

    assert_param(IS_USART_123_PERIPH(USARTx));

    while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
    return  USARTx->DR & 0xff;

uart_putc 工作正常,但 uart_getc 卡在 while 循环中,似乎 while 条件永远不会为真。 有人知道这段代码有什么问题吗?

【问题讨论】:

为什么不直接使用STM32标准外设库? 【参考方案1】:

USART_FLAG_RXNE 标志代表 RX 缓冲区非空。如果 RX 缓冲区中有数据,则标志为 SET 而不是 RESET。

这就是你的代码卡在 while 循环中的原因。

【讨论】:

感谢您的回答, while(a==FALSE) 的唯一原因是无限循环……因为 a=FALSE。你说的不就是这些吗?【参考方案2】:

我认为您的 while 循环没有问题。 顺便说一句,你写了while,它会一直执行到RXNE标志变为SET,对吧?这 (RXNE == 1) 意味着,你的 RX 缓冲区中有东西。因此,当这种情况发生时,while 循环将不再执行。

在我的想法中,问题可能是溢出错误标志,我的意思是当您不读取 RX 缓冲区并擦除 RXNE 标志直到要接收新数据时,然后设置溢出错误标志而不是 RXNE 标志。在这种情况下,您需要清除 ORE 标志才能恢复正常接收模式,如果您使用的是 HAL 库,您可以通过 LL_USART_ClearFlag_ORE(USARTx) 执行此操作。 但要确保这是无限循环的原因,您可以将此条件添加到 while :LL_USART_IsActiveFlag_ORE(USARTx),它会是这样的:

while (!LL_USART_IsActiveFlag_RXNE(USART1) && !LL_USART_IsActiveFlag_ORE(USART1))

注意这个while和

while (LL_USART_IsActiveFlag_RXNE(USART1) == 0 && LL_USART_IsActiveFlag_ORE(USART1) == 0)

你已经在使用了。

如果这是您的问题,那么有一些方法可以改进您接收数据的算法: 第一个是使用中断来接收数据。 第二个是通过在函数中的参数和变量之前使用 volatile 关键字来强制编译器将变量保存在寄存器中以便更快地执行。 最后,我认为通过将您的核心时钟频率设置得足够快,以使您的 UART 工作频率和波特率可以帮助您减少覆盖错误。

【讨论】:

请使用代码标签和正确的拼写来格式化您的答案。现在很难读 我最近编辑了我的帖子,我认为我已经提出了一些基于我的经验来找出问题的方法,我认为它们是正确的,如果有人反对这个帖子,认为这是错误的,请在此处分享,因为在不说明原因的情况下投票可能会误导寻找问题解决方案和正确答案的人。

以上是关于STM32上的USART2_CTS和USART2_RTS是啥,怎么用?的主要内容,如果未能解决你的问题,请参考以下文章

STM32串口通讯程序

stm32 串口 中断的问题

stm32串口只能接首字母(一个),接不到其它们程序?怎么解决

STM32串口中断卡死主循环问题分析

STM32串口通信配置(USART1+USART2+USART3+UART4)

STM32 一直进入串口接收中断