本帖最后由 lulipro 于 2021-9-30 20:23 编辑
单片机:GD32F130C8T6
串口:USART0
BUG现象:经过测试发现,初始化串口阶段,使能串口(UEN=1)后的一段时间里,IDLEF和RTF会突变为1,注意并不是UEN=1后就立马突变为1了,而是经过一段时间后才变为1,所以建议在初始化阶段,使能串口后,延时5ms左右再清除IDLEF和RTF标志,然后再打开他们对应的中断,避免上电就触发IDLEF和RTF中断。
最近一个项目在使用GD32F130C8T6,用USART0的DMA方式接收串口数据,为了实现DMA接收不定长数据,于是打算使用空闲检测中断或者接收超时检测中断去做,但是发现初始化USART0后,在还没有进行串口数据传输活动的情况下,空闲检测标志IDLEF和接收超时标志RTF会突变为1,觉得非常不合理,手册上也没有提及这个问题,个人认为这是一个BUG。
另外一个网友也提及过这个问题:https://bbs.21ic.com/icview-3071032-1-1.html?_dsign=13d824d5
下面是验证代码:如果注释掉软件延时代码,则LED不会量,如果开启软件延时代码,则LED点亮
- void USART0_config(void)
- {
- uint32_t i,j;
- usart_deinit(USART0);
- usart_baudrate_set(USART0,19200);
- usart_parity_config(USART0,USART_PM_NONE);
- usart_word_length_set(USART0,USART_WL_8BIT);
- usart_stop_bit_set(USART0,USART_STB_1BIT);
- usart_oversample_config(USART0,USART_OVSMOD_16);
- usart_sample_bit_config(USART0,USART_OSB_3BIT);
- usart_overrun_disable(USART0);
- usart_receiver_timeout_enable(USART0); //使能接收超时检测,只有USART0支持接收超时检测,USART1不支持
- usart_receiver_timeout_threshold_config(USART0,25); //设置超时阈值
- usart_transmit_config(USART0,USART_TRANSMIT_ENABLE); //使能发送器(TEN)
- usart_receive_config(USART0,USART_RECEIVE_ENABLE); //使能接收器(REN)
- usart_enable(USART0); //使能usart(UEN=1)
- //==============处理RTF和IDLEF标志的BUG===============
- //延时5ms
- i=5;
- while(i--){
- j = 9200;
- while(j--);
- }
- if(usart_flag_get(USART0,USART_FLAG_RT) && usart_flag_get(USART0,USART_FLAG_IDLE))
- led_on();
- usart_flag_clear(USART0,USART_FLAG_RT); //清除RT标志
- usart_flag_clear(USART0,USART_FLAG_IDLE); //清除IDLE标志
- usart_interrupt_enable(USART0,USART_INT_RT); //使能接收超时中断
- usart_interrupt_enable(USART0,USART_INT_IDLE); //总线空闲中断
- }
|