GD32F303串口通信

串口接收

串口接收空闲中断+DMA

static void Receive_DataPack(void)
{
    
    
	usart_interrupt_disable(EVAL_COM2, USART_INT_IDLE);
    dma_channel_disable(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH);/* 暂时关闭dma,数据尚未处理, 关闭DMA ,防止干扰 */
	dma_flag_clear(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH, DMA_FLAG_FTF);  /* 清DMA标志位 */
	modbus.recount = CMD_MAX_SIZE-dma_transfer_number_get(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH);       //接收到数据个数
	dma_transfer_number_config(EVAL_COM2_DMA,EVAL_COM2_RX_DMA_CH, CMD_MAX_SIZE);    /* 重新赋值计数值,必须大于等于最大可能接收到的数据帧数目 */
	dma_channel_enable(EVAL_COM2_DMA, EVAL_COM2_RX_DMA_CH);     /* 此处应该在处理完数据再打开,如在 DataPack_Process() 打开*/
    usart_interrupt_enable(EVAL_COM2, USART_INT_IDLE);
}
void EVAL_COM2_IRQHandler(void)                                                   
{
    
    
	if (usart_interrupt_flag_get(EVAL_COM2, USART_INT_FLAG_IDLE) != RESET)   //进入一次中断,说明接收到一帧指令
	{
    
    
        //usart_interrupt_flag_clear(EVAL_COM2,USART_INT_FLAG_IDLE);	
        usart_data_receive(EVAL_COM2);        /*注意,必须读数据才能清空标志位*/
        Receive_DataPack();
		modbus.reflag = 1;
	}
}

使用usart_interrupt_flag_clear(EVAL_COM2,USART_INT_FLAG_IDLE); 并不能清除空闲中断标志USART_INT_FLAG_IDLE,必须读取数据usart_data_receive(EVAL_COM2);

猜你喜欢

转载自blog.csdn.net/m0_37187962/article/details/126902131