在有些場合情況下,特別是晶振起振不良的情況下,我們就需要測量晶體的起振情況.但是由於示波器的探頭本身帶有幾個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)
{
}
}