STM32串口错误不清除标志

STM32 UART error does not clear flag

我正在对 STM32F446 微控制器进行编程,并且正在与 ESP8266 (startByte-command-size-dataArray-crc1-crc2) 进行通信。但是我有一个问题,每当 ESP8266 重置时,它都会提供串行调试(无法关闭它)@74880 波特(也无法更改此),这会导致 STM32 微控制器出错,因为我将它们编程为在9600.

问题是每当 STM32 微控制器发生错误时,错误就不会停止,因为它无法清除错误标志。为了清除错误标志,你只需要读取状态寄存器(HAL_UART_GetError函数),但我的代码在运行时无法做到这一点,我的意思是无论我有多少读取它永远不会改变的寄存器,UNLESS 我暂停调试然后恢复

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 (__HAL_UART_DISABLE),但仍然是同样的问题,它只会在我暂停调试时清除标志

我到处搜索,找不到任何方法来完成这项工作。我什至禁用了优化,但同样的事情不断发生。

编辑: 找到了让它发挥作用的方法。当我暂停调试时它起作用了,因为正如答案中已经说明的那样,调试器正在读取 DR 寄存器,从而清除它,而当我读取 SR 寄存器时它实际上清除了它(它没有清除因为还有一些东西仍然存在需要阅读)。

解决方法:先读DR寄存器再读SR寄存器

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

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

我的建议 - 仔细阅读 RM。