【经验】32位MCU的LDMA实现ADC至RAM的数据传输调试方法

2018-02-08 世强 Carol
32位MCU,微处理器,微控制器,EFM32JG 32位MCU,微处理器,微控制器,EFM32JG 32位MCU,微处理器,微控制器,EFM32JG 32位MCU,微处理器,微控制器,EFM32JG

SILICON LABSEFM32PG/ EFM32JG系列32位MCU具有超低功耗、高性能、丰富的外设等特点,被广泛使用于各种行业。EFM32PG/ EFM32JG的LDMA相比于series 0的DMA具有更多的传输方式,更适合应用于电池供电的产品。


本文为大家介绍EFM32PG的LDMA实现ADC至RAM的数据传输调试方法。详细的工作过程是:MCU在EM2模式,开启LETIMER0定时触发ADC采样,ADC采样的结果存入ADC的FIFO,FIFO存满后通过LDMA将数据存入到定义的数组中。硬件是基于EFM32PG的SLSTK3401A,软件基于Simplicity Studio V3。


1、ADC初始化


ADC初始化函数如下。ADC要想在EM2或EM3模式下工作,ADC_CLK必须选择AUXHFRCO时钟源。配置ADC触发LDMA的条件,ADC0具有4个FIFO,此例程的条件是4个FIFO存满后触发LDMA。配置当LDMA触发条件满足时是否唤醒LDMA,并且配置ADC的时钟为异步时钟模式。关闭ADC的中断,使能PRS。


void setupAdc(void)

{

CMU->ADCCTRL = 0x00000010;

CMU_ClockEnable(cmuClock_ADC0, true);

CMU_AUXHFRCOFreqSet(cmuAUXHFRCOFreq_4M0Hz);

  ADC_Init_TypeDef init =

  {

    adcOvsRateSel2,                /* 2x oversampling (if enabled). */

    adcWarmupNormal,               /* ADC shutdown after each conversion. */

    _ADC_CTRL_TIMEBASE_DEFAULT,    /* Use HW default value. */

    _ADC_CTRL_PRESC_DEFAULT,       /* Use HW default value. */

    false,                         /* Do not use tailgate. */

    adcEm2ClockOnDemand                 /* ADC disabled in EM2 */

  };

  ADC_InitSingle_TypeDef singleInit =

  {

    adcPRSSELCh0,              /* PRS ch0 (if enabled). */

    adcAcqTime1,               /* 1 ADC_CLK cycle acquisition time. */

    adcRefVDD,                /* VDD  reference. */

    adcRes12Bit,               /* 12 bit resolution. */

    adcPosSelAPORT4XCH1,         /* Select node BUS0XCH0 as posSel */

    adcNegSelVSS,         /* Select node BUS0XCH1 as negSel */

    false,                     /* Single ended input. */

    true,                     /* PRS enabled. */

    false,                     /* Right adjust. */

    false,                     /* Deactivate conversion after one scan sequence. */

    false,                     /* No EM2 DMA wakeup from single FIFO DVL */

    false                      /* Discard new data on full FIFO. */

  };

  /* Init common settings for both single conversion and scan mode- */

  /* Set timebase to 10, this gives 11 cycles which equals 1us at 11 MHz. */

  init.timebase = ADC_TimebaseCalc(CMU_AUXHFRCOBandGet());


  /* Set ADC clock prescaler to 0, we are using 11MHz HFRCO, which results in HFPERCLK < 13MHz- */

  init.prescale = ADC_PrescaleCalc(1000000, CMU_AUXHFRCOBandGet());


  ADC_Init(ADC0, &init);


  /* Init for single conversion use, measure channel 0 with Vdd as reference. */

  /* Using Vdd as reference removes the 5us warmup time for the bandgap reference. */

  singleInit.reference  = adcRefVDD;

// singleInit.input      = adcSingleInpCh0;


  /* Resolution can be set lower for even more energy efficient operation. */

  singleInit.resolution = adcRes12Bit;


  /* Assuming we are mesuring a low impedance source we can safely use the shortest */

  /* acquisition time. */

  singleInit.acqTime = adcAcqTime1;

  singleInit.singleDmaEm2Wu = true;   //EM2 DMA available


  ADC_InitSingle(ADC0, &singleInit);

  ADC0->SINGLEFIFOCLEAR = ADC_SINGLEFIFOCLEAR_SINGLEFIFOCLEAR;

  /* Set data valid level to trigger DMA */

  ADC0->SINGLECTRLX |= (4 - 1) << _ADC_SINGLECTRLX_DVL_SHIFT;

    /* Set DMA availability in EM2 and ADC EM2 clock configuration */

    BUS_RegBitWrite(&ADC0->CTRL, _ADC_CTRL_SINGLEDMAWU_SHIFT, 1);

    BUS_RegMaskedWrite(&ADC0->CTRL,

                 _ADC_CTRL_ADCCLKMODE_MASK | _ADC_CTRL_ASYNCCLKEN_MASK,

                       adcEm2ClockOnDemand);


  /* Enable ADC Interrupt when Single Conversion Complete. */

  /* This is necessary for WFE (wait for event) to work. */

  /* Notice that enabling the interrupt in the NVIC is not needed. */

  //ADC0->IEN = ADC_IEN_SINGLE;

  //ADC_IntEnable(ADC0,ADC_IEN_SINGLE);

  //NVIC_EnableIRQ(ADC0_IRQn);

}

2、外围反射系统(PRS)初始化


PRS初始化函数如下,选择触发源是LETIMER0和触发信号LETIMER0CH0。

void setupPrs(void)

{

  CMU_ClockEnable(cmuClock_PRS, true);


  PRS_SourceAsyncSignalSet(0, PRS_CH_CTRL_SOURCESEL_LETIMER0, PRS_CH_CTRL_SIGSEL_LETIMER0CH0);

}



3、LETIMER0初始化


LETIMER0初始化函数如下,定时时间为2.5ms。

void setupLetimer(void)

{

  LETIMER_Init_TypeDef letimerInit = LETIMER_INIT_DEFAULT;

  letimerInit.ufoa0 = letimerUFOAToggle;        /* Toggle outout on underflow */

  letimerInit.comp0Top = true;                  /* Reload CNT from TOP on underflow */


  CMU_ClockEnable(cmuClock_LETIMER0, true);


  LETIMER_Init(LETIMER0, &letimerInit);

  LETIMER_CompareSet(LETIMER0, 0, 41);   /* Toggle every 2.5ms */

  LETIMER_RepeatSet(LETIMER0, 0, 1);            /* Set REP0 to a non-zero value to generate output */

  LETIMER0->ROUTEPEN = LETIMER_ROUTEPEN_OUT0PEN;

  LETIMER_Enable(LETIMER0, true);

}


4、LDMA初始化


LDMA使用默认初始化函数即可,如下。

void setupLdma(void)

{

LDMA_Init_t ldmaInit = LDMA_INIT_DEFAULT;

LDMA_Init( &ldmaInit );

}


5、设置ADC控制LDMA


函数如下,LDMA传输配置成外设至memory,外设选择ADC0_Single,传输的源地址为&ADC0->SINGLEDATA,目标地址为&adcBuffer。

void adcLdmaSetup(void)

{

  /* Macro for single mode ADC */

  LDMA_TransferCfg_t adcSingleTx =

    LDMA_TRANSFER_CFG_PERIPHERAL(ldmaPeripheralSignal_ADC0_SINGLE);


  /* Macro for ADC data transfer, common for single and scan mode */

  LDMA_Descriptor_t xfer =

    LDMA_DESCRIPTOR_SINGLE_P2M_BYTE(&ADC0->SINGLEDATA, &adcBuffer, ADC_BUFFER_SIZE);


  /* Initialize descriptor for ADC LDMA transfer */

  descLink1 = xfer;

  descLink1.xfer.doneIfs = 0;

  descLink1.xfer.blockSize = ldmaCtrlBlockSizeUnit4;

  descLink1.xfer.ignoreSrec = 1;

  descLink1.xfer.size = ldmaCtrlSizeWord;


  /* Start ADC LMDA transfer */

    LDMA_StartTransfer(USE_DMA_CHANNEL, (void*)&adcSingleTx, (void*)&descLink1);

    while (!LDMA_TransferDone(USE_DMA_CHANNEL))

    {

    EMU_EnterEM2(false);

    }

}


主函数如下:

/**************************************************************************//**

 * @brief  Main function

 *****************************************************************************/

int main(void) {

EMU_DCDCInit_TypeDef dcdcInit = EMU_DCDCINIT_STK_DEFAULT;

/* Chip errata */

CHIP_Init();

/* If first word of user data page is non-zero, enable eA Profiler trace */

/* Init DCDC regulator and HFXO with kit specific parameters */

EMU_DCDCInit(&dcdcInit);


CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO);  // use HFRCO

CMU_HFRCOBandSet(cmuHFRCOFreq_16M0Hz);  // set 16MHz Frequency


/* Use LFRCO as LFA clock for LETIMER and PCNT */

CMU_OscillatorEnable(cmuOsc_LFXO, true, true);

CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFXO);

CMU_ClockEnable(cmuClock_CORELE, true);


setupAdc();

setupPrs();

setupLetimer();

setupLdma();


while (1) {

adcLdmaSetup();

}

}


以上的配置,可以实现ADC0的采集数据通过LDMA传输至adcBuffer的数组中,根据此工程,工程师可以快速熟悉EFM32PG系列MCU的ADC、PRS以及LDMA等外设的应用。

工程源代码网址:https://www.sekorm.com/doc/135859.html


世强元件电商版权所有,转载请注明来源及链接。

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

相关研发服务和供应服务

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

【经验】如何基于J-FLASH对32位MCU EFM32 进行批量烧写?

Silicon Labs 32位MCU EFM32,以低功耗、高性能等著称,被广泛应用在电池供电等需要低功耗的领域。因应用广泛,在批量烧写上,也得到多家软件支持。本文将详细描述名基于SEGGER的J-Flash软件对EFM32烧写FLASH的方法及步骤。

2018-09-17 -  设计经验 代理服务 技术支持 采购服务

【经验】EFM32系列低功耗32位MCU芯片加密详解

本文主要介绍以Silicon Labs EFM32系列低功耗32位MCU为核心的方案打造加密系统。

2017-10-27 -  设计经验 代理服务 技术支持 采购服务

【经验】32位MCU EFM32ZG使用FreeRTOS低功耗的处理过程

Silicon Labs 32位MCU EFM32ZG210芯片采用Cortex-M0+内核,使用了创新低能耗技术,低功耗模式的唤醒时间只有2us,多种外设可在低功耗模式下工作,是使用电池供电以及需要高性能、低功耗系统的最优选择。本文介绍在32位MCU EFM32ZG上运行FreeRTOS时的低功耗的处理过程。

2019-12-27 -  设计经验 代理服务 技术支持 采购服务

世界上最节能的微控制器EFM32之十大低功耗奥秘

Silicon Labs EFM32 32 位微控制器系列是世界上最为节能的微控制器,特别适用于低功耗和能源敏感型应用,包括能源、水表和燃气表、楼宇自动化、警报及安防和便携式医疗/健身器材。本文着重强调10个Silicon Labs32位MCU功耗低的因素。

2016-07-11 -  新产品 代理服务 技术支持 采购服务

【选型】推荐32位MCU EFM32ZG用于耳温枪主控,在停止模式下耗电量可低至0.5μA

以前我们用的温度计都是水银温度计,由于水银是重金属,一旦破损对人体伤害大。而且水银温度计的测量时间长。针对这两个问题,我们推出耳温枪温度计,耳温枪采用红外方式测温,实现了去水银,不会对人体造成伤害,测量时间短给给们带来便捷。耳温枪为了方便携带,采用电池供电,为了减少电池的更换次数,需要选用低功的主控芯片。 本文推荐选用Silicon Labs的32位MCU EFM32ZG系列的MCU作为主控。

2020-03-04 -  器件选型 代理服务 技术支持 采购服务

【应用】32位MCU在中高端音频处理系统中的应用

音频信号处理涉及多方面,如采集、去除噪声等等,普通MCU很难用一颗芯片集成如此众多的功能。

2017-07-18 -  新应用 代理服务 技术支持 采购服务

【经验】EFM32系列32位MCU常量定位问题的解决方法

Silicon Labs的32位MCU EFM32系列具有低功耗、集成度高的优势,在电池供电类的应用中具有非常明显的优势。开发EFM32的软件一般都是在Simplicty Studio软件下完成。介绍EFM32程序中的常量定位到FLASH的固定地址的方法。

2019-01-27 -  设计经验 代理服务 技术支持 采购服务

【应用】1MByte Flash空间 32位MCU助力无线中继器数据传输

Silicon Labs EFM32JG系列MCU,采用功能强大的 32 位 ARM® Cortex®-M3 内核,EM4H 休眠模式(128 字节 RAM 保留)功耗只有0.39uA,集成AES、ECC 和 SHA 的硬件加密引擎和真随机数发生器(TRNG)

2018-03-06 -  新应用 代理服务 技术支持 采购服务

【经验】32位MCU EFM32ZG222进入EM2模式功耗异常原因分析

Silicon Labs 32位MCU EFM32ZG222是基于Cortex-M0+内核,采用创新低能耗技术的MCU。芯片具有多种低功耗运行方式,较适合电池供电的应用及其它要求较低能耗及系统性能的应用中。EFM32ZG222的低功耗运行方式共有5种能耗运行模式,从EM0到EM4,本文介绍EFM32ZG222进入EM2模式后功耗异常的原因。

2019-10-31 -  设计经验 代理服务 技术支持 采购服务

【产品】8位、16位、32位MCU究竟该如何选择?

本文介绍8位、16位、32位MCU的差异特性。

2016-04-02 -  新产品 代理服务 技术支持 采购服务

如何读取EFM32系列32位MCU的多通道AD扫描采样数据?

EFM32系列单片机ADC的数据保存寄存器有两个,一个是单通道模式的采样数据保存寄存器,一个是扫描模式的采样数据保存寄存器。如果使用多通道扫描采样,那么每个通道采样完成后会产生一个ADC扫描模式中断,用户需要在中断里面读取该通道的扫描采样数据以便存储下一个通道的采样数据。建议使用DMA读取方式,将DMA的触发源设置为ADC的扫描模式事件,这样就可以实现不用进入ADC中断以及MCU的参与即可完成ADC扫描采样数据的保存和读取。

2017-05-05 -  技术问答

【经验】32位MCU LEUART位周期抖动大,该如何解决?

Silicon Labs 32位MCU EFM32,当基于32.768kHz时钟使用LEUART(@9600bps)进行通讯的时候,发现存约1%误码,原因是什么?如何解决?

2019-09-06 -  设计经验 代理服务 技术支持 采购服务

32位MCU EFM32LG330在上电时,其IO会比VDD先上电,从而导致MCU工作异常,应如何处理?

解决方法如下:1、最根本的解决方法,通过调整滤波电容或供电途径,确保VDD先于IO口得电;2、当出现死机时,可以通过拉低复位管脚,来确保解除死机状态。

2017-05-05 -  技术问答 代理服务 技术支持 采购服务

Silicon Labs 32位低功耗MCU EFM32JG1P在故障指示器的应用中,GPIO拉低后,电平为0.8V,而不是0V,根本原因是什么?

Silicon Labs 32位低功耗MCU EFM32JG1P GPIO拉低后,电平为0.8V,主要是因为底下大焊盘PIN0没有连接到GND或者与GND接触不良造成。

2017-10-10 -  技术问答 代理服务 技术支持 采购服务

【经验】32位MCU EFM32PG系列芯片加密方法

Silicon Labs 32位MCU EFM32PG具有功能强大的32位ARM®Cortex®-M4内核,并带有FPU单元,可提供较强的运算处理能力。这一系列的MCU具有超低功耗模式及休眠模式下唤醒功能,非常适合电池供电的应用或其它需要高性能和低功耗的系统中。本文介绍实现对EFM32PG芯片加密的方法

2019-05-25 -  设计经验 代理服务 技术支持 采购服务
展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:32位MCU

价格:¥19.2326

现货: 8,740

品牌:SILICON LABS

品类:Pearl Gecko MCU

价格:¥28.5237

现货: 2,078

品牌:SILICON LABS

品类:Gecko MCU

价格:¥21.5556

现货: 490

品牌:SILICON LABS

品类:Gecko MCU

价格:¥18.1180

现货: 487

品牌:SILICON LABS

品类:Pearl Gecko MCU

价格:¥24.1570

现货: 445

品牌:SILICON LABS

品类:Gecko MCU

价格:¥22.5774

现货: 260

品牌:SILICON LABS

品类:Pearl Gecko MCU

价格:¥20.8122

现货: 145

品牌:SILICON LABS

品类:Gecko MCU

价格:¥18.1180

现货: 50

品牌:SILICON LABS

品类:Gecko MCU

价格:¥21.5556

现货: 20

品牌:SILICON LABS

品类:32 BIT MCU

价格:¥15.2373

现货: 5

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:RENESAS

品类:microcontroller

价格:¥2.8532

现货:188,410

品牌:Advanced Digital Chips

品类:MCU

价格:¥6.6000

现货:100,000

品牌:SGMICRO

品类:微处理器监控电路

价格:¥0.2400

现货:90,000

品牌:SGMICRO

品类:微处理器监控电路

价格:¥0.9400

现货:80,000

品牌:RENESAS

品类:microcontroller

价格:¥32.9564

现货:40,179

品牌:SGMICRO

品类:微处理器监控电路

价格:¥0.7900

现货:40,000

品牌:SGMICRO

品类:微处理器监控电路

价格:¥0.4019

现货:39,000

品牌:兆易创新

品类:IC

价格:¥4.8932

现货:27,000

品牌:国民技术

品类:微控制器

价格:¥18.7261

现货:25,138

品牌:MindMotion

品类:32位MCU

价格:¥5.9400

现货:19,996

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

压力传感器定制

可定制板装式压力传感器支持产品量程从5inch水柱到100 psi气压;数字输出压力传感器压力范围0.5~60inH2O,温度补偿范围-20~85ºС;模拟和数字低压传感器可以直接与微控制器通信,具备多种小型SIP和DIP封装可选择。

提交需求>

TFT LCD液晶显示屏/模组定制

可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。

最小起订量: 1000 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面