问答

汇集网友智慧,解决技术难题

jsrdczy

TA的家园币:24  

  • GD32F303 串口DMA发送问题

    兄弟萌,有一个关于gd32的串口dma发送问题:场景描述:串口DMA发送数据,一般的做法是开DMA发送完成中断,然后在中断里切换发送状态或者进行下一次传输。思路描述:如果是485传输,如果用DMA发送完成中断的话,在中断里发送改为接收状态时,可能会丢1个字节。所以沿用之前stm32的做法,打开串口的发送完成中断,利用tc中断在串口中断服务程序中切换状态或者进行下一帧发送。问题:之前stm32的工程就是用串口tc发送完成中断来标识发送完成的,但是同样的做法在gd32上,虽然能够进行入tc中断,但是发送出来的数据完全不对。解决办法:dma通道使能后delay3个ms就可以发送正确发送了,和开dma或者串口tc中断没有关系。贴一部分代码:DMA配置:staticvoidgd32_dma_config(structrt_serial_device*serial,rt_ubase_tflag){structdma_config*dma_config;structgd32_uart*uart;dma_parameter_structdma_init_struct;RT_ASSERT(serial!=RT_NULL);uart=(structgd32_uart*)serial->parent.user_data;if(RT_DEVICE_FLAG_DMA_TX==flag){dma_config=uart->dma_tx;}elseif(RT_DEVICE_FLAG_DMA_RX==flag){return;//nosupporttemporarily}//enabledmaclockrcu_periph_clock_enable(dma_config->dma_rcu);//initillizeDMAchanneldma_deinit(dma_config->dma_periph,dma_config->channel);dma_struct_para_init(&dma_init_struct);dma_channel_disable(uart->dma_tx->dma_periph,uart->dma_tx->channel);dma_init_struct.direction=DMA_MEMORY_TO_PERIPHERAL;dma_init_struct.memory_addr=RT_NULL;dma_init_struct.memory_inc=DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width=DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number=0;dma_init_struct.periph_addr=(uint32_t)&USART_DATA(uart->uart_periph);dma_init_struct.periph_inc=DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_width

    串口DMA GD32F303 UART se ip

    2021-11-22 1