我正在从事STM32发现(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;
}有人知道这段代码出了什么问题吗?
发布于 2014-06-24 23:44:02
USART_FLAG_RXNE标志代表RX buffer Not Empty。如果RX缓冲区中有数据,则设置该标志,而不重置。
这就是为什么您的代码被塞在while循环中的原因。
发布于 2019-11-28 04:47:47
我认为您的while循环没有问题。顺便说一句,在设置RXNE标志之前,它将一直执行,对吧?这(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工作频率和波特率可以帮助你减少覆盖错误。
https://stackoverflow.com/questions/24390564
复制相似问题