4.20 神奇的串口中断

  1. 对串口初始化,开启中断
      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);
    	

     

  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); 

     

  3. 最神奇的地方出现了,在长时间调试无果后,在师兄的建议下,将最后的接收定时和校验码等通讯协议规则都加入进去一起调试,竟然可以正常通讯了,我吐了,目前猜测程序其他部分时序影响了串口中断,也可能与优先级有关,等有时间再找出具体原因。

     

你可能感兴趣的:(4.20 神奇的串口中断)