GD32F103开发板中错误处理

在GD32F103开发板中,若未通过 usart_interrupt_enable() 使能USART错误中断(如 USART_INT_ERR),但实际发生硬件错误时,会出现以下现象及处理方法:


一、未使能错误中断时的行为

  1. 错误标志位静默置位
    硬件仍会检测并置位错误标志位(如帧错误 USART_FLAG_FE、噪声错误 USART_FLAG_NE、过载错误 USART_FLAG_ORE),但‌不会触发中断‌,需通过轮询 usart_flag_get() 手动检测14。

  2. ORE过载错误阻塞接收
    若接收缓冲区溢出(ORE),且未及时读取数据寄存器释放缓冲,后续数据将丢失,导致通信中断14。

  3. 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);
    }
}

三、关键注意事项

  1. ORE错误优先级
    过载错误必须优先处理,否则后续数据无法接收14。

  2. 标志清除顺序
    清除错误标志前需先读取数据寄存器(usart_data_receive()),否则可能无法生效410。

  3. 波特率匹配
    高波特率时需检查时钟配置,避免因累计误差引发帧错误7。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值