C语言 STM32:通过USART接收数据



我正在研究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条件永远不会为真。
有人知道这段代码有什么问题吗?

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

我认为你的while循环没有问题。通过您编写while的方式,它将被执行,直到RXNE标志变为SET,对吗?这个(RXNE == 1)意味着,在你的RX缓冲区中有一些东西。因此,当这种情况发生时,while循环将不再执行。

在我的想法问题问题可能是超限错误标志,我的意思是当你不读RX缓冲区和擦除RXNE标志,直到新数据被接收,然后超限错误标志成为设置而不是RXNE标志。在这种情况下,你需要清除ORE标志,以便回到正常的接收模式,如果你使用HAL库,你可以通过LL_USART_ClearFlag_ORE(USARTx)来做到这一点。但是为了确保这是无限while循环的原因,您可以将此条件添加到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工作频率和波特率可能会帮助您减少覆盖错误。

最新更新