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.

[参考译文] CC430F5137:LPM3睡眠期间的功耗很高

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/707484/cc430f5137-the-power-consumption-during-lpm3-sleep-period-is-high

器件型号:CC430F5137

您好!

我的产品使用 CC430F5137、我们遇到了 LPM3模式期间有时发生的高电流消耗问题。 电流不会 回到 uA、而是在睡眠期间(LPM3)保持在1mA。  

根据 TI 发布的"SLAZ094X-2012年10月- 2018年5月修订版"中的 PMM11权变措施、我尝试设置"MCLK 在进入 LPM3之前被2分频"、但发现电流甚至更高。

下面是我的代码和产品的测量电流的一部分。

//make VLO (10kHz)作为 ACLK 的时钟源
UCSCTL4 = SELA_VLOCLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

LED_OFF

if (state!= State_RX_WOR)

STROBE (RF_Sidle);
选通(RF_SFRX);
选通(RF_SFTX);
选通(RF_SCAL);
while ((Strobe (RF_SNOP)& 0xF0)!= 0x00);

STATE = State_RX_WOR;

//设置2个前导码字节
WriteSingleReg (MDMCFG1、(rfSettings.mdmcfg1 & 0x8F));
//设置16位同步字(16/16)
WriteSingleReg (MDMCFG2、(rfSettings.mdmcfg2 & 0xf4)| 0x02);

//接收到数据包时应发生什么情况:
///RXOFF_MODE 和 TXOFF_MODE 处于空闲状态
WriteSingleReg (MCSM1、0x30);
//在数据包末尾禁用 CRC
WriteSingleReg (PKTCTRL0、(rfSettings.pktctrl0 &~0x04);
//禁用在有效载荷上附加 RSSI 和 LQI 信息
WriteSingleReg (PKTCTRL1、(rfSettings.pktctrl1 & 0xFB);

WriteSingleReg (PKTLEN、2);//设置数据包长度


T_WOR_1s = 72;//4sec


STROBE (RF_Sidle);
STROBE (RF_SPWD);//关闭射频

WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS2+WDTSSEL_2+WDTIS1;//1/16s
SFRIE1 |= WDTIE;//启用 WDT 中断

//设置 MCLK 除以2
// UCSCTL5 =(UCSCTL5 & 0xFFF0)| DIVM__2;
_bis_SR_register (LPM3_bits + GIE);//输入 LPM3并重新启用中断


// CPU 在这里休眠!
//设置 MCLK 除以32
// UCSCTL5 =(UCSCTL5 & 0xFFF0)| DIVM__32;

__delay_cycles (800ul);//等待
SFRIE1 ~WDTIE;//禁用 WDT 中断
//ACLK = XT1 (默认值)、SMCLK = DCOCLKDIV (默认值)、MCLK = DCOCLKDIV (默认值)
UCSCTL4 = SELA_XT1CLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;
//delay_cycles (x)在代码中停止并等待 x 个 MCLK 周期

//========================================================================
//处理挂起的唤醒标志
//========================================================================

 

将 MCLK 除以2之前测量的电流

将 MCLK 除以2后测得的电流

  这里是记录的电流:在 LPM3睡眠期间、电流不会回到 uA。 唤醒时间为2us。

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

    尊敬的 Derong:

    看起来、第三和第四个屏幕截图与前两个屏幕截图相同。 对于这些屏幕截图、操作看起来正常:睡眠、唤醒、返回睡眠。 在最后一个屏幕截图中、我可以看到器件似乎从 LPM3模式退出的位置、但我不确定其运行方式为何如此。 它似乎没有像第一个和第三个屏幕截图那样完全唤醒。

    在最后一个屏幕截图中、当电流达到1mA 时、是否应该将器件完全唤醒? 以时间单位表示的最低刻度是多少? 美国? 我怀疑这个问题是由一个勘误表引起的(很遗憾、它似乎很多)。 我建议从 CC430F5137的 LPM3代码示例之一开始、实施勘误权变措施并测量电流。 然后、开始逐个添加代码段、以查看导致这种奇怪启动行为的原因。

    cc430x513x_LPM3_1.c

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // CC430x513x 演示-进入 LPM3 (ACLK = LFXT1)
    //
    说明:配置 ACLK = LFXT1并进入 LPM3。 测量电流。
    //注:SVS (H、L)和 SVM (H、L)被禁用
    // ACLK = LFXT1 = 32kHz,MCLK = SMCLK =缺省 DCO
    //
    CC430x513x
    // --------
    // /|\| XIN|-
    // || | 32kHz
    // ---|RST XOUT|-
    // | |
    //
    M. Morales
    // Texas Instruments Inc.
    // 2009年4月
    //使用 CCE 生成版本:3.2.2和 IAR 嵌入式工作平台版本:4.11b
    //*********
    
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW+WDTHOLD; //停止 WDT
    
    P5SEL |= BIT0 + BIT1; //选择 XT1
    UCSCTL6 |= XCAP_3; //内部负载电容
    
    //循环直到 XT1、XT2和 DCO 稳定
    为止执行
    {
    UCSCTL7 &=~(XT1LFOFFG + DCOFFG);
    //清除 LFXT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1 & OFIFG); //测试振荡器故障标志
    
    UCSCTL6 &=~(XT1DRIVE_3); // XTAL 现在是稳定的,减少驱动
    //强度
    
    P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P5OUT = 0x00;
    P1DIR = 0xFF; P2DIR = 0xFF;P3DIR = 0xFF;P5DIR = 0x03;
    
    PJOUT = 0x00;
    PJDIR = 0xFF;
    
    //关闭 SVSH、SVSM
    PMMCTL0_H = 0xA5;
    SVSMHCTL = 0;
    SVSMLCTL = 0;
    PMMCTL0_H = 0x00;
    
    __bis_SR_register (LPM3_BITS); //输入 LPM3
    __NO_OPERATION (); //对于调试器
    } 

    此致、

    James

    MSP 客户应用

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

    抱歉、我上传了错误的图像文件。 正确答案如下所示:

    在最后一个屏幕截图中、器件应唤醒1ms、然后恢复睡眠。

    2018年5月发布的勘误表提到 CC430F5137中的一些错误会损坏 PC/SR 寄存器。 我已经与 IAR 联系、要求在编译器选项中添加一个标志。 他们应该告诉我添加标志是否可以解决问题。

    我还将使用 变通办法中建议的勘误表测试我的软件:

    1.添加标志  

    2. 设置 MCLK 除以2

    3. 使用 XT2作为 SMCLK 振荡器源

    我在17小时的测试记录中发现1mA 问题发生了5次、但1mA 的持续时间不及旧测试记录中的持续时间。

    这个周末、我将按照您的意见中的建议、通过添加"在进入 LPM3之前关闭 SVSH、SVSM "来测试代码、并在下周一发布测试结果。

    谢谢、

    德隆元

    Seabreeze 国际公司

    2018年7月13日

    很抱歉、我的笔记本电脑在这个周末进行了电源重置、因此我将再次运行测试。

    我测试了 PMM12权变措施中列出的内容、并发现如果使用 XT2作为 SMCLK 振荡器源而不是 DCO CC430F5137、则会消耗更多的功率。 因此、我别无选择、只能尝试在寄存器 UCSCTL8中启用 SMCLKREQEN 并再次运行测试。

    这是所有时钟控制寄存器的设置:
    ///----------------------------------
    /* MCU 时钟系统(UCS)初始化
    *-启动32768Hz 晶体振荡器 XT1
    *-将 FLL 配置为使用 XT 作为参考来生成8MHz 时钟
    *- MCLK = SMCLK = 244 * FXT1 = 7.995392MHz 来自 DCO/2。
    *
    UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
    UCSCTL4 = SELA_2+SELS_3+SELM_3;//ACLK = REFO、MCLK = SMCLK = DCOCLK。

    UCSCTL6 = XT2OFF & MSK_1 |//XT2关闭
    XT1OFF & MSK_1;// XT1关闭

    _bis_SR_register (SCG0);//禁用 DCO 的 FLL 拉取
    UCSCTL0 = 0x0000;//将 DCO 设定为最低抽头
    // FLL 循环2分频、FSYS/FXT1比率= 243+1 = 244
    UCSCTL2 = FLLD__2 | 243;
    UCSCTL1 = DCORSEL_5;//对于10..20MHz、我们运行 Fdco = 16MHz 并进行分频
    // x 2以确保时钟占空比= 50%、自此以来
    //我们在 PMMCOREV = 0时以8MHz 最大限制运行。
    _BIC_SR_register (SCG0);//重新启用 FLL 控制
    //最大 FLL 稳定延迟= 1024 * f_MCLK / f_FLLREF
    _delay_cycles (250000lu);

    bTimeout = 100;//最大尝试100ms
    //等待所有振荡器故障标志被清除
    while (SFRIFG1和 OFIFG)

    _DELAY_CYCLES (8000lu);//延迟~1ms
    //清除单个标志
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
    SFRIFG1 &=~OFIFG;//清除总和标志
    如果(--bTimeout ==0)

    //有问题
    Software_BOR_reboot



    //设置 UCSCTL8寄存器中的 SMCLKREQEN 位1:启用 SMCLK 条件请求
    UCSCTL8 |=SMCLKREQEN;

    //ACLK = XT1 (默认值)、SMCLK = DCOCLKDIV (默认值)、MCLK = DCOCLKDIV (默认值)
    UCSCTL4 = SELA_XT1CLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

    这是我的 PMM12测试结果
    使用 DCO 作为 SMCLK 振荡器源


    2.use XT2作为 SMCLK 振荡器源、而不是 DCO


    3.使用 DCO 作为 SMCLK 振荡器源,但将 UCSCTL8寄存器中的 SMCLKREQEN 位置位1:SMCLK 条件请求被使能

    我对您建议添加代码以关闭 SVSH 和 SVSM 有另一个问题、但我不知道代码是否应该被添加到软件的初始化过程中、此过程将只执行一次或者恰好在 LPM3指令之前执行、如下所示 这将在大环路中执行。
    //==================================================================================================================
    //主循环
    //==================================================================================================================
    while (1)

    CLRWDT_16

    //make VLO (10kHz)作为 ACLK 的时钟源
    UCSCTL4 = SELA_VLOCLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

    //关闭 SVSH、SVSM
    PMMCTL0_H = 0xA5;
    SVSMHCTL = 0;
    SVSMLCTL = 0;
    PMMCTL0_H = 0x00;

    //设置 MCLK 除以2
    UCSCTL5 =(UCSCTL5和0xFFF0)| DIVM__2;
    _bis_SR_register (LPM3_bits + GIE);//输入 LPM3并重新启用中断


    // CPU 在这里休眠!
    __delay_cycles (800ul);//等待
    //设置 MCLK 除以1  
    UCSCTL5 = UCSCTL5 & 0xFFF0;


    SFRIE1 ~WDTIE;//禁用 WDT 中断
    //ACLK = XT1 (默认值)、SMCLK = DCOCLKDIV (默认值)、MCLK = DCOCLKDIV (默认值)
    UCSCTL4 = SELA_XT1CLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

    //========================================================================
    //处理挂起的唤醒标志
    //========================================================================
    CLRWDT_16

    德隆元

    Seabreeze 国际公司

    2018年7月16日

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

    很抱歉、我的笔记本电脑在周末进行了电源重置、因此我将再次运行测试。

    但我在这里有一个关于 PMM12权变措施的问题:如果 SMCLK 使用 XT2作为振荡器源而不是 DCO 、将添加多少电流? 在当前软件中、我关闭了 UCSCTL6中的 XT1和 XT2。

    下面显示了 XT2被打开:

    ///----------------------------------
    /* MCU 时钟系统(UCS)初始化
    *-启动32768Hz 晶体振荡器 XT1
    *-将 FLL 配置为使用 XT 作为参考来生成8MHz 时钟
    *- MCLK = SMCLK = 244 * FXT1 = 7.995392MHz 来自 DCO/2。
    *
    UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
    //UCSCTL4 = SELA_2+SELS_3+SELM_3;//ACLK = REFO、MCLK = SMCLK = DCOCLK。
    UCSCTL4 = SELA_2+SELS_5+SELM_3;//ACLK = REFO、MCLK = DCOCLK。 SMCLK=XT2


    UCSCTL6 = XT2OFF & MSK_0 |//XT2打开  
    XT1OFF & MSK_1;// XT1关闭  

    _bis_SR_register (SCG0);//禁用 DCO 的 FLL 拉取
    UCSCTL0 = 0x0000;//将 DCO 设定为最低抽头
    // FLL 循环2分频、FSYS/FXT1比率= 243+1 = 244
    UCSCTL2 = FLLD__2 | 243;  
    UCSCTL1 = DCORSEL_5;//对于10..20MHz、我们运行 Fdco = 16MHz 并进行分频
    // x 2以确保时钟占空比= 50%、自此以来
    //我们在 PMMCOREV = 0时以8MHz 最大限制运行。
    _BIC_SR_register (SCG0);//重新启用 FLL 控制
    //最大 FLL 稳定延迟= 1024 * f_MCLK / f_FLLREF
    _delay_cycles (250000lu);  

    bTimeout = 100;//最大尝试100ms
    //等待所有振荡器故障标志被清除
    while (SFRIFG1和 OFIFG)  

    _DELAY_CYCLES (8000lu);//延迟~1ms
    //清除单个标志
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);  
    SFRIFG1 &=~OFIFG;//清除总和标志
    如果(--bTimeout ==0)

    //有问题
    Software_BOR_reboot  
    }  

    //ACLK = XT1 (默认值)、SMCLK = DCOCLKDIV (默认值)、MCLK = DCOCLKDIV (默认值)  
    UCSCTL4 = SELA_XT1CLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

    另一个问题是关闭 SVSH 和 SCSM 指令在 硬件初始化中执行一次、或者在主循环中的 LPM3指令之前执行一次循环、如下所示?

    //==================================================================================================================
    //主循环
    //==================================================================================================================

    while (1)

    CLRWDT_16

    //make VLO (10kHz)作为 ACLK 的时钟源
    UCSCTL4 = SELA_VLOCLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;

    WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS2+WDTSSEL_2+WDTIS1;//1/16s
    SFRIE1 |= WDTIE;//启用 WDT 中断  

    //关闭 SVSH、SVSM
    PMMCTL0_H = 0xA5;
    SVSMHCTL = 0;
    SVSMLCTL = 0;
    PMMCTL0_H = 0x00;

    //设置 MCLK 除以2
    UCSCTL5 =(UCSCTL5和0xFFF0)| DIVM__2;
    _bis_SR_register (LPM3_bits + GIE);//输入 LPM3并重新启用中断


    // CPU 在这里休眠!
    __delay_cycles (800ul);//等待
    //设置 MCLK 除以32
    UCSCTL5 = UCSCTL5 & 0xFFF0;


    SFRIE1 ~WDTIE;//禁用 WDT 中断
    //ACLK = XT1 (默认值)、SMCLK = DCOCLKDIV (默认值)、MCLK = DCOCLKDIV (默认值)
    UCSCTL4 = SELA_XT1CLK + SELESS__DCOCLKDIV + SELM_DCOCLKDIV;
    //delay_cycles (x)在代码中停止并等待 x 个 MCLK 周期

    //========================================================================
    //处理挂起的唤醒标志
    //========================================================================
    CLRWDT_16

    谢谢、

    德隆元

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

    我之前共享的代码示例似乎只是进入 LPM3并保持在那里。 我只是想让您在您的器件上尝试一下、看看电流消耗是多少。 遗憾的是、该器件有很多勘误表、尤其是 PMM。 由于有许多不同的配置、请仔细查看每个勘误表、并验证您所做的工作是否适用于这些勘误表。

    此外,在发布代码时,请使用语法 Highlighter 工具(类似于" ")找到"插入代码、附加文件等..." 单击"回复"按钮后显示的链接。 它使代码可读性更高。 此外、对于所有注释掉的代码、这会使读取代码变得更加困难。

    此致、

    James

    MSP 客户应用