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.

[参考译文] LAUNCHXL-CC1310:如何降低 cc1310睡眠模式下的电压?

Guru**** 2531950 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1394283/launchxl-cc1310-how-to-lower-the-voltage-in-cc1310-sleep-mode

器件型号:LAUNCHXL-CC1310
Thread 中讨论的其他器件:CC1310

工具与软件:

你(们)好
我目前正在使用"CC1310 LAUNCHXL 套件"进行开发、我在开发过程中有一个问题。 在 CC1310中、我进入睡眠模式、我使用这种方法插入调试线并测量电流、同时测量2.5mA、但当我拔下调试线并测量电流时、测量了0.4mA。 但是、当我查看 TI CC1310数据表时、发现在睡眠模式下应测量0.7 uA。 我的问题是、我目前使用"Power_releaseConstraint (PowerCC26XX_SB_disallow)"作为进入睡眠模式的代码;
POWER_setConstraint (PowerCC26XX_RETAIN_VIMS_CACHE_IN_STANDBY);
PowerCC26XX_standbyPolicy ();"我编写了此代码、但有更好的方法吗? and "Power_sleep (PowerCC26XX_STANDBY);"和"Power_releaseConstraint (PowerCC26XX_SB_disallow);"我想知道这两个代码之间的区别、是否可以使用 Power_setConstraint (PowerCC26XX_IDLE_PD_disallow);当我声明使用类似上述代码的待机模式时?
除了上述方法外、您是否有任何代码指令可将 CC1310的当前值降低到接近睡眠模式?

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

    尊敬的 Susung:

    1.请注意、电源驱动器会跟踪正在进行的所有操作、并在没有活动任务时使设备进入睡眠状态。 因此、没有直接向电源驱动器发出使器件进入睡眠状态的命令。 相反、你应该使用 Task_sleep、Semaphore_pend 或类似命令来告诉调度程序没有发生任何情况。

    2.我们有一个关于电源驱动程序的大文档,将告诉你所有的细节。  

    https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_41_00_17/docs/rflib/html/_r_f_c_c26_x2_8h.html

    3.您可以打开一个默认示例,例如驱动程序空示例,并测量电流吗? 如果您查看代码、就会看到主文件指定了要使用的电源策略、就是这样。 除非有具体用例、否则无需在运行时设置或释放约束。  

    4.我们有一个关于电流消耗的应用说明。 请看一下:

    https://www.ti.com/lit/swra478

    谢谢、

    Marie H.

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

    感谢您的答复。 经过进一步研究、我发现在 TI 的 CC1310上没有其他说明进入 DEEPSLEEP 模式。 当我进入"Power_Sleep (PowerCC26XX_STANDBY);"时、它通过约束掩码依次执行"PowerCC26XX.c"文件中的代码以进入 DEEPSLEEP 模式、但当我现在正在调试代码时、代码将在 PRCMDEEPSLEEP ()函数中终止。 目前、我的电流值是在测量00.8mA 时测量它。 对于如何解决此问题、您有什么建议吗?

    译文:DeepL.com (免费版)

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

    尊敬的 Susung:

    如果您的设备卡在  PRCMDeepSleep (),这是一个很好的迹象!

    您如何测量功耗? 您能否发布您的设置的图片?

    谢谢、

    Marie H.

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

    我进一步修改了代码、并在 main.c 文件的 main 函数中添加了 Power_releaseConstraint (PowerCC26XX_SB_disallow)
    POWER_setConstraint (PowerCC26XX_RETAIN_VIMS_CACHE_IN_STANDBY)
    PowerCC26XX_standbyPolicy ()
    如果您进行此声明并通过 CCS 运行调试、您将看到 PowerCC26XX_tirtos。 C 文件、执行"PowerCC26XX_standbyPolicy ()"函数、但由于我在 main 函数中解锁了 standbymode 电源限制、因此从 else 语句执行代码、从" if (Time > Power_getTransitionLatency (PowerCC26XX_STANDBY、Power_Total))"部分执行代码、因此条件不满足、所以它进入空闲模式、而代码在 PRCMDeep ()处执行。 我的问题是
    1.此代码的流程现在是否正常?
    2.我不知道在待机模式下、是否满足以上条件。
    3.为什么我卡在 PRCMDeepSleep ()函数中? 这意味着器件卡在 PRCMDeepSleep ()中是一个很好的迹象?
    4. Power_sleep (PowerCC26XX_STANDBY);待机模式和空闲模式器件是否可以进入深度睡眠模式?

    ____________________________________________

    void PowerCC26XX_standbyPolicy (void)

    bool justIdle = true;
    uint32_t 约束;
    uint32_t 节拍;
    uint32_t time;

    /*禁用中断*/
    CPUcpsid();

    /*检查运行条件、最佳选择 DCDC 与 GLDO */
    SysCtrl_DCDC_VoltageConditionalControl();

    /*查询声明的约束*/
    约束= Power_getConstraintMask ();

    /*快速检查是否仅允许 WFI;如果是、则立即执行*/
    if ((约束&
    ((1 << PowerCC26XX_disallow_standby)|(1 << PowerCC26XX_disallow_idle)))=
    ((1 << PowerCC26XX_disallow_standby)|(1 << PowerCC26XX_disallow_idle))){

    PRCMSleep();

    }
    /*
    *检查是否允许自动激活任何睡眠模式
    */
    否则{

    /*检查是否允许我们进入待机状态*/
    如果((约束条件和(1 << PowerCC26XX_disallow_standby))= 0){


    ticks = Clock_getTicksUntilInterrupt ();

    /*将刻度转换为 usec */
    时间=节拍* Clock_tickPeriod;

    如果(Time > Power_getTransitionLatency (PowerCC26XX_STANDBY、Power_Total)){
    /*安排唤醒事件*/
    tick—= PowerCC26XX_WAKEDELAYSTANDBY / Clock_tickPeriod;

    if (PowerCC26XX_CONFIG.enableMaxStandbyDuration){
    /*如果请求、安排提前唤醒。 */
    if (tick > PowerCC26XX_CONFIG.maxStandbyDuration){
    节拍= PowerCC26XX_CONFIG.maxStandbyDuration;
    }
    }

    CLOCK_setTimeout (Clock_Handle (((Clock_Struct *)&PowerCC26XX_MODULE.clockObj)、tick);
    CLOCK_START (Clock_Handle ((Clock_Struct *)&PowerCC26XX_MODULE.clockObj));

    /*进入待机模式*/
    POWER_SLEEP (PowerCC26XX_STANDBY);
    CLOCK_STOP (Clock_Handle ((Clock_Struct *)&PowerCC26XX_MODULE.clockObj));
    justIdle = false;
    }
    }

    /*空闲(如果允许)*/
    if (JustIdle){


    如果((约束条件和(1 << PowerCC26XX_disallow_idle))= 0){
    uint32_t modeVIMS;
    /* 1. 获取当前 VIMS 模式*/
    执行{
    modeVIMS = VIMSModeGet (VIMS_BASE);
    } while (modeVIMS == VIMS_MODE_CHANGE);

    /* 2. 将闪存配置为空闲或非空闲状态下保持开启状态、如果将 VIMS 配置为 GPRAM */、则保持开启状态
    如果((约束条件和(1 << PowerCC26XX_NEED_FLASH_IN_IDLE))||
    (modeVIMS == VIMS_MODE_DISABLED)){
    HWREG (PRCM_BASE + PRCM_O_PDCTL1VIMS)|= PRCM_PDCTL1VIMS_ON;
    }
    否则{
    HWREG (PRCM_BASE + PRCM_O_PDCTL1VIMS)并且=~PRCM_PDCTL1VIMS_ON;
    }

    /* 3. 在 IDLE 中*/、始终保持高速缓存保留打开
    PRCMCacheRetentionEnable();
    /* 4. 关闭 CPU 电源域*/
    PRCMPowerDomainOff (PRCM_DOMAIN_CPU);
    /* 5. 确保所有可能的未完成 AON 写入完成*/
    SysCtrlAonSync();

    /* 6. 输入 IDLE */
    PRCMDeepSleep ();

    /* 7. 确保唤醒后 MCU 和 AON 同步*/
    SysCtrlAonUpdate();
    }
    否则{
    PRCMSleep();
    }
    }
    }


    CPUcpsie();
    }

    ____________________________________________

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

    尊敬的 Susung:

    1.是的,这是正常的。

    2.我不明白这个问题。

    3.这是进入深度睡眠的 API 调用。 您的器件处于待机状态。 (由于您连接了调试器、因此不允许器件进入待机状态、但从器件的角度来看、这表明器件处于待机状态。)

    4.否、无需调用电源驱动程序 API 即可使设备进入待机状态。 当空闲任务正在运行时、即没有其他正在运行的任务时、器件进入待机状态。

    谢谢、

    Marie H.

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

    ==================================================

    void PowerCC26XX_standbyPolicy (void)

    bool justIdle = true;
    uint32_t 约束;
    uint32_t 节拍;
    uint32_t time;

    /*禁用中断*/
    CPUcpsid();

    /*检查运行条件、最佳选择 DCDC 与 GLDO */
    SysCtrl_DCDC_VoltageConditionalControl();

    /*查询声明的约束*/
    约束= Power_getConstraintMask ();

    /*快速检查是否仅允许 WFI;如果是、则立即执行*/
    if ((约束&
    ((1 << PowerCC26XX_disallow_standby)|(1 << PowerCC26XX_disallow_idle)))=
    ((1 << PowerCC26XX_disallow_standby)|(1 << PowerCC26XX_disallow_idle))){

    PRCMSleep();

    }
    /*
    *检查是否允许自动激活任何睡眠模式
    */
    否则{

    /*检查是否允许我们进入待机状态*/
    如果((约束条件和(1 << PowerCC26XX_disallow_standby))= 0){

    ticks = Clock_getTicksUntilInterrupt ();

    /*将刻度转换为 usec */
    时间=节拍* Clock_tickPeriod;
    <1>
    如果(Time > Power_getTransitionLatency (PowerCC26XX_STANDBY、Power_Total)){
    /*安排唤醒事件*/
    tick—= PowerCC26XX_WAKEDELAYSTANDBY / Clock_tickPeriod;

    if (PowerCC26XX_CONFIG.enableMaxStandbyDuration){
    /*如果请求、安排提前唤醒。 */
    if (tick > PowerCC26XX_CONFIG.maxStandbyDuration){
    节拍= PowerCC26XX_CONFIG.maxStandbyDuration;
    }
    }

    CLOCK_setTimeout (Clock_Handle (((Clock_Struct *)&PowerCC26XX_MODULE.clockObj)、tick);
    CLOCK_START (Clock_Handle ((Clock_Struct *)&PowerCC26XX_MODULE.clockObj));

    /*进入待机模式*/
    POWER_SLEEP (PowerCC26XX_STANDBY);
    CLOCK_STOP (Clock_Handle ((Clock_Struct *)&PowerCC26XX_MODULE.clockObj));
    justIdle = false;
    }
    }

    /*空闲(如果允许)*/
    if (JustIdle){


    如果((约束条件和(1 << PowerCC26XX_disallow_idle))= 0){
    uint32_t modeVIMS;
    /* 1. 获取当前 VIMS 模式*/
    执行{
    modeVIMS = VIMSModeGet (VIMS_BASE);
    } while (modeVIMS == VIMS_MODE_CHANGE);
    <2>
    /* 2. 将闪存配置为空闲或非空闲状态下保持开启状态、如果将 VIMS 配置为 GPRAM */、则保持开启状态
    如果((约束条件和(1 << PowerCC26XX_NEED_FLASH_IN_IDLE))||
    (modeVIMS == VIMS_MODE_DISABLED)){
    HWREG (PRCM_BASE + PRCM_O_PDCTL1VIMS)|= PRCM_PDCTL1VIMS_ON;
    }
    否则{
    HWREG (PRCM_BASE + PRCM_O_PDCTL1VIMS)并且=~PRCM_PDCTL1VIMS_ON;
    }

    /* 3. 在 IDLE 中*/、始终保持高速缓存保留打开
    PRCMCacheRetentionEnable();
    /* 4. 关闭 CPU 电源域*/
    PRCMPowerDomainOff (PRCM_DOMAIN_CPU);
    /* 5. 确保所有可能的未完成 AON 写入完成*/
    SysCtrlAonSync();

    /* 6. 输入 IDLE */
    PRCMDeepSleep ();

    /* 7. 确保唤醒后 MCU 和 AON 同步*/
    SysCtrlAonUpdate();
    }
    否则{
    PRCMSleep();
    }
    }
    }


    CPUcpsie();
    }

    ==================================================

    那么、如果您是说我因为连接了调试器而无法进入待机模式、是因为 CCS 正在单步执行代码进行调试、我正在查看代码的执行顺序、在"PowerCC26XX_StandbyPolicy ()"函数中、代码会执行到<1>、然后进入[2]、这是空闲模式? 如果不正确、是因为我在代码(即 Main 函数)中错误地编写了节能策略吗?

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

    尊敬的 Susung:

    您是否在没有调试器连接/处于活动状态的调试会话的情况下进行了任何测量?

    如果您单步执行代码、则会使器件保持在活动状态。 那么显然不会进入待机模式。 但是、即使您按下"play"按钮并允许器件运行代码并进入空闲任务、CCS 仍将阻止器件进入待机功耗模式。

    谢谢、

    Marie