关于#GD32芯片#的问题:需要配置为DMA的串口已经用重定向测试过

我在用GD32E103做串口通讯的时候,采用DMA方式。但是每次执行到发送函数后,程序就会卡死。不知道是不是我的DMA配置有什么问题?参考demo程序看不出有何问题发生。需要配置为DMA的串口已经用重定向测试过,可以打印数据,串口的配置没有问题。
datasheet如下

img

void uart1_dma_txinit(void)     
{     
        dma_parameter_struct dma_init_struct;
    
        /* enable DMA0 */
        rcu_periph_clock_enable(RCU_DMA0);
        dma_struct_para_init(&dma_init_struct);
        dma_deinit(DMA0, DMA_CH6);
        
        dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;//????
        dma_init_struct.memory_addr = 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 = USART1_DATA_ADDRESS;   //????
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
        dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
        dma_init(DMA0, DMA_CH6, &dma_init_struct);
    
        /* configure DMA mode */
        dma_circulation_disable(DMA0, DMA_CH6);
        dma_memory_to_memory_disable(DMA0, DMA_CH6);
}

void usart2_dma_send(uint8_t *buffer, uint16_t len)
{
    dma_channel_disable(DMA0, DMA_CH6);
    
    dma_memory_address_config(DMA0, DMA_CH6,(uint32_t)buffer);//????????????
    dma_transfer_number_config(DMA0, DMA_CH6,len);//????????
    
    dma_channel_enable(DMA0, DMA_CH6);
    
      usart_dma_transmit_config(USART1, USART_TRANSMIT_ENABLE);//????DMA??
    while(RESET == dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF));
    //dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_FTF);
    
}


//调用的代码块如下
for( ;; )
    {
        gd_eval_led_toggle(LED2);
        //dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_FTF);
        //usart1_dma_trans(str, 1);
        usart2_dma_send(str,1);
        //while(RESET == dma_flag_get(DMA0, DMA_CH6, DMA_INTF_FTFIF));
        printf("dma err: %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_ERR));
        printf("dma intf_ftfif %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF));
        printf("dma htf  : %d \n", dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_HTF));
        //dma_flag_clear(DMA0, DMA_CH6, DMA_FLAG_HTF);

        
        vTaskDelay(500 / portTICK_RATE_MS);
    }

找到问题所在了,函数的相关配置中,关于UART1_DATA_ADDRESS配置的有问题,这里错误的配置成0x40004400了。查看datasheet发现USART1的基地址是0x40004400。这里理解的有问题了,这是基地址,而数据寄存器地址是在基地址上有偏移的,查看发现便宜为0x04,所以正确应该设置的地址为0x40004404。

  • 这篇博客: GD32 DMA串口通讯DEMO中的 发送不定长数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1,失能DMA_CH1。
    2,DMA_CH1配置内存地址以及发送长度。
    3,使能DMA_CH1。
    4,使能usart0的DMA发送
    5,等待DMA发送完成
    发送不定长数据