您的位置:首页 > 其它

EFM32片内外设CMU -- 设置时钟输出

2017-08-28 17:30 288 查看
在有些场合情况下,特别是晶振起振不良的情况下,我们就需要测量晶体的起振情况.但是由于示波器的探头本身带有几个pF的电容,因此如果直接测量晶体的两根引脚的话,就很难测量出本身的起振情况了。毕竟我们的负载电容一般也就那么几十pF而已.

于是,在这种情况下,最好是通过其他方式来测量振荡波形.EFM32支持将低频或高频的振荡波形通过GPIO口输出.此时,透过GPIO来测量,就可以知道最原始的波形了。控制该功能的片内模块是EFM32的CMU(时钟管理)模块.

硬件准备:

在大多数型号上,低频振荡波形是通过PA1(#0)来输出的。高频振荡波形是通过PA2(#0)来输出的.所以用示波器测量即可.

软件准备: 通过条件编译来配置输出内部波形还是外部波形

#include <stdint.h>

#include <stdbool.h>

#include "efm32.h"

#include "efm32_chip.h"

#include "efm32_cmu.h"

#include "efm32_gpio.h"

#define OUTPUT_INTERNAL      1      //GPIO输出内部振荡波形

//#define OUTPUT_EXTERNAL      2    //GPIO输出外部晶振波形

int main(void)

{

  /* Chip errata */

  CHIP_Init();

#ifdef OUTPUT_INTERNAL

  CMU_HFRCOBandSet(cmuHFRCOBand_1MHz);

  CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO);//1MHz

  CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);//32KHz

#elif defined OUTPUT_EXTERNAL

  CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO);//32MHz

  CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFXO);//32KHz

#endif

  CMU_ClockEnable(cmuClock_GPIO,true);  //使能GPIO模块

  GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 1);  //将相应的GPIO口设置成输出,低频

  GPIO_PinModeSet(gpioPortA, 2, gpioModePushPull, 1);  //将相应的GPIO口设置成输出,高频

  

#ifdef OUTPUT_INTERNAL

  CMU->CTRL |= CMU_CTRL_CLKOUTSEL0_HFRCO + CMU_CTRL_CLKOUTSEL1_LFRCO;//CMU_CTRL_CLKOUTSEL0_HFXO; //配置为HFRCO输出

#elif defined OUTPUT_EXTERNAL

  CMU->CTRL |= CMU_CTRL_CLKOUTSEL0_HFXO + CMU_CTRL_CLKOUTSEL1_LFXO;

#endif

  

  //允许GPIO的复用功能,并且置位允许位

  CMU->ROUTE = CMU_ROUTE_CLKOUT0PEN | CMU_ROUTE_CLKOUT1PEN | CMU_ROUTE_LOCATION_LOC0;      

  while (1)

  {

      

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: