本帖最后由 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); //总线空闲中断
}
|