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

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

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

硬件准备:

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

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

#include
#include
#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)
  {
     
  }
}

你可能感兴趣的:(EFM32片内外设--CMU)