【发布时间】: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寄存器
【问题讨论】: