This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:未进入 LPM3 (LMPx.5)!

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430FR5994

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/650816/msp430fr5994-not-entering-lpm3-lmpx-5

器件型号:MSP430FR5994

大家好、

我在使 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 寄存器

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    要对此进行调试、请回答以下几个问题:

    • 您是否正在使用 MSP430FR5994 LaunchPad? 或者您是否正在使用另一个电路板?
    • 您是否还可以使用活动模式以及 LPM3 (非 LPM3.5)来测量您的设置所消耗的电流? 这将有助于确定问题是进入 LPM3.5还是其他问题。

    此外、由于您尝试达到数据表中的电流电平、我建议您在调试这些功率值时使用 Vcc = 3.0V 以保持一致。

    此致、

    Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好、Nathan、

    是的、我使用的是 MSP430FR5994 Launchpad。

    2.工作模式(16MHz)下的电流消耗约为2.3mA。 LPM3模式(LPM 3.5在系统设置中仅略有不同)也约为2.3mA。 (VCC = 3.3V)这就是我认为 MCU 根本不进入 LPM 的原因。 即使系统配置正确、并且有一条命令可进入 LPM 模式。

    我不希望获得规格中所示的结果、但我获得的结果与规格中所述的结果完全不同。

    此致、

    斯拉德詹

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sladjan、

    当我尝试运行您的代码时、我测量的电流约为0.2mA、因此我想知道您的设置是否存在导致此更高测量值的不同情况。 为了澄清这一点、从 LaunchPad 上移除了所有跳线、并且您将 DMM 与3V3引脚上的电源串联、对吧? 此外、要检查一下、您是否对 LaunchPad 进行了任何硬件更改?

    无论怎样,我都同意这些数字远高于应有的数字。 调试这种情况时、首先要做的是确定器件是否真正进入 LPM3.5。 首先、在 while (1)循环(在 EnterLPM35调用之后)中暂停调试器、并检查 PMMCTL0寄存器、确保位4 (PMMREGOFF)已置位。 这意味着系统进入 LPMx.5。 接下来、请确保在状态寄存器中设置以下位、以验证器件是否已进入 LPM3:
    #define CPUOFF (0x0010)
    #define SCG0 (0x0040)
    #define SCG1 (0x0080)

    如果这些寄存器都正确设置、则器件处于 LPM3.5模式、其他器件会意外地消耗功率。

    此致、
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nathan、

    是的、在测量过程中会从电路板上移除所有跳线、是的 DMM 在电源引脚(3.3V)上串联。

    不、对 LaunchPad 没有进行任何更改。

    当我在调试器中暂停寄存器时、情况如下:

    PMMREGOFF = 0、

    CPUOFF = 1、

    SCG0 = 1、

    SCG1 = 1。

    当我尝试在指令转至 LPM3.5 (_bis_SR_register (LPM3_bits | GIE);)之前手动设置 PMMREGOFF 时、程序会卡在那里。

    但是、无论采用哪种方法、当他获得进入 LPM3.5的指令时、他都应该自己执行该操作。

    有趣的是、当我使用调试器时、他总是在__ bis_SR_register (LPM3_bits | GIE)行中;

    在中断点之后设置中断点或尝试在调试器中使用单步执行不起作用。

    但是、似乎大多数位都是良好设置的。 不是 PMMREGOFF。

    此致、

    斯拉德詹

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nathan、

    是的、在测量过程中会从电路板上移除所有跳线、是的 DMM 在电源引脚(3.3V)上串联。

    不、对 LaunchPad 没有进行任何更改。

    当我在调试器中暂停寄存器时、情况如下:

    PMMREGOFF = 0、

    CPUOFF = 1、

    SCG0 = 1、

    SCG1 = 1。

    当我尝试在指令转至 LPM3.5 (_bis_SR_register (LPM3_bits | GIE);)之前手动设置 PMMREGOFF 时、程序会卡在那里。

    但是、无论采用哪种方法、当他获得进入 LPM3.5的指令时、他都应该自己执行该操作。

    有趣的是、当我使用调试器时、他总是在__ bis_SR_register (LPM3_bits | GIE)行中;

    在中断点之后设置中断点或尝试在调试器中使用单步执行不起作用。

    但是、似乎大多数位都是良好设置的。 不是 PMMREGOFF。

    此致、

    斯拉德詹

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sladjan、

    您看到调试器始终位于设置 LPM3位的行的原因是、一旦器件进入 LPM3、CPU 将被关闭、因此在 CPU 从中断唤醒之前、您将不会看到任何代码执行 (当前代码中没有任何代码)。 这是预期行为。

    请在此处查看另一个线程、用户在 LPM3中看到 MSP430FR5994的电流大约为2mA: e2e.ti.com/.../542922

    我使用该帖子中提到的功率分析仪运行了您的代码、我还看到大约700nA。 您的万用表额定电流是否为几百纳安? 即使您的分辨率足够好、如果 DMM 无法测量足够低的电流、也不会准确。 由于您看到的测量结果与在活动模式下看到的测量结果类似、我怀疑这是您的问题。

    此致、
    Nathan