您好!
我尝试使用 VLO 操作 MCU 并关闭 FLL、DCO 和 REFO 模块以尽可能降低功耗、或 CPUOFF=0、SCG1=1、SCG0=1和 OSCOFF=1。 我已将 MCLK、ACLK 和 SMCLK 设置为从 VLO 运行、清除 DCOFFG、XT1OFFG 和 OFIFG 标志、然后使用_ bis_SR_register (SCG0+SCG1+OSCOFF)尝试关闭所有这些、但功耗没有明显变化。 但是、当在尝试设置 SCG0、SCG1和 OSCOFF 之前使用_bis_SR_register (CPUOFF)关闭 CPU 时、如果在禁用这些模块后设置这些位、则会显示预期的功耗下降。 换言之、只有关闭 CPU 不会导致明显的功耗变化、并且只有设置 SCG1、SCG0和 OSCOFF 才会导致明显的功耗变化、但将它们一起设置会导致功耗严重下降。 我的代码如下
#include <msp430.h>
#include <msp430fr2355.h>
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
P1DIR |= 0x01; // Set P1.0 to output direction
P1OUT = 0x00; // Disablee LED blinking
// Set all GPIOs to outputs pulled low
P2DIR |= 0x01;
P2OUT = 0;
P3DIR |= 0x01;
P3OUT = 0;
P4DIR |= 0x01;
P4OUT = 0;
P5DIR |= 0x01;
P5OUT = 0;
P6DIR |= 0x01;
P6OUT = 0;
PADIR |= 0x01;
PAOUT = 0;
PBDIR |= 0x01;
PBOUT = 0;
PCDIR |= 0x01;
PCOUT = 0;
RTCCTL &= ~RTCSS; // turn off RTC (no clock)
CSCTL6 |= XT1FAULTOFF; // turns off automatic fault switch ACLK to REFO
CSCTL4 |= (SELMS >> 1); // Set MCLK/SMCLK to VLO
//CSCTL5 |= SMCLKOFF; // turn off SMCLK
CSCTL4 &= ~SELA; // clear SELA bits
CSCTL4 |= SELA & (SELA << 1); // set ACLK source to VLO
CSCTL7 &= ~(XT1OFFG+DCOFFG); // clear XT1 and DCO fault flags
SFRIFG1 &= ~OFIFG; // clear oscillator fault interrupt flag [HAS TO BE DONE AFTER PREVIOUS LINE]
while((SFRIFG1 & OFIFG) && (CSCTL7 & XT1OFFG) && (CSCTL7 & DCOFFG));
__bis_SR_register(SCG0+SCG1+OSCOFF);
//__bis_SR_register(CPUOFF);
//LPM0;
unsigned int i = 0;
while(1) {
if (i % 10) {
P1OUT = 0x01;
}
else {
P1OUT = 0x00;
}
++i;
}
}
while 循环仅用于查看 CPU 是否处于开启状态或不是处于视觉状态。
