十八、从0开始卷出一个新项目之瑞萨RZN2L使用ADC+DMA接收数据流

目录

一、概述

[二、对比stm32 adc+dma"双buf模式"](#二、对比stm32 adc+dma“双buf模式”)

[三、瑞萨rzn2l dma寄存器模式(双配置模式)](#三、瑞萨rzn2l dma寄存器模式(双配置模式))

四、例程源码

五、总结


一、概述

  • 嵌入式科普(34)通过对比看透DMA的本质

  • 如何高效的、无损的接收adc的连续数据流,分享RZN2L使用DMA连续接收ADC数据的例程源码

  • 对比stm32 dma所谓的"循环/双buf模式",和TI dma所的的"pingpong模式"。rzn2l如何实现?优劣势又是什么?

二、对比stm32 adc+dma"双buf模式"

三、瑞萨rzn2l dma寄存器模式(双配置模式)

  • 但是rzn2l dma没有"循环/双buf模式"

  • 如何按照"双buf模式",去分析dma框图,很可能会造成思路混乱、逻辑不通。因为只有一张单方向传输的框图。

  • 个人总结rzn2l dma的"双buf模式"应该叫"双配置模式"

四、例程源码

复制代码
__asm volatile ("cpsie i");

    // Must be before dma cfg!!!!!!!!!!!!
    g_adc103.p_api->open(g_adc103.p_ctrl, g_adc103.p_cfg);

#if ENABLE_DMA
    g_transfer0.p_api->open(g_transfer0.p_ctrl, g_transfer0.p_cfg);

    g_transfer0_ctrl.p_cfg->p_info->p_src = (void*)&g_adc103_ctrl.p_reg->ADDR[3];
    g_transfer0_ctrl.p_cfg->p_info->p_dest = (void*)&adc_dest0[0];
    g_transfer0_ctrl.p_cfg->p_info->length = sizeof(g_adc103_ctrl.p_reg->ADDR[3]) * BUF_LEN;
#if 1
    g_transfer0_ctrl.p_cfg->p_info->p_next1_src = (void*)&g_adc103_ctrl.p_reg->ADDR[3];
    g_transfer0_ctrl.p_cfg->p_info->p_next1_dest = (void*)&adc_dest1[0];
    g_transfer0_ctrl.p_cfg->p_info->next1_length = sizeof(g_adc103_ctrl.p_reg->ADDR[3]) * BUF_LEN;
#endif
    g_transfer0.p_api->reconfigure(g_transfer0.p_ctrl, g_transfer0_ctrl.p_cfg->p_info);

    //reconfigure auto enable dma
    //g_transfer0.p_api->enable(g_transfer0.p_ctrl);
    //g_transfer0.p_api->softwareStart(g_transfer0.p_ctrl, (transfer_start_mode_t)0);
#endif


    g_adc103.p_api->scanCfg(g_adc103.p_ctrl, g_adc103.p_channel_cfg);
    g_adc103.p_api->scanStart(g_adc103.p_ctrl);

void g_transfer0CB(transfer_callback_args_t *p_args)
{
 (void)(p_args);
    dma_end_flg++;

    //To perform transfers in series, write 1 to the REN bit in the CHCFG_n register immediately!!!
    //So you can't resume debugging from the pause!!!
    //p_instance_ctrl->p_reg->GRP[group].CH[channel].CHCFG_b.REN = 1;
    g_transfer0_ctrl.p_reg->GRP[0].CH[0].CHCFG_b.REN = 1;

    if(dma_end_flg == 1)
    {
        //todo:data parse

    }
    else if(dma_end_flg == 2)
    {
        dma_end_flg = 0;

        //todo:data parse

    }

    return;
}

五、总结

  • 瑞萨rzn2l可通过dma"双配置模式"去实现数据流传输

  • 复杂dma功能需要我们对概念、框图分析、dma本质有更深层次理解

相关推荐
硬汉嵌入式7 小时前
瑞萨推出M33内核WiFi6双频(2.4G+5G) + BLE蓝牙芯片RA6W2/W1,同时还将推出现成模组
蓝牙·瑞萨·wifi6·ra6w1·ra6w2
CinzWS1 天前
车规级高可靠性DMA控制器(G-DMA)架构设计--第一章 设计需求与规格定义 1.1 核心驱动力与应用场景
架构·dma
CinzWS1 天前
车规级高可靠性DMA控制器(G-DMA)架构设计--第二章 IP核心架构设计 2.1 顶层系统架构
架构·系统架构·dma
一个平凡而乐于分享的小比特8 天前
DMA详解:让数据传输“甩掉”CPU的搬运工
嵌入式硬件·dma
赖small强12 天前
【Linux驱动开发】Linux DMA 技术详解与驱动开发实战
linux·dma·直接内存访问
时光の尘1 个月前
【STM32】DMA超详细解析·入门级教程
stm32·单片机·嵌入式硬件·mcu·串口·dma·usart
无垠的广袤1 个月前
【CPKCOR-RA8D1】Home Assistant 物联网 ADC 电压温度计
嵌入式硬件·物联网·智能家居·瑞萨
brave and determined1 个月前
MCU学习Day24——STM32G030多路ADC DMA采集深度解析:完全可配置序列器与不完全可配置序列器的陷阱与抉择
stm32·单片机·嵌入式硬件·dma·adc·hal·多通道采集
时光の尘2 个月前
STM32外设面试速通:UART、I2C、SPI、DMA、RAM/FLASH与ADC/DAC
stm32·dma·iic·adc·flash·spi·ram
draracle2 个月前
RP2040 I2S MAX98357音频驱动开发
dma·i2s·rp2040·max98357