记得以前有测试过EFM32采用32KHz时钟做为主频时的功耗,但是前几天想再翻一下测试记录,才发现不知道以前是没有做过测试呢还是未留下数据,反正是找不出出来了。算了,再来一次吧。
硬件平台还是选择TG的STK,代码如下:
void main(void)
{
CHIP_Init()
CMU_ClockSelectSet(cmuClock_HF, cmuSelect_LFRCO);
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortD, 7, gpioModePushPull, 0);
while(1)
{
unsigned long ulDelay = 3000;
while(ulDelay--);
GPIO_PinOutToggle(gpioPortD, 7);
}
}
用eA Profiler一看,哇靠,功耗竟然有144uA。心想应该不至于吧,那么大。如下图所示,感觉是不是哪里没有配置好或则什么没关。高的部分是点灯造成的。暂时先不管。
从程序运行的效果上来说,这盏灯每隔大约1秒多闪烁一次,程序里面的Delay为3000,应该差不多。说明MCU是以32KHz的频率在运行。因此将注意力转移至是否是什么外设没有关闭。仔细对比eMode的例程,终于醒悟到,应该是HFRCO没有关闭吧。于是修改一下代码:
void main(void)
{
CHIP_Init();
CMU_ClockSelectSet(cmuClock_HF, cmuSelect_LFRCO);
/* Disable HFRCO */
CMU_OscillatorEnable(cmuOsc_HFRCO, false, true);
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortD, 7, gpioModePushPull, 0);
while(1)
{
unsigned long ulDelay = 3000;
while(ulDelay--);
GPIO_PinOutToggle(gpioPortD, 7);
}
}
再次用eA Profiler测试,功耗竟然只有40uA左右。足足少了100uA啊。那100uA应该就是HFRCO振荡器本身的功耗了。于是查Datasheet中有关HFRCO的描述:HFRCO在不同的频率下会消耗不同的电,14MHz下面大约消耗77uA。77uA是3V,25度下面的正常值,而目前大约是100uA。
鉴于这样的思路,那么如果我不关闭HFRCO,但是将HFRCO设置到1MHz的话,那么也应该能够获得一个较低的功耗吧。测试一下:
void main(void)
{
CHIP_Init();
/*Set HFRCO to 1Mhz*/
CMU_HFRCOBandSet(cmuHFRCOBand_1MHz);
CMU_ClockSelectSet(cmuClock_HF, cmuSelect_LFRCO);
/* Disable HFRCO */
CMU_OscillatorEnable(cmuOsc_HFRCO, false, true);
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortD, 7, gpioModePushPull, 0);
while(1)
{
unsigned long ulDelay = 3000;
while(ulDelay--);
GPIO_PinOutToggle(gpioPortD, 7);
}
}
呵呵,果然,测试出来的结果是,功耗大约在66uA。查看Datasheet,HFRCO在1MHz下面的静态功耗大约为22uA。 而测量的结果是多了66-40=26uA。 还是蛮符合的。