[STM32F1] DMA使用存储器到存储器之间的数据搬运的例子

[复制链接]
2203|7
 楼主| electronictech 发表于 2021-6-24 14:04 | 显示全部楼层 |阅读模式
有使用DMA完成存储器到存储器之间的数据搬运的例子吗,这两个存储器都是MCU的自定义的缓存buffer,如有例程可否发一下供参考,谢谢
yklstudent 发表于 2021-6-24 17:22 | 显示全部楼层
RAM到RAM?
 楼主| electronictech 发表于 2021-6-24 18:11 | 显示全部楼层

嗯嗯,就是DMA中M2M那个功能
yklstudent 发表于 2021-6-25 10:56 | 显示全部楼层
electronictech 发表于 2021-6-24 18:11
嗯嗯,就是DMA中M2M那个功能

dma_driver_type dma_drivers[] =
{
        [eDMA1_CH01] =
        {
                .dma_config =
                {
                        .irq_vector                 = DMA1_Channel1_IRQn,
            .mpriority                  = 2,
            .spriority                  = 1,
            .controller                 = DMA1,
            .stream                     = DMA1_Channel1,
            .channel                    = LL_DMA_CHANNEL_1,
            .clear_flags                     = LL_DMA_ClearFlag_TC1,
            .isavtive_flags                    = LL_DMA_IsActiveFlag_TE1,
                        .isenable_it                                = LL_DMA_IsEnabledIT_TC,
                },
                .dma_sem = NULL,
        },
};

void sDMA_Configuration(dma_driver_type *driver, uint8_t *p_txbuf, uint8_t *p_rxbuf)
{
        LL_DMA_InitTypeDef     DMA_InitStructure;
       
        if( driver->dma_sem == NULL)
        {
                driver->dma_sem = osSemaphoreNew(1, 0, NULL);
        }
       
        /* Enable DMA peripheral clock */
    if ( driver->dma_config.controller == DMA1 )
    {
        RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    }
    else
    {
        RCC->AHBENR |= RCC_AHBENR_DMA2EN;
    }
       
        NVIC_SetPriority(driver->dma_config.irq_vector, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), driver->dma_config.mpriority, driver->dma_config.spriority));
        NVIC_EnableIRQ(driver->dma_config.irq_vector);
       
        LL_DMA_DeInit(driver->dma_config.controller, driver->dma_config.channel);
       
        /* Configure DMA controller to manage TX DMA request ----------*/
        DMA_InitStructure.PeriphOrM2MSrcAddress  = (uint32_t)p_txbuf;
        DMA_InitStructure.PeriphOrM2MSrcIncMode  = LL_DMA_PERIPH_INCREMENT;
        DMA_InitStructure.MemoryOrM2MDstIncMode  = LL_DMA_MEMORY_INCREMENT;
        DMA_InitStructure.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE;
        DMA_InitStructure.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE;
        //DMA_InitStructure.Mode                         = LL_DMA_MODE_CIRCULAR;
        DMA_InitStructure.Mode                         = LL_DMA_MODE_NORMAL;
        DMA_InitStructure.Priority                         = LL_DMA_PRIORITY_HIGH;
        DMA_InitStructure.Direction                      = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
        DMA_InitStructure.MemoryOrM2MDstAddress  = (uint32_t)p_rxbuf;
        DMA_InitStructure.NbData                               = (uint32_t)0;
        LL_DMA_Init(driver->dma_config.controller, driver->dma_config.channel, &DMA_InitStructure);
}

void sDMA_EnableStream(dma_driver_type *driver, uint16_t length)
{       
        LL_DMA_SetDataLength(driver->dma_config.controller, driver->dma_config.channel, length);
       
        driver->dma_config.clear_flags(driver->dma_config.controller);
       
        /* Enable the DMA Stream Interrupt */
        LL_DMA_EnableIT_TC(driver->dma_config.controller, driver->dma_config.channel);

        /* Enable the DMA TX Stream */
        LL_DMA_EnableChannel(driver->dma_config.controller, driver->dma_config.channel);
       
        osSemaphoreAcquire(driver->dma_sem, osWaitForever);
}

void sDMA_Interrupt(dma_driver_type *driver)
{
        //TX Interrupt
        if(driver->dma_config.isavtive_flags(driver->dma_config.controller) || \
                driver->dma_config.isenable_it(driver->dma_config.controller, driver->dma_config.channel))
        {
        LL_DMA_DisableChannel(driver->dma_config.controller, driver->dma_config.channel);
                LL_DMA_DisableIT_TC(driver->dma_config.controller, driver->dma_config.channel);
                driver->dma_config.clear_flags(driver->dma_config.controller);
               
                osSemaphoreRelease(driver->dma_sem);
        }
}
可以参考
 楼主| electronictech 发表于 2021-6-25 13:49 | 显示全部楼层
yklstudent 发表于 2021-6-25 10:56
dma_driver_type dma_drivers[] =
{
        [eDMA1_CH01] =

谢谢,您知道DMA的传输速率是多少吗
yklstudent 发表于 2021-6-25 15:04 | 显示全部楼层
electronictech 发表于 2021-6-25 13:49
谢谢,您知道DMA的传输速率是多少吗

你自己看使用的芯片,DMA时钟是多少
 楼主| electronictech 发表于 2021-6-30 11:17 | 显示全部楼层
yklstudent 发表于 2021-6-25 15:04
你自己看使用的芯片,DMA时钟是多少

时钟的速率就是他的传输速率是吗?
yklstudent 发表于 2021-6-30 14:32 | 显示全部楼层
electronictech 发表于 2021-6-30 11:17
时钟的速率就是他的传输速率是吗?

你不确定的话,就自己写个测试程序测试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

27

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部