QY13820576685 2023-07-19 10:58 采纳率: 16.7%
浏览 11

关于#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);
    }
  • 写回答

2条回答 默认 最新

  • QY13820576685 2023-07-19 11:39
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 7月19日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改