GD32F350奇怪的uart溢出中断

本来只是设置了RBNE和IDLE中断来接收数据的,奇怪的是接到数据后不停进入中断处理程序,但每次又不是RBNE和IDLE中断,陷入无穷劫,整个工程不能好好走了。。。发个狠,看看到底是谁中断了,于是在中断处理中加了n个

          if( RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_XXX)){}

分支一个个来,终于发现是 USART_INT_FLAG_RBNE_ORERR这个玩意起来了。一看,是溢出中断,可是有两个奇怪的地方:(1)USART_INT_FLAG_ERR_ORERR: overrun error interrupt flag  也是溢出中断,两个说明似乎没啥区别,为啥是RB_ORERR? (2)我没有使能这个中断啊,它咋就自己起来了?也许我少见多怪,只是这十几年来,却对这个现象没印象。

        很是讨厌gd的例程了,越来越对付,翻了好几个demo suite,竟然没一个uart用idle中断的例程。。。不过既然出现了,懒得深究,直接在中断处理中加一个分支好了,读其状态,然后clear,搞定:

    else if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE_ORERR)!=RESET)
    {         
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE_ORERR);
    }

        然后,工程正常跑起来了。

### GD32F350 UART 使用 DMA 传输时的空闲线中断解决方案 对于GD32F350芯片,在使用UART接口通过DMA方式进行数据传输的过程中,如果遇到空闲线(IDLE)中断问题,可以采取特定的方法来确保数据能够被正确接收并处理。 #### 配置IDLE中断 为了使能IDLE中断功能,需设置相应的寄存器位。具体来说,应该开启UART的状态寄存器中的IDLE检测,并允许其触发中断请求。这可以通过调用库函数`usart_interrupt_enable()`实现[^4]: ```c // 启用UART IDLE中断 usart_interrupt_enable(UARTx, USART_INT_IDLE); ``` 这里`UARTx`代表具体的串口号,比如USART1等。 #### 设置DMA模式 当配置好IDLE中断后,还需要调整DMA控制器的工作参数以适应这种工作模式下的需求。通常情况下会设定成循环模式(circular mode),这样可以在每次接收到新数据包时不间断地继续存储到缓冲区中直到再次发生IDLE事件为止。同样利用标准外设库API来进行操作: ```c dma_circulation_mode_enable(DMAy_Channelz); // 开启DMA通道循环模式 ``` 其中`DMAy_Channelz`表示用于UART通信的那个DMA通道实例对象名称。 #### 处理IDLE中断服务例程 编写专门针对IDLE状态变化而响应的服务子程序(ISR), 当检测到线路处于闲置状况(idle line condition detected)即意味着上一次完整的消息已经结束,则停止当前正在进行的数据搬运动作,并读取已保存下来的信息长度以便后续解析处理。下面给出一段简化版的例子说明如何捕捉该类异常情况的发生以及相应措施: ```c void USARTx_IRQHandler(void){ /* 如果确实发生了IDLE中断 */ if (RESET != usart_interrupt_flag_get(USARTx, USART_INT_FLAG_IDLE)){ /* 清除IDLE标志位*/ usart_data_receive_by_idle_line(USARTx); /* 获取实际接收到的有效字节数量 */ uint16_t received_length = dma_channel_transfer_number_get(DMAy_Channelz); /* 关闭DMA传输 */ usart_dma_receive_disable(USARTx); /* 用户自定义逻辑:例如将接收到的数据复制出来做进一步分析 */ /* 准备下一轮监听前重置DMA指针位置 */ dma_memory_address_set(DMAy_Channelz, buffer_starting_point); /* 重新启动DMA准备接受下一个可能到来的消息体 */ usart_dma_receive_enable(USARTx); } } ``` 上述代码片段展示了怎样在一个典型的ISR内部识别IDLE条件的到来,并执行必要的清理和初始化步骤为下次接收做好充分准备。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值