在GD32F103开发板中,若未通过 usart_interrupt_enable() 使能USART错误中断(如 USART_INT_ERR),但实际发生硬件错误时,会出现以下现象及处理方法:
一、未使能错误中断时的行为
-
错误标志位静默置位
硬件仍会检测并置位错误标志位(如帧错误USART_FLAG_FE、噪声错误USART_FLAG_NE、过载错误USART_FLAG_ORE),但不会触发中断,需通过轮询usart_flag_get()手动检测14。 -
ORE过载错误阻塞接收
若接收缓冲区溢出(ORE),且未及时读取数据寄存器释放缓冲,后续数据将丢失,导致通信中断14。 -
DMA传输异常
在DMA模式下,未处理的错误标志可能导致DMA通道自动关闭,需重新初始化外设48。
二、使能错误中断与清除方法
1. 初始化时显式使能错误中断
usart_interrupt_enable(USART0, USART_INT_ERR); // 使能所有错误中断
usart_interrupt_enable(USART0, USART_INT_RBNE); // 通常需同时使能接收中断
2. 中断服务函数中处理错误标志
void USART0_IRQHandler(void) {
// 检查并清除帧错误
if (usart_flag_get(USART0, USART_FLAG_FE) != RESET) {
usart_data_receive(USART0); // 读取数据寄存器以清除标志
usart_flag_clear(USART0, USART_FLAG_FE);
}
// 检查并清除噪声错误
if (usart_flag_get(USART0, USART_FLAG_NE) != RESET) {
usart_flag_clear(USART0, USART_FLAG_NE);
}
// 检查并清除过载错误(需先读取DR)
if (usart_flag_get(USART0, USART_FLAG_ORE) != RESET) {
usart_data_receive(USART0); // 关键:读取DR释放缓冲
usart_flag_clear(USART0, USART_FLAG_ORE);
}
// 其他中断处理(如接收中断)
if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
uint8_t data = usart_data_receive(USART0);
// 处理接收数据
}
}
3. DMA模式下的错误恢复
若使用DMA,需在错误回调中重置DMA通道48:
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART0) {
HAL_UART_DMAStop(huart);
HAL_UART_Receive_DMA(huart, rx_buffer, BUFFER_SIZE);
}
}
三、关键注意事项
-
ORE错误优先级
过载错误必须优先处理,否则后续数据无法接收14。 -
标志清除顺序
清除错误标志前需先读取数据寄存器(usart_data_receive()),否则可能无法生效410。 -
波特率匹配
高波特率时需检查时钟配置,避免因累计误差引发帧错误7。
672

被折叠的 条评论
为什么被折叠?



