Error handling STM32 UART错误未清除标志

Error handling STM32 UART错误未清除标志,error-handling,stm32f4,Error Handling,Stm32f4,我正在编程一个STM32F446微控制器,并与一个ESP8266(startByte-command-size-dataArray-crc1-crc2)通信。然而,我有一个问题,每当ESP8266复位时,它会给出一个串行调试(无法关闭)@74880波特(也无法更改此值),这会导致STM32微控制器中出现错误,因为我将它们编程为在9600时通信 问题在于,每当STM32微控制器中出现错误时,错误就不会停止,因为它无法清除错误标志。为了清除错误标志,您只需要读取状态寄存器(HAL_UART_GetE

我正在编程一个STM32F446微控制器,并与一个ESP8266(startByte-command-size-dataArray-crc1-crc2)通信。然而,我有一个问题,每当ESP8266复位时,它会给出一个串行调试(无法关闭)@74880波特(也无法更改此值),这会导致STM32微控制器中出现错误,因为我将它们编程为在9600时通信

问题在于,每当STM32微控制器中出现错误时,错误就不会停止,因为它无法清除错误标志。为了清除错误标志,您只需要读取状态寄存器(HAL_UART_GetError函数),但我的代码在运行时无法执行此操作,我的意思是,无论我读取了多少寄存器,它都不会更改,除非我暂停调试,然后恢复

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    errorCounter++;
    if(HAL_IS_BIT_CLR(huart->Instance->CR1, 1)) {
        SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE | USART_CR1_PEIE);
        SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
        if(HAL_IS_BIT_CLR(huart->Instance->CR3, USART_CR3_DMAR)) {
            SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
        }
    }

    while(huart->Instance->SR != 0x80)  {
        huart->Instance->SR
        HAL_UART_GetError(huart);
        HAL_UART_GetState(huart);
        huart->Instance->SR = 0;

    }
}
while循环之所以存在,是因为我想看看是否可以强制代码一遍又一遍地读取同一寄存器,直到它清除为止,但这并不重要

我还尝试过强制禁用UART(\uuu HAL\u UART\u DISABLE),但仍然存在同样的问题,它只在我暂停调试时清除标志

我到处都找遍了,但我找不到任何方法来完成这项工作。我甚至禁用了优化,但同样的事情一直在发生

编辑: 找到了一个让它工作的方法。当我暂停调试时,它工作了,因为,如回答中所述,调试器正在读取DR寄存器,从而清除了它,而当我读取SR寄存器时,它实际上清除了它(它没有清除,因为还有一些东西需要读取)


解决方案:先读DR寄存器,然后读SR寄存器。首先,你的代码乱七八糟。它甚至不会编译,而且大部分都没有太多意义。无法通过将0写入SR寄存器来清除错误标志。您必须先读取SR,然后再读取数据寄存器

调试器可能读取DR寄存器,这就是中断程序执行时清除标志的原因


我的建议-请仔细阅读RM。

首先,您的代码乱七八糟。它甚至不会编译,而且大部分都没有太多意义。无法通过将0写入SR寄存器来清除错误标志。您必须先读取SR,然后再读取数据寄存器

调试器可能读取DR寄存器,这就是中断程序执行时清除标志的原因


我的建议-请仔细阅读RM。

我知道它很乱,而且确实可以编译。我当时正在尝试任何东西,但正如你可能想象的那样,SR=0完全没有做任何事情。午饭前的一段时间我注意到你说的话。。。我只需要清除DR寄存器,然后一切都开始工作,所以我开始着手改进错误处理。谢谢你的帮助,我知道这是一个混乱,它确实编译。我当时正在尝试任何东西,但正如你可能想象的那样,SR=0完全没有做任何事情。午饭前的一段时间我注意到你说的话。。。我只需要清除DR寄存器,然后一切都开始工作,所以我开始着手改进错误处理。谢谢你的帮助