打印

GD32E230C USART0串口用PB6 PB7引脚 ,并使用DMA_CH3和DMA_CH4传输

[复制链接]
967|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
changxin1205|  楼主 | 2022-10-30 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为DMA_CH2已被SPI传输用掉,所以USART0想用DMA_CH4代替,无法接收到数据,一直显示接收的数据大小为0请大家帮忙看看是映射出问题了吗,还是配置没对?

使用特权

评论回复
沙发
changxin1205|  楼主 | 2022-10-30 17:36 | 只看该作者

GD32E230C USART0串口用PB6 PB7引脚 ,并使用DMA_CH3和DMA_CH4传输

static int BSP_DmaConfig(dma_channel_enum dma_channelx,uint32_t peripheralAddr,uint32_t memoryAddr,uint32_t dir,uint32_t datasize)
{
    dma_parameter_struct dma_init_struct;
    rcu_periph_clock_enable(RCU_DMA);
    dma_deinit(dma_channelx);
    dma_init_struct.direction=dir;
    dma_init_struct.memory_addr=memoryAddr;
    dma_init_struct.memory_inc=DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width=DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number=datasize;
    dma_init_struct.periph_addr=peripheralAddr;
    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;
    /* configure DMA mode */
    dma_circulation_disable(dma_channelx);   //禁止循环模式
    dma_memory_to_memory_disable(dma_channelx); //禁止内存到内存
    dma_init(dma_channelx,&dma_init_struct);
    if(dma_channelx==DMA_CH4)
    {
  syscfg_dma_remap_enable(SYSCFG_DMA_REMAP_USART0RX);
    }
        if(dma_channelx==DMA_CH3)
    {
    syscfg_dma_remap_enable(SYSCFG_DMA_REMAP_USART0TX);
    }
    /* enable DMA channel */
    dma_channel_enable(dma_channelx);   

    return 0;
}
void USART0_IRQHandler(void)
{
        volatile uint32_t clear;
         uint16_t msgLength = 0;

        if(usart_interrupt_flag_get(USART0x, USART_INT_FLAG_IDLE) != RESET){  
            usart_interrupt_flag_clear(USART0x,USART_INT_FLAG_IDLE);   
            //使用长度=总长度-剩余的长度
            msgLength = sizeof(gUartData.USART0_RxData)-(uint16_t)dma_transfer_number_get(DMA_CH4);
            printf("channel%d %d  %d\r\n",msgLength,sizeof(gUartData.USART0_RxData),dma_transfer_number_get(DMA_CH4));
            //清除中断
            clear=USART_STAT(USART0x);
            clear=USART_RDATA(USART0x);   
            dma_channel_disable(DMA_CH4);                                        //关闭DMA传输
            Control_Upper_Computer((uint8_t*)gUartData.USART0_RxData, msgLength-2);
            //由于是单次传输,需要再次初始化
            dma_interrupt_flag_clear(DMA_CH4,DMA_INT_FLAG_FTF);
            dma_interrupt_flag_clear(DMA_CH4,DMA_INT_FLAG_ERR);
            dma_flag_clear(DMA_CH4,DMA_FLAG_FTF);
            dma_flag_clear(DMA_CH4,DMA_FLAG_ERR);
            dma_memory_address_config(DMA_CH4,(uint32_t)gUartData.USART0_RxData);
            dma_transfer_number_config(DMA_CH4,sizeof(gUartData.USART0_RxData));    //数据传输量
            dma_channel_enable(DMA_CH4);                                            //开启DMA传输
          printf("nbb\r\n");
        }   
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝