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.

[参考译文] MSP430FR2422:禁用 SVS (在 LPM3.5模式下减少电流)

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/981248/msp430fr2422-disabling-the-svs-reducing-current-while-in-lpm3-5

器件型号:MSP430FR2422

尊敬的 TI 支持人员:

我使用 CCS 10.2.0对 MSP430FR2422进行编程。

此时运行演示代码"msp430fr2422_lpm3_5_01.c"、以成功进入 LPM3.5低功耗模式。
进行了一次修改、因为我没有连接外部晶振 XT1。
因此、RTC 的时钟源为 VLO。

在 LPM3.5模式下、我在2、5V 时测得的电流消耗为0.3uA。
这是一个很好的结果。

但数据表还指出:

'高侧监控器(SVSH)监督 DV CC。 默认情况下、它在所有功耗模式下都处于活动状态。 在 LPM3中、
LPM4、LPM3.5和 LPM4.5、可通过设置 SVSHE = 0将其禁用。"

现在、我想知道 LPM3.5中是否仍然可以通过禁用 SVS 来降低电流消耗?

我快速尝试将以下代码放入 main()例程中不起作用(或导致复位):

//通过设置 SVSHE = 0来禁用 SVS (电源电压监控器)

//打开 PMM 寄存器进行写访问
PMMCTL0_H = PMMPW_H;

PMMCTL0 &=~SVSHE;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;

您能否确认:可以禁用 SVS 以减小 LPM3.5中的电流? 如果是、我该怎么做? 正确的代码片段/位置是什么?

非常感谢!

此致
Stefan

 

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

    您好 Stefan、

    我将在24小时内回复。

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

    您好 Stefan、

    是的、您应该能够做到这一点。  那么、您说在禁用 SVS 后复位发生了吗?  您是否使用了正确的 PW (0xA500)?

     您能否将代码的大小减小到尽可能小的大小、但仍能演示此问题并附加到您的响应中。

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

    尊敬的 Dennis:

    是的、我检查了密码两次。 如您所见、我在 msp430fr2422.h 文件中使用了官方#define。 这里 是#define PMMPW_H  (0x00a5)、其中只有较高的16位将被写入 PMMCTL0 寄存器...  

    现在、我向您发送我的完整源代码、希望您发现一个错误。 :-)

    非常感谢(评论)!!!

    --------------------------------------

    #include

    void initGpio (void);
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD | WDTSSEL_VLOCLK; //停止 WDT、观察时钟源= VLO
    
    initGpio(); //配置 GPIO
    
    //首先确定我们是从 LPMx.5还是常规复位中退出。
    IF (SYSRSTIV = SYSRSTIV_LPM5WU) //从 LPM3.5唤醒时,重新启动
    {
    //如果 MCU 从 LPM3.5唤醒,请重新初始化,然后再次返回 LPM3.5。
    
    //从备份 RAM 存储器中恢复 P1OUT 值、在 LPMx.5复位后保持 P1OUT
    P1OUT =*(unsigned int *) BKMEM_BASE;
    
    _enable_interrupt (); // RTC 中断应立即触发...
    }
    其他
    {
    //器件从冷启动加电。
    //它配置器件并将器件置于 LPM3.5中
    
    //通过设置 SVSHE = 0来禁用 SVS (电源电压监控器)
    
    //打开 PMM 寄存器进行写访问
    PMMCTL0_H = PMMPW_H;
    
    //清除 SVSHE 位 PMMCTL0 &=~SVSHE; //锁定 PMM 寄存器以进行写访问 PMMCTL0_H = 0x00; //配置备份内存 *(unsigned int *) BKMEM_BASE = 0; //配置 RTC (时钟源= VLO) //每1024/10000 * 150 = 15、6秒发生一次中断和复位 RTCMOD = 150-1; RTCCTL = RTCSS_VLOCLK | RTCSR |RTCPS_1024; RTCCTL |= RTCIE; //在进入 LPM3.5前将 P1OUT 值存储在备用存储器寄存器中 *(unsigned int *) BKMEM_BASE = P1OUT; } //以5 SEK (~216uA @1MHz)的速度执行操作 _DELAY_CYCLES (5000000); //进入启用中断的 LPM3.5模式。 请注意、该操作确实执行了 //不返回。 LPM3.5将通过复位事件退出、从而产生 //重新启动代码。 PMMCTL0_H = PMMPW_H; //打开 PMM 寄存器进行写入 PMMCTL0_L |= PMMREGOFF; //并设置 PMMREGOFF _bis_SR_register (LPM3_bits | GIE); __no_operation();//仅用于调试(从未达到) 返回0; } void initGpio (void) { P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF; P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF; P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF; P4REN = 0xFF;P5REN = 0xFF;P6REN = 0xFF; P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00; P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00; //禁用 GPIO 上电默认高阻抗模式 //激活先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; } #pragma vector = RTC_vector __interrupt void RTC_ISR (void) { switch (__evo_in_range (RTCIV、RTCIV_RTCIF)) { 案例 RTCIV_NONE:break; //无中断挂起 案例 RTCIV_RTCIF: // RTC 溢出 //在 P1.0上切换 LED P1OUT ^= BIT0; //将 P1OUT 值存储在备用存储器寄存器中 *(unsigned int *) BKMEM_BASE = P1OUT; 中断; 默认值: 中断; } }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Stefan、

    请尝试此指令

           asm (" BIC.B #0x40、&PMMCTL0_L");

    而不是

    PMMCTL0_L |= PMMREGOFF;