打印

关于GD32F470 DMA缓存切换不正常问题

[复制链接]
785|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liaoqg48|  楼主 | 2022-10-29 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最年在用GD32F470处理器处理OV5640图像数据,发现在双缓存工作不正常的问题,在传输过程中缓存没有自动切换的现象,如我设置的是60K完成一次,自动切换,当传输前面几次都会自动切换,后面发现在几次不切换了,都是同一个缓存 。有谁是否也遇上过,或者是我哪里没设对的。请各位大老赐教。

使用特权

评论回复
沙发
liaoqg48|  楼主 | 2022-10-29 17:03 | 只看该作者
void DCI_DMA_Init(uint32_t DMA_Memory0BaseAddr, uint32_t DMA_Memory1BaseAddr, uint16_t DMA_BufferSize)
{
        dma_single_data_parameter_struct dma_single_struct;
        // DCI DMA configuration
        rcu_periph_clock_enable(RCU_DMA1);
        //
        pData0 = (uint32_t *)DMA_Memory0BaseAddr;
        pData1 = (uint32_t *)DMA_Memory1BaseAddr;
        mDatalen = DMA_BufferSize;
        dma_single_data_para_struct_init(&dma_single_struct);
#if (DCI_DMA_CON == DCI_DMA_CH1)
                dma_deinit(DMA1,DMA_CH1);
#else
        dma_deinit(DMA1,DMA_CH7);
#endif
    dma_single_struct.periph_addr                                = (uint32_t)DCI_DR_ADDRESS;
    dma_single_struct.memory0_addr                                = (uint32_t)DMA_Memory0BaseAddr;
    dma_single_struct.direction                                        = DMA_PERIPH_TO_MEMORY;
    dma_single_struct.number                                        = DMA_BufferSize;
    dma_single_struct.periph_inc                                = DMA_PERIPH_INCREASE_DISABLE;
    dma_single_struct.memory_inc                                = DMA_MEMORY_INCREASE_ENABLE;
    dma_single_struct.periph_memory_width                = DMA_PERIPH_WIDTH_32BIT;
    dma_single_struct.priority                                        = DMA_PRIORITY_HIGH;
    dma_single_struct.circular_mode                                = DMA_CIRCULAR_MODE_ENABLE;
#if (DCI_DMA_CON == DCI_DMA_CH1)
        dma_priority_config(DMA1,DMA_CH1,DMA_PRIORITY_ULTRA_HIGH);
        dma_single_data_mode_init(DMA1,DMA_CH1,&dma_single_struct);
        dma_channel_subperipheral_select(DMA1,DMA_CH1,DMA_SUBPERI1);
#else
        dma_priority_config(DMA1,DMA_CH7,DMA_PRIORITY_ULTRA_HIGH);
        dma_single_data_mode_init(DMA1,DMA_CH7,&dma_single_struct);
        dma_channel_subperipheral_select(DMA1,DMA_CH7,DMA_SUBPERI1);
#endif
//        dma_flow_controller_config(DMA1,DMA_CH7,DMA_FLOW_CONTROLLER_PERI);
        if(DMA_Memory1BaseAddr)
        {
#if (DCI_DMA_CON == DCI_DMA_CH1)
                dma_switch_buffer_mode_config(DMA1,DMA_CH1,DMA_Memory1BaseAddr,DMA_MEMORY_0);
                dma_switch_buffer_mode_enable(DMA1,DMA_CH1,ENABLE);
#else
                dma_switch_buffer_mode_config(DMA1,DMA_CH7,DMA_Memory1BaseAddr,DMA_MEMORY_0);
                dma_switch_buffer_mode_enable(DMA1,DMA_CH7,ENABLE);
#endif
        }
#if (DCI_DMA_CON == DCI_DMA_CH1)
        dma_interrupt_enable(DMA1,DMA_CH1,DMA_CHXCTL_FTFIE);
        nvic_irq_enable(DMA1_Channel1_IRQn, 0, 0);
#else
        dma_interrupt_flag_clear(DMA1,DMA_CH7,DMA_CHXCTL_FTFIE);
        dma_interrupt_enable(DMA1,DMA_CH7,DMA_CHXCTL_FTFIE);
        nvic_irq_enable(DMA1_Channel7_IRQn, 0, 0);
#endif
}

使用特权

评论回复
板凳
liaoqg48|  楼主 | 2022-10-29 17:05 | 只看该作者
上面代码是传输前的配置。

使用特权

评论回复
地板
liaoqg48|  楼主 | 2022-10-29 17:06 | 只看该作者
用的是DMA1通道7

使用特权

评论回复
5
yang137966| | 2023-1-11 14:22 | 只看该作者
你好,解决了吗,我现在也用IIS+双缓存DMA,可以参考一下你的代码吗

使用特权

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

本版积分规则

1

主题

5

帖子

1

粉丝