【问题标题】:STM32 UART error does not clear flagSTM32 UART错误未清除标志
【发布时间】:2018-07-18 13:11:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: error-handling stm32f4


    【解决方案1】:

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

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

    我的建议 - 仔细阅读 RM。

    【讨论】:

    • 我知道这是一团糟,它确实可以编译。那时我只是在尝试任何事情,但正如您可能想象的那样,SR = 0 完全没有做任何事情。午饭前的一段时间,我注意到你说的……我只需要清除 DR 寄存器,之后一切都开始工作,所以我开始着手进行更好的错误处理。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2018-10-07
    • 2022-12-15
    • 2019-09-24
    • 2020-07-03
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多