代码之家  ›  专栏  ›  技术社区  ›  morcillo

STM32 UART错误不清除标志

  •  0
  • morcillo  · 技术社区  · 7 年前

    我正在编程一个STM32F446微控制器,我正在与一个ESP8266通信(startbyte-command-size-dataarray-crc1-crc2)。然而,我有一个问题,每当ESP8266复位时,它会发出一个串行调试(不能关闭)@74880波特(也不能改变这个),这会在STM32微控制器中引起一个错误,因为它应该是因为我将它们编程为9600通信。

    问题是,只要STM32微控制器出现错误,错误就不会停止,因为它无法清除错误标志。为了清除错误标志,您只需要读取状态寄存器(hal_art_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(禁用UART),但仍然存在同样的问题, 它只在我暂停调试时清除标志 .

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

    编辑: 找到了一个让它工作的方法。当我暂停调试时,它起作用了,因为正如答案中所述,调试程序正在读取dr寄存器,因此将其清除;当我读取sr寄存器时,它实际上将其清除(因为还有一些东西需要读取,所以没有清除)。

    解决方案:读取dr寄存器,然后读取sr寄存器

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bence Kaulics    7 年前

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

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

    我的建议-仔细阅读RM。

    推荐文章