【经验】用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

暂无评论

相关推荐

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

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

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

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

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

设计经验    发布时间 : 2018-09-17

【经验】对使用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

在使用Si4438无线收发器的评估板做测试时,发现评估板上电以后,WDS无线开发软件无法识别到评估板的型号,并且评估板上的4个黄色LED亮起,评估板无法使用了,是什么故障?

出现WDS软件无法识别评估板的型号,并且4个黄色的LED亮起,最可能的原因就是MCU小板卡出现故障,可能的故障有两个:1、MCU损坏,这种情况需要更换一个型号同为C8051F930的MCU即可;2、MCU小板卡上的蓝色电感开路。这种情况更换这个电感即可。

技术问答    发布时间 : 2016-10-25

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

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

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

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

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

设计经验    发布时间 : 2019-01-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

【产品】EFM32JG和EFM32PG新型32位MCU具备活跃的待机模式,系统功耗再降50%

Silicon Labs推出了两大新型MCU Jade Gecko和Pearl Gecko。该两款MCU在前EFM32产品低功耗等优越特性的基础上,进一步优化了电源管理模式和内部结构。使整个系统的功耗降低了50%以上。

新产品    发布时间 : 2016-12-04

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

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

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

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

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

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

【应用】低功耗32位MCU在智能安防无线报警系统中的应用

芯科高性能低功耗的32位微控制器EFM32非常适合于智能安防系统的应用,其EFM32JG系列内核采用运算性能突出的Cortex-M3设计,极大地缩短了智能安防应用中的算法处理时间,提高了系统的性能。

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

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

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

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

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

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

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

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

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

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

展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:32MCU

价格:¥57.6978

现货: 6,379

品牌:SILICON LABS

品类:开发套件

价格:¥735.8560

现货: 3

品牌:SILICON LABS

品类:32位MCU

价格:¥9.8488

现货: 23,367

品牌:SILICON LABS

品类:32位MCU

价格:¥9.6632

现货: 19,113

品牌:SILICON LABS

品类:32 BIT MCU

价格:¥10.4057

现货: 17,600

品牌:SILICON LABS

品类:32位MCU

价格:¥12.9143

现货: 16,450

品牌:SILICON LABS

品类:32位MCU

价格:¥24.8076

现货: 15,000

品牌:SILICON LABS

品类:32位MCU

价格:¥19.2326

现货: 10,496

品牌:SILICON LABS

品类:32位MCU

价格:¥19.1398

现货: 10,450

品牌:SILICON LABS

品类:32位MCU

价格:¥9.0126

现货: 10,274

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:MindMotion

品类:32位MCU

价格:¥5.9400

现货:19,996

品牌:兆易创新

品类:MCU

价格:¥7.0000

现货:16,740

品牌:兆易创新

品类:MCU

价格:¥12.3200

现货:8,820

品牌:MindMotion

品类:32位MCU

价格:¥2.3800

现货:6,427

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:TI

品类:MCU

价格:¥124.3000

现货:2,872

品牌:航顺芯片

品类:32位MCU

价格:¥22.0000

现货:2,500

品牌:航顺芯片

品类:32位MCU

价格:¥4.1100

现货:2,500

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

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

收藏
收藏当前页面