- 对串口初始化,开启中断
rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB rcu_periph_clock_enable( RCU_USART0);//使能串口0 rcu_periph_clock_enable( RCU_AF);//使能备用时钟 gpio_pin_remap_config( GPIO_USART0_REMAP,ENABLE); //引脚重映射 /* connect port to USARTx_Tx */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);//配置PB6 复用推挽输出 TX /* connect port to USARTx_Rx */ gpio_init(GPIOB, GPIO_MODE_IN_FLOATING , GPIO_OSPEED_50MHZ, GPIO_PIN_7);//配置PB7 模拟输入 RX gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);//配置PB5 推挽输出 485使能端口 //gpio_bit_set(GPIOB, GPIO_PIN_5); //PB5置1 485发送使能 gpio_bit_reset(GPIOB, GPIO_PIN_5); //PB5置0 485接收使能 /* USART configure */ //usart_deinit(USART0);//????? usart_baudrate_set(USART0, 115200U);//波特率 usart_parity_config(USART0, USART_PM_NONE);//无奇偶检验 usart_word_length_set(USART0, USART_WL_8BIT);//8位数据 usart_stop_bit_set(USART0, USART_STB_1BIT);//一个停止位 usart_hardware_flow_rts_config(USART0,USART_RTS_DISABLE);//无硬件数据流 usart_receive_config(USART0, USART_RECEIVE_ENABLE);//串口接收 usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//串口发送 usart_enable(USART0);//使能串口0 usart_flag_clear(USART0, USART_FLAG_TC); usart_interrupt_enable(USART0, USART_INT_RBNE);//串口0中断使能 nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//优先级分组 // nvic_irq_enable(USART0_IRQn,3,2);//IRQ通道使能 3位用于抢占优先级 2位用于子优先级 nvic_irq_enable(USART0_IRQn,2,2); - 初始化代码没有问题,出现疑问的地方在串口中断函数里。具体体现在:我通过串口助手向GD32串口0写入一位数据,在中断函数里收到兵返回相同的数值,理论上应该是在串口助手中收到同样的数值,且只收到一次。但是我的串口助手接收窗口在不停的接收该数据,看了一晚上未找到原因。补充:该程序单侧测试没有问题,收发数据正常,今天将该程序移植到一个部分未开源的程序中,便出现这个问题。附上调试时串口中断的程序,测试时接收一位数据,返回相同的一位数据,注意屏蔽部分:
if(usart_flag_get(USART0, USART_FLAG_RBNE)!=RESET)//接收到数据 { // res=usart_data_receive(USART0); res=(USART_DATA(USART0)& (uint16_t)0x01FF); //res=USART_DATA(USART0); RS485_buff[RS485_rec_counter] = res; RS485_rec_counter++; // //delay_1ms(1); // gpio_bit_set(GPIOB, GPIO_PIN_5); //PB5置1 485发送使能 // //delay_1ms(5); // USART_DATA(USART0)=(0x12 & (uint16_t)0x01FF); // //delay_1ms(5); // while(RESET == usart_flag_get(USART0, USART_FLAG_TC)) {}; // // //// delay_1ms(5); // gpio_bit_reset(GPIOB, GPIO_PIN_5); //PB5置0 485接收使能 // //delay_1ms(5); } usart_flag_clear(USART0,USART_FLAG_TC); - 最神奇的地方出现了,在长时间调试无果后,在师兄的建议下,将最后的接收定时和校验码等通讯协议规则都加入进去一起调试,竟然可以正常通讯了,我吐了,目前猜测程序其他部分时序影响了串口中断,也可能与优先级有关,等有时间再找出具体原因。
4.20 神奇的串口中断
最新推荐文章于 2026-05-20 11:03:27 发布
本文详细记录了一次在GD32微控制器上遇到的串口通讯异常现象,探讨了串口初始化设置、中断处理及与其他程序模块交互时的问题定位与解决过程。在特定条件下,串口接收数据重复显示,通过完善通讯协议和调整优先级最终解决了问题。

3402

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



