我们目前使用的MCU+cc1120无线数据采集方案,在所有外围模块增加上的时候,如果不配置时钟,直接用f5229默认的时钟,进入休眠lpm3,测试共耗时,显示平均电流60ua至80ua之间,这个值比较理想,
但是在后续正常工作是测试,由于要使用ds18b20,需要精确到1us的定时,因此我们配置了时钟8MHz,源码如下,在测试的时候,只有单片机f5229时,把内部时钟配置成8MHz,然后休眠下去,测试时平均电流是180ua 差距很大啊,如果把我们的所有外围电路都加上,时钟配置内部8M测试平局休眠电流450ua,这个稍微有点高,不知道能否用内部默认时钟来操作ds18b20,由于是one wire 操作,对时序要求严格,所以不得不把时钟频率提高,不知道有没有什么好的解决办法了,
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//内部时钟源
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 |= FLLD_1 + 249; // Set DCO Multiplier for 8MHz
// (N + 1) * FLLRef = Fdco
// (249 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
__delay_cycles(250000);
// Loop until XT1,XT2 & DCO stabilizes – In this case only DCO has to stabilize
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL4 |= SELA_3; // ACLK = DCOCLK(17M)
UCSCTL5 |= DIVA_1; // ACLK/2(8.5M)
UCSCTL4 |= SELS_3; // SMCLK = DCOCLK(8M)
UCSCTL5 |= DIVS_3; // SMCLK/8(1M)
UCSCTL4 |= SELM_3; //MCLK = DCOCLK(8M)
__bis_SR_register(GIE); // open IE
__no_operation();
}
灰小子:
可以在不工作的时候切换到较低频率的时钟,工作室切换到8MHz。
另外,低功耗产品的硬件设计也是有讲究的。需要尽量把外围电路在不需要工作时做到断电状态
zhanfeng dong:
回复 灰小子:
目前我们也是这么考虑的,如果配置时钟上电的话,进入休眠,整个板子在100ua以内,这个已经是比较理想的了,但是由于使用了ds18b20,需要高精度定时,不得不使用高频clk,所以在修面前又重新初始化时钟值默认,但是没有起到效果,不知道那里出了问题,可否详细讲解一下430 clk切换,是不是有一些特定切换方式或者。。。。。
thanks a lot!