在有些场合情况下,特别是晶振起振不良的情况下,我们就需要测量晶体的起振情况.但是由于示波器的探头本身带有几个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)
{
}
}