【经验】用STK3700评估板采集EFM32GG低功耗32位MCU外部频率信号完整周期的经验

2019-05-03 Silicon Labs
32位MCU,低功耗32位MCU,评估板,EFM32GG 32位MCU,低功耗32位MCU,评估板,EFM32GG 32位MCU,低功耗32位MCU,评估板,EFM32GG 32位MCU,低功耗32位MCU,评估板,EFM32GG

最近在调试EFM32GG系列的MCU,想测试外部频率信号的周期。翻看了Simplicity Studio下面的范例程序和应用笔记,只有应用笔记AN0014的范例程序timer_input_capture_dma.slsproj接近需求。但范例程序测试的是按键按下的时间,也就是对应的是半个周期,不是完整的周期信号。针对范例程序我做了如下修改(修改部分用红色字体标识),实现了对外部频率信号周期时间的计算。


频率捕捉不用中断方式用的DMA多次连续采集,采集的数据放到了DMA的BUFFER里面,用BUFFER后面的数减去前面的数据然后再求平均值,这样省了中断的频繁进入也实现了连续累加计数,提高了精度。


捕捉时钟设置的是3.5M,现在采集的数据差是35,采集结果如下表截图,对应采集的100KHz。

下面是对应的代码:

#define DMA_CHANNEL_TIMER0       0

#define BUFFERSIZE               30

 

volatile uint16_t bufferA[BUFFERSIZE];

volatile uint16_t bufferB[BUFFERSIZE];

 

/* DMA callback structure */

DMA_CB_TypeDef cb;

 

/* TOP reset value is 0xFFFF so it doesn't need

   to be written for this example */

#define TOP 0xFFFF

 

/* 13761 Hz -> 14Mhz (clock frequency) / 1024 (prescaler) */

#define TIMER_FREQ 3500000//13671

 

#if defined ( STK3700 )

  #define PB0_PORT gpioPortB

  #define PB0_PIN 11//9

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN11//9

#elif defined ( STK3300 )

  #define PB0_PORT gpioPortD

  #define PB0_PIN 8

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN8

#elif defined ( STKG8XX )

  #define PB0_PORT gpioPortB

  #define PB0_PIN 9

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN9

#elif defined ( STK3600 )

  #define PB0_PORT gpioPortB

  #define PB0_PIN 9

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN9

#elif defined ( STK3200 )

  #define PB0_PORT gpioPortC

  #define PB0_PIN 8

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN8

#elif defined ( STK3400 )

  #define PB0_PORT gpioPortC

  #define PB0_PIN 9

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN9

#elif defined ( STK3401 )

  #define PB0_PORT gpioPortF

  #define PB0_PIN 6

  #define PB0_PRS_SIGSEL_PIN PRS_CH_CTRL_SIGSEL_GPIOPIN6

#else

  #error "undefined KIT"

#endif

 

 

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

 * @brief  Call-back called when transfer is complete

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

void transferComplete(unsigned int channel, bool primary, void *user)

{

  (void) user;

 

  /* Re-activate the DMA */

  DMA_RefreshPingPong(channel,

                      primary,

                      false,

                      NULL,

                      NULL,

                      BUFFERSIZE - 1,

                      false);

}

 

 

 

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

 * @brief Configure DMA for Ping-Pong transfers

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

void setupDma(void)

{

  DMA_Init_TypeDef        dmaInit;

  DMA_CfgChannel_TypeDef  chnlCfg;

  DMA_CfgDescr_TypeDef    descrCfg;

 

  /* Initializing the DMA */

  dmaInit.hprot        = 0;

  dmaInit.controlBlock = dmaControlBlock;

  DMA_Init(&dmaInit);

 

  /* Setup call-back function */ 

  cb.cbFunc  = transferComplete;

  cb.userPtr = NULL;

 

  /* Setting up channel */

  chnlCfg.highPri   = false;

  chnlCfg.enableInt = true;

  chnlCfg.select    = DMAREQ_TIMER0_CC0;

  chnlCfg.cb        = &cb;

  DMA_CfgChannel(DMA_CHANNEL_TIMER0, &chnlCfg);

 

  /* Setting up channel descriptor */

  descrCfg.dstInc  = dmaDataInc2;

  descrCfg.srcInc  = dmaDataIncNone;

  descrCfg.size    = dmaDataSize2;

  descrCfg.arbRate = dmaArbitrate1;

  descrCfg.hprot   = 0;

  DMA_CfgDescr(DMA_CHANNEL_TIMER0, true, &descrCfg);

  DMA_CfgDescr(DMA_CHANNEL_TIMER0, false, &descrCfg);

 

  /* Enabling PingPong Transfer*/ 

  DMA_ActivatePingPong(DMA_CHANNEL_TIMER0,

                       false,

                       (void *)&bufferA,

                       (void *)&(TIMER0->CC[0].CCV),

                       BUFFERSIZE - 1,

                       (void *)&bufferB,

                       (void *)&(TIMER0->CC[0].CCV),

                        BUFFERSIZE - 1);

}

 

 

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

 * @brief  Main function

 * Main is called from __iar_program_start, see assembly startup file

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

int main(void)

  /* Initialize chip */

  CHIP_Init();

   

  /* Enable clock for GPIO module */

  CMU_ClockEnable(cmuClock_GPIO, true);

 

  /* Enable clock for TIMER0 module */

  CMU_ClockEnable(cmuClock_TIMER0, true);

  

  /* Enable clock for PRS module */

  CMU_ClockEnable(cmuClock_PRS, true);

 

  /* Setup DMA */

  setupDma();

 

  /* Configure PB0_PIN as an input for PB0 button with filter and pull-up (dout = 1)*/

  GPIO_PinModeSet(PB0_PORT, PB0_PIN, gpioModeInputPullFilter, 1);

 

  /* Select PB0_PIN as external interrupt source*/

  GPIO_IntConfig(PB0_PORT, PB0_PIN, false, false, false);

 

  /* Enable PRS sense on GPIO and disable interrupt sense */

  GPIO_InputSenseSet(GPIO_INSENSE_PRS, _GPIO_INSENSE_RESETVALUE);

 

  /* Select GPIO as source and PB0_PRS_SIGSEL_PIN as signal for PRS channel 0 */

  PRS_SourceSignalSet(0, PRS_CH_CTRL_SOURCESEL_GPIOH, PB0_PRS_SIGSEL_PIN, prsEdgeOff);

   

  /* Select CC channel parameters */

  TIMER_InitCC_TypeDef timerCCInit =

  {

    .eventCtrl  = timerEventEveryEdge,

    .edge       = timerEdgeFalling,//timerEdgeRising,

    .prsSel     = timerPRSSELCh0,

    .cufoa      = timerOutputActionNone,

    .cofoa      = timerOutputActionNone,

    .cmoa       = timerOutputActionNone,

    .mode       = timerCCModeCapture,

    .filter     = true,

    .prsInput   = true,

    .coist      = false,

    .outInvert  = false,

  };

 

  /* Configure CC channel 0 */

  TIMER_InitCC(TIMER0, 0, &timerCCInit);

 

  /* Select timer parameters */ 

  TIMER_Init_TypeDef timerInit =

  {

    .enable     = false,

    .debugRun   = true,

    .prescale   = timerPrescale4,//timerPrescale1024,

    .clkSel     = timerClkSelHFPerClk,

.fallAction = timerInputActionStart,

.riseAction =timerInputActionNone, //timerInputActionStop,

    .mode       = timerModeUp,

    .dmaClrAct  = false,

    .quadModeX4 = false,

    .oneShot    = false,

    .sync       = false,

  };

 

  /* Configure timer */

  TIMER_Init(TIMER0, &timerInit);

  

  while(1)

  {

    /* Go to EM1 */

EMU_EnterEM1();

 

  }

 

}


授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,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

【经验】基于EFM32JG1B200F128低功耗32位MCU中RTC在暂态录波型故障指示器无线采样三相同步设计方法

在JYL-60架空暂态录波型远传故障指示器项目开发过程中,考虑到架空线路ABC三相的特殊性,三支架空暂态录波型远传故障指示器分别挂在ABC线路上,无法提供可靠的硬件同步信号,在这样的环境下,无线三相同步技术正好提供了三相同步录波的可能。本文以EFM32JG1B200F128低功耗32位MCU中的RTC,设计了一种无线的三相同步采样方法。

设计经验    发布时间 : 2019-09-21

【经验】对使用SWD接口的32位MCU的内部闪存及用户画面进行编程

本文介绍Silicon Labs独立编程器的硬件与软件,以及详细的用户界面介绍,提供用户进行测试。

设计经验    发布时间 : 2019-03-07

【IC】芯科科技新品PG26 32位MCU系列,大容量存储 + 快速AI/ML推理满足未来的物联网需求

SILICON LABS最新发布的EFM32PG26(PG26)32位微控制器系列通过提升两倍的闪存和RAM容量,以及GPIO的数量来满足各种低功耗和高性能嵌入式物联网应用需求。面向无线连接功能的需求,PG26可作为EFR32xG26多协议无线SoC平台的软件兼容MCU版本,有助于开发人员基于同一平台设计快速且无缝地升级低功耗蓝牙、Matter、Thread、Zigbee或专有无线连接设计。

产品    发布时间 : 2024-04-17

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

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

设计经验    发布时间 : 2019-01-27

【IC】芯科科技新款32位MCU EFM32和EFM8功能升级,电流可低至1.03µA,小尺寸满足微型设备需求

芯科科技近期发布的新款32位MCU EFM32PG23和8位MCU EFM8BB50产品旨在通过更优化的设计架构来帮助开发人员加速产品原型设计。PG23和BB50不仅进一步扩大了Silicon Labs的MCU产品组合,并且利用小尺寸和低功耗设计满足各种微型、电池设备和物联网应用的需求。

新产品    发布时间 : 2023-04-13

【应用】基于低功耗32位MCU EFM32G2X的智能温控器节能解决方案

采用Silicon Labs的ARM Cortex-M3内核EFM32是全球最低功耗的32位MCU,外设丰富,5大超低模式,非常适用于智能温控器。无线WIFI模块采用WGM110,具有卓越的射频性能,并可提供远程范围的稳定无线连接和安全性。

方案    发布时间 : 2019-07-30

【经验】32位MCU EFM32ZG与5V系统连接的电平转换接口电路设计

Silicon Labs的EFM32ZG系列是超低功耗和低能耗的32位MCU,在与5V系统连接时,EFM32ZG的GPIO无法直接接到5V的GPIO上,长期工作有引起芯片损坏的风险。因此与5V系统连接时需要依靠外部的电平转换电路保证芯片的可靠工作。本文就将介绍其设计与注意事项。

设计经验    发布时间 : 2020-09-27

【应用】芯科单路电源1.98~3.8V的32位MCU助力消毒柜温湿度探头设计,主频24MHz

最近有一个客户是做温湿度探头的,最近他在找一款MCU是用来作为温湿度探头上面的主控,要求低功耗,性能好,在停止模式(EM3)下电流为0.5μA,32位的MCU,内置12位ADC和比较器,32kb的Flash和4kb的RAM,根据需求推荐芯科32位MCU EFM32ZG110F32-B-QFN24R,该MCU主频在24MHz。

应用方案    发布时间 : 2023-03-29

【经验】32位MCU EFM32 系列GPIO外部中断使用经验

Silicon Labs 32位MCU EFM32功耗低至 37 μA/MHz,封装尺寸小至 4 mm x 4 mm,拥有行业标准的ARM® Cortex®-M处理器的性能,这里重点介绍GPIO外部中断的使用。

设计经验    发布时间 : 2018-11-23

【应用】低功耗32位MCU EFM32,实现低成本医疗内窥镜

电子内窥镜少不了这一款逆天MCU-- EFM32,其集成的USB-HOST接口,结合Cortex-M4内核的高效运算能力以及DSP指令和浮点运算单元,能够很轻松执行图像处理任务,EFM32具有丰富的外设,为系统扩展功能及降低成本提供了条件。

新应用    发布时间 : 2019-07-15

【应用】芯科科技提供内置16位ADC的低功耗32位MCU助力蓝牙耳机,主频高达80MHz

蓝牙耳机的系统设计需要选型一款MCU,要求尺寸小,效率高,待机功耗低。本文推荐SILICON LABS推出的低功耗32位MCU EFM32PG23B210F256IM48-C,主频高达80MHz,具有DSP指令和浮点单元,具有性能灵活的16位的数转换器。

应用方案    发布时间 : 2023-03-14

【应用】功耗电流仅900nA的32位MCU在GPS定位器上的应用

相对于传统的8位、16位单片机实现的GPS追踪器,基于EFM32JG实现的本方案具有超低功耗、集成度高和扩展性良好的优势。

新应用    发布时间 : 2019-09-05

【经验】32位MCU EFM32JG系列RTCC定时器不能正常工作问题分析

Silicon Labs的32位MCU EFM32JG系列是针对低功耗电池产品推出的ARM Cortex-M3内核的主控单片机。最高可达40Mhz主频,低功耗模式下也可以进行ADC的采集、DMA的数据传输。本文通过分析一个客户在故障指示器的采集单元应用时遇到的时钟管理单元设置不正确导致模式不能定时切换的问题,来介绍时钟源的设置需要注意的事项。

设计经验    发布时间 : 2019-09-11

【应用】高算力低功耗32位MCU EFM32PG22C200F64IM32助力汽车仪表盘设计,功耗仅26μA/MHz

汽车仪表盘通过安装在车上各部位的传感器数据汇集到仪表盘上显示出来的。主要有发动机转速、车速、燃油位等相关信息,因为处理信息的复杂度及安全性的要求,对主控制芯片有较高的要求。本项目需要一款高算力低功耗的MCU,本文推荐芯科的控制器方案。

应用方案    发布时间 : 2022-12-11

展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:32 bit MCU

价格:¥89.2878

现货: 5,000

品牌:SILICON LABS

品类:开发套件

价格:¥735.8560

现货: 3

品牌:SILICON LABS

品类:32位MCU

价格:¥9.8488

现货: 21,867

品牌:SILICON LABS

品类:32 BIT MCU

价格:¥10.4057

现货: 17,600

品牌:SILICON LABS

品类:32位MCU

价格:¥12.9143

现货: 12,950

品牌:SILICON LABS

品类:32位MCU

价格:¥19.1398

现货: 10,450

品牌:SILICON LABS

品类:32位MCU

价格:¥24.8076

现货: 10,000

品牌:SILICON LABS

品类:32位MCU

价格:¥19.2326

现货: 8,740

品牌:SILICON LABS

品类:32位MCU

价格:¥9.6632

现货: 8,227

品牌:SILICON LABS

品类:32位MCU

价格:¥24.6211

现货: 6,200

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:兆易创新

品类:MCU

价格:¥7.0000

现货:25,380

品牌:MindMotion

品类:32位MCU

价格:¥5.9400

现货:19,996

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥61.8336

现货:17,200

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥16.7100

现货:15,887

品牌:NXP

品类:单片机

价格:¥90.8686

现货:10,811

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥69.9064

现货:7,680

品牌:MindMotion

品类:32位MCU

价格:¥2.3800

现货:6,427

品牌:RENESAS

品类:32BIT MCU

价格:¥135.5187

现货:4,320

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

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

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

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

低功耗测试

提供全面表征产品器件耗电特征及功耗波形、快速瞬态效应、电源优化、表征和仿真测试服务,使用直流电源分析仪测量精度达50µV,8nA,波形发生器带宽100kHz,输出功率300W,示波器200kHz,512 kpts

实验室地址: 深圳/苏州 提交需求>

查看更多

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

查看更多

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

查看更多

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

查看更多

授权代理品牌:电子材料

查看更多

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

查看更多

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

查看更多

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

查看更多

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

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

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

收藏
收藏当前页面