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)
{
}
}
于是,在这种情况下,最好是通过其他方式来测量振荡波形.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)
{
}
}
相关文章推荐
- EFM32片内外设CMU -- 设置时钟输出
- EFM32片内外设--CMU之超频测试
- 设置外设时钟使能时钟
- [原创]RX801SJ 实时时钟RTC调试纪要 : 时钟输出设置
- EFM32片内外设--CMU之MCU跑在32KHz
- openwrt+Linkit7688+WM8960:WM8960下I2S的REFCLK的时钟输出设置
- [原创]RX801SJ 实时时钟RTC调试纪要 : 时钟输出设置
- EFM32片内外设Timer之PWM输出
- 采购订单保存立即输出设置
- C++设置输出小数位数方法
- Petshop详解(五): petshop输出缓存设置
- linux中设置shell输出样式
- Quartus 11中,设置未用到的空引脚为高阻态,防止上电即输出高电平或低电平
- 设置java输出文本文件时的编码
- MSP430主系统时钟以及430的低功耗设置
- 为不同的 Appender 设置日志输出级别:
- mfc应用程序通过设置选项来出现console控制台输出窗口
- EFM32片内外设--LEUart高波特率测试
- 不输出错误消息 drupal 后台设置
- bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理