我正在编程STM32F446微控制器,并与ESP8266通信(startByte-command-size-dataArray-crc1-crc2)。但是我有一个问题,每当ESP8266重置时,它都会进行串行调试(无法将其关闭)@ 74880波特(也无法更改它),这会导致STM32微控制器出错,因为应该这样做,因为我将它们编程为在9600。
问题在于,只要在STM32微控制器中发生该错误,该错误就不会停止,因为它无法清除错误标志。为了清除错误标志,您只需要读取状态寄存器(HAL_UART_GetError函数),但是我的代码在运行时无法执行此操作,这意味着无论读取了多少寄存器,它都不会改变,< strong>除非,我暂停调试,然后继续
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 :(得分:2)
首先,您的代码是一团糟。它甚至不会编译,并且大多数都没有太大意义。您无法通过将0写入SR寄存器来清除错误标志。您必须先读取SR,然后再读取数据寄存器。
调试器可能会读取DR寄存器,这就是为什么在中断程序执行时会清除标志的原因。
我的建议-仔细阅读RM。