大家好、
我在使 MCU 进入 LPM3或更低电压的情况下遇到问题。
我复制了 TI 作为 LPM3.5示例代码提供的代码。 (下面提供了代码)
在独立模式下、MCU 与所有器件完全断开。 甚至连到可编程器件的跳线也会断开连接。
在这种情况下、MCU 由外部源通过3.3V 电源引脚供电。 在串行线路上、高分辨率测高计被连接。 (作为电流表、分辨率为1纳安)
电流抑制持续在2mA 左右。 (即使在 LPM3.5中、它的电流仍远低于1微安)
因此、在这种情况下、MCU 根本不进入(很可能) LPM、或者有其他东西。
感谢您的任何帮助。
谢谢你。
#include
void Board_Init (void);
void RTC_Init (void);
void EnterLPM35 (void);
void WakeUpLPM35 (void);
volatile unsigned i;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
Board_Init(); // GPIO 和 CS 的常规初始化代码
while (1)
{
EnterLPM35(); //此函数不会返回。
}
//}
}
void Board_Init (void)
{
//端口配置
P1OUT = 0;
P1DIR = 0xFF;
P2OUT = 0;
P2DIR = 0xFF;
P3OUT = 0;
P3DIR = 0xFF;
P4OUT = 0;
P4DIR = 0xFF;
P5OUT = 0;
P5DIR = 0xFF;
P6OUT = 0;
P6DIR = 0xFF;
P7OUT = 0;
P7DIR = 0xFF;
P8OUT = 0;
P8DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//设置时钟
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 ACLK = XT1;MCLK = DCO
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1; //将所有分频器设置为1
CSCTL4 &=~LFXTOFF; //启用 LFXT1
操作
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1 & OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器
}
void EnterLPM35 (void)
{
PMMCTL0_H = PMMPW_H; //打开 PMM 寄存器进行写入
PMMCTL0_L |= PMMREGOFF; //并设置 PMMREGOFF
//进入启用中断的 LPM3.5模式。 请注意、该操作确实执行了
//不返回。 LPM3.5将通过复位事件退出、从而产生
//重新启动代码。
_bis_SR_register (LPM3_bits | GIE);
}
空 WakeUpLPM35 (空)
{
//恢复端口设置
P1OUT = 0x00;
P1DIR = 0xFF;
P2OUT = 0x00;
P2DIR = 0xFF;
P3OUT = 0x00;
P3DIR = 0xFF;
P4OUT = 0x00;
P4DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
//重新配置/启动 RTC
RTCCTL0_H = RTCKEY _H; //解锁 RTC 密钥保护寄存器
RTCCTL0_L |= RTCTEVIE; //为每分钟启用 RTC 事件中断
RTCCTL1 = RTCBCD | RTCHOLD | RTCTEV__min;// BCD 模式、RTC 保持
RTCCTL1 &=~RTCHOLD;
RTCCTL0_H = 0; //锁定受 RTC 密钥保护的寄存器
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置。 这也将重新激活 RTC
//设置。
PM5CTL0 &=~LOCKLPM5;
//恢复时钟以便读取 RTC
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 ACLK = XT1;MCLK = DCO
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1; //将所有分频器设置为1
CSCTL4 &=~LFXTOFF; //启用 LFXT1
操作
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器
}