打印

gd32f303 DMA+串口问题

[复制链接]
991|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tzlll111|  楼主 | 2025-3-27 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tzlll111 于 2025-3-27 16:05 编辑

gd32f303 DMA+uart遇到问题,就是当数据长度超过DMA长度(g_egdp_cpu_uart_dma【uart_index】.dma_rx_buf_size),下一次再收到数据,会在buffer开头多得到一个0x00,当然得到的uart_rx_len也比发的数据多1,为什么?下面是串口IRQ代码
static void Usart_Irq_Handler(u8 uart_index)
{
    u32 uart_reg_addr = g_egdp_cpu_uart_interface[uart_index];

    u16 uart_rx_len = 0;


    if(SET == usart_interrupt_flag_get(uart_reg_addr, USART_INT_FLAG_IDLE))
    {
        if(NULL != g_egdp_cpu_uart_dma[uart_index].isr_rx_func)
        {
            usart_data_receive(g_egdp_cpu_uart_interface[uart_index]); //clear idle flag
            dma_channel_disable(g_egdp_cpu_uart_dma[uart_index].dma_base,
            g_egdp_cpu_uart_dma[uart_index].dma_rx_chl);   /* 关闭DMA传输 */

            uart_rx_len = g_egdp_cpu_uart_dma[uart_index].dma_rx_buf_size -
            dma_transfer_number_get(g_egdp_cpu_uart_dma[uart_index].dma_base,g_egdp_cpu_uart_dma[uart_index].dma_rx_chl);

            /* the number will strangely increase by one in the next turn when uart_rx_len==dma_rx_buf_size.*/
            dma_transfer_number_config(g_egdp_cpu_uart_dma[uart_index].dma_base,
            g_egdp_cpu_uart_dma[uart_index].dma_rx_chl,g_egdp_cpu_uart_dma[uart_index].dma_rx_buf_size);//refill number

            dma_interrupt_flag_clear(g_egdp_cpu_uart_dma[uart_index].dma_base,g_egdp_cpu_uart_dma[uart_index].dma_rx_chl,DMA_INTF_FTFIF);   /*必须要清除标志,否则只进来一次*/        

            dma_channel_enable(g_egdp_cpu_uart_dma[uart_index].dma_base, g_egdp_cpu_uart_dma[uart_index].dma_rx_chl);   /* 开启DMA传输 */

            g_egdp_cpu_uart_dma[uart_index].isr_rx_func(g_egdp_cpu_uart_dma[uart_index].dma_rx_buf,uart_rx_len);  
        }        
                        usart_flag_clear(uart_reg_addr,USART_FLAG_IDLE);                 /* 清除空闲中断标志位 */
   }
}

使用特权

评论回复
评论
tzlll111 2025-3-27 16:03 回复TA
static void Usart_Irq_Handler(u8 uart_index) { u32 uart_reg_addr = g_egdp_cpu_uart_interface[uart_index]; u16 uart_rx_len = 0; if(SET == usart_interrupt_flag_get(uart_reg_addr, USART_INT_FLAG_IDLE)) { if(NULL != g_egdp_cpu_uart_dma[uart_index].isr_rx_func) { usart_data_receive(g_egdp_cpu_uart_interface[uart_index]); //clear idle flag dma_channel_disable(g_egdp_cpu_uart_dma[uart_index].dma_base, g_egdp_cpu_uart...  
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝