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.

[参考译文] LP-CC2651P3:待机电源

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1418942/lp-cc2651p3-power-standby

器件型号:LP-CC2651P3
主题中讨论的其他器件:CC2651P3

工具与软件:

您好!
我正在从事一个涉及电力管理的项目。 我希望  在指定的时间内(例如10分钟)定期将微控制器置于待机电源状态 我不知道该怎么做、所以我阅读了一些相关文档:

《CC26xx SimpleLink 无线 MCU 电源管理用户指南》(TI.com)

《SimpleLink SDK 电源管理:MSP432、MSP432E4、CC13xx/CC26xx 和 CC32xx (修订版 J)》(TI.com)

以及许多论坛帖子。

根据我的理解、我应该调用 power_sleep (PowerCC26XX_STANDBY);但我不知道如何在 指定时间后从该状态恢复。 可以有人帮我吗?
我使用的是 Code Composer Studio 12.8.0。 A 以项目"empty_nortos_ticlang"为基础。

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

    你好、Jakub、

    我希望你做得好。 我们可以在此处使用计时器、如下所示:

    #include <ti/drivers/timer/TimerCC26XX.h>
    void UserCallbackFunction(void *arg0)
    {
        gCount++;
    }
    
    {
        
    Timer_Handle    handle;
    Timer_Params    params;
        Timer_Params_init(&params);
        params.periodUnits = Timer_PERIOD_HZ;
        params.period = 1000;
        params.timerMode  = Timer_CONTINUOUS_CALLBACK;
        params.timerCallback = UserCallbackFunction;
        handle = Timer_open(CONFIG_TIMER_0, &params);
        if (handle == NULL) {
            // Timer_open() failed
            while (1);
        }
        int status;
        status = Timer_start(handle);
        if (status == Timer_STATUS_ERROR) {
            //Timer_start() failed
            while (1);
        }
        while (gCount < 600000)
        {
            //wakeup
        }

    这计数10分钟、然后将退出 while 线程。  

    谢谢!
    Alex F

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

    Alex、您好!
    感谢您的留言。 我想我不会说清楚的。 后来我计划使用电池来固定微控制器、并希望延长它的使用寿命、方法是让微控制器周期性地处于待机状态(10分钟)。 后来的微控制器被抵消以唤醒、执行其任务、例如发送和接收来自无线电的消息、它们将再次进入睡眠状态。 有可能吗?  
    谢谢、Jakub CZ

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

    你好、Jakub CZ、

    是的、可以将器件置于待机/睡眠/或关机状态、然后唤醒以执行任务、再返回睡眠状态(许多客户已经这么做了)。  

    谢谢!
    Alex F

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

    Alex、您好!
    感谢您的支持。 我的问题是如何做到这一点? 正如我在上面写的那样、我阅读了文档以及许多论坛主题帖、但我不知道如何正确处理。 我尝试使用 TIMER 和  Power_sleep (PowerCC26XX_STANDBY)、然后作为回调唤醒、但它无法正常工作。 我试过:

    void timerCallback (Timer_Handle 句柄、int_fast16_t 状态)

    power_releaseConstraint (PowerCC26XX_disallow_standby);
    power_releaseConstraint (PowerCC26XX_disallow_idle);

    }

    void enterStandbyMode (void)

    timer_init();

    Timer_Params_(&timerParams);
    timerParams.period = 10000000;
    timerParams.periodUnits = Timer_period_US;
    timerParams.timerMode = Timer_Oneshot_callback;
    timerParams.timerCallback = timerCallback;

    Timer = Timer_open (CONFIG_TIMER_0、&timerParams);
    if (timer == NULL){
    while (1);
    }

    if (Timer_start (timer)=Timer_STATUS_ERROR){
    while (1);
    }

    power_setConstraint (PowerCC26XX_disallow_standby);
    power_setConstraint (PowerCC26XX_disallow_idle);

    POWER_SLEEP (PowerCC26XX_STANDBY);
    }

     目前、时间更短、函数被调用一次以测试能力。 根据我的理解、我进入了 powerstandby 模式、但无法唤醒。 该代码缺乏什么、还是我的方法完全错误?
    谢谢、Jakub CZ

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

    你好、Jakub CZ、

    看看您的代码片段,我们可以尝试用 sleep()或类似的东西替换 power_sleep。 我们不能使用 power_sleep()、因为它由电源策略使用、而不是应用程序调用:

    "*@警告调用此函数时必须禁用中断、和
    * 应用程序不应直接调用 或由任何驱动程序执行。
    *此函数不检查声明的约束;策略函数
    *调用此函数以启动睡眠之前必须检查约束。"

    电源管理文档中的"使用运行在待机模式下的 RTC 来唤醒 CM3. CM3可在任何启用中断的外部输入引脚上唤醒"。  

    我尝试了一个什么类似版本的代码替换为睡眠而不是 power_sleep、它运行正常。  

    谢谢!
    Alex F

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

    Alex、您好!
    使用 RTC 是我的第一个想法、但我 偶然发现了如何设置 RTC 的问题。 我编写的代码旨在使 LED 与 RTC 闪烁。

    void rtcCallback(uintptr_t arg) {
        AONRTCEventClear(AON_RTC_CH1);
    
        GPIO_toggle(CONFIG_GPIO_LED_0);
    
        uint32_t nextTick = AONRTCCurrentCompareValueGet() + RTC_INTERVAL_TICKS;
        AONRTCCompareValueSet(AON_RTC_CH1, nextTick);
    
        HwiP_clearInterrupt(INT_AON_RTC_COMB);
    }
    
    void setupRTC(void) {
    
        AONRTCDisable();
    
        AONRTCEventClear(AON_RTC_CH1);
    
        AONRTCCompareValueSet(AON_RTC_CH1, AONRTCCurrent64BitValueGet() + RTC_INTERVAL_TICKS);
    
        AONRTCChannelEnable(AON_RTC_CH1);
    
        AONRTCEnable();
    
        AONEventMcuWakeUpSet(AON_EVENT_MCU_WU0, AON_EVENT_RTC_CH1);
    
        HwiP_Params hwiParams;
        HwiP_Params_init(&hwiParams);
        hwiParams.priority = 1;
        HwiP_create(INT_AON_RTC_COMB, rtcCallback, &hwiParams);
    
        HwiP_enableInterrupt(INT_AON_RTC_COMB);
    }
    
    void *mainThread(void *arg0)
    {
        Power_init();
    
        GPIO_init();
    
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        setupRTC();
    
        while (1) {
            sleep(1);
            GPIO_toggle(CONFIG_GPIO_LED_1);
        }
    }

    库:
    /* For usleep() */
    #include <unistd.h>
    #include <stdint.h>
    #include <stddef.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/Timer.h>
    #include <ti/drivers/dpl/ClockP.h>
    #include <ti/drivers/dpl/HwiP.h>
    
    #include <ti/devices/cc13x1_cc26x1/driverlib/aon_rtc.h>
    #include <ti/devices/cc13x1_cc26x1/driverlib/aon_event.h>
    #include <ti/devices/cc13x1_cc26x1/driverlib/interrupt.h>
    #include <ti/devices/cc13x1_cc26x1/driverlib/sys_ctrl.h>
    #include <ti/devices/cc13x1_cc26x1/inc/hw_aon_rtc.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26XX.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"

    代码在调试时编译并工作、但在第一次迭代后不工作。 我怎么了? 能否为我提供有关正确设置 RTC 的资料? 我以后应该使用什么命令来调节电源?
    谢谢、Jakub CZ

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

    我使用的是 CC2651P3 Launchpad、NORTOS、ticlang。 我的项目以 exapmle"empty"为基础。

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

    我还找到了旧的示例 pinStandby (TI.com)、其中在 README 中说" 该示例包含一个定期睡眠和唤醒的任务。 由于应用中未安排任何其他工作、因此电源策略(CPU 空闲时运行)将选择在任务睡眠期间将器件置于待机状态。" 它们使用 sleep()命令。 根据我的理解、这需要选中"ENABLE Policy"和 "PowerCC26XX_standbyPolicy"作为 策略函数。 这是否也足够?  

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

    你好、Jakub、

    我将看看我能否编写一个持续闪烁的 RTC/计时器版本、为此我通常参考 syscfg 中的示例。  

    谢谢!
    Alex F

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

    Alex、您好!
    感谢你能抽出时间。 如果你可以向我展示"一个版本的 RTC/计时器,始终闪烁"我将会 感激更多,它将帮助我开发更好的应用程序。 关于电源管理、我认为我发现了一个工作解决方案:

    /*
     *  ======== empty.c ========
     */
    
    /* For usleep() */
    #include <unistd.h>
    #include <stdint.h>
    #include <stddef.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/Timer.h>
    // #include <ti/drivers/I2C.h>
    // #include <ti/drivers/SPI.h>
    // #include <ti/drivers/Watchdog.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26X2.h>
    #include <ti/drivers/power/PowerCC26X2_helpers.h>
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    Timer_Handle timer0;
    Timer_Params params;
    uint8_t wl=0;
    
    uint8_t count=0;
    uint8_t i=0;
    void timerCallback(Timer_Handle myHandle, int_fast16_t status);
    
    /*
     *  ======== mainThread ========
     */
    
    void timerCallback(Timer_Handle myHandle, int_fast16_t status){
    
        GPIO_toggle(CONFIG_GPIO_LED_0);
        count++;
        if(count==10){
            count=0;
            wl=1;
            Timer_stop(timer0);
        }
    }
    
    void Init_tim(void){
    
        Timer_init();
    
        Timer_Params_init(&params);
        params.period        = 1000000;
        params.periodUnits   = Timer_PERIOD_US;
        params.timerMode     = Timer_CONTINUOUS_CALLBACK;
        params.timerCallback = timerCallback;
    
        timer0 = Timer_open(CONFIG_TIMER_0, &params);
    
        if (timer0 == NULL)
        {
            /* Failed to initialized timer */
            while (1) {}
        }
    
        if (Timer_start(timer0) == Timer_STATUS_ERROR)
        {
            /* Failed to start timer */
            while (1) {}
        }
    }
    void turnOff(void){
    
        uint32_t time = 10;
    
        if (wl==1){
            wl=0;
            //GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
            //GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
            GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
            sleep(time);
            GPIO_toggle(CONFIG_GPIO_LED_1);
            Timer_start(timer0);
        }else{
            i++;
        }
    }
    
    void *mainThread(void *arg0)
    {
    
        /* Call driver init functions */
        GPIO_init();
    
        /* Configure the LED pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        /* Turn on user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
        Init_tim();
    
        while (1)
        {
            turnOff();
        }
    }
    

     测量 CC13xx 和 CC26xx 电流消耗(修订版 D)后 、我测量了电流、我想我实现了功耗待机。
    谢谢、Jakub CZ

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

    你好、Jakub CZ、

    感谢您的更新! 很高兴听到您能够测量良好的电流。 我明天会尝试使用这个示例/代码片段!

    谢谢!
    Alex XF

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

    你好、Jakub CZ、

    以下是计时器工作(接下来将研究 RTC)的基本示例、在回调中切换 GPIO。  

    void *mainThread(void *arg0)
    {
        Timer_Handle timer0;
        Timer_Params params;
    
        /* Call driver init functions */
        GPIO_init();
        Timer_init();
    
        /* Configure the LED pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        /* Turn off user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
    
        /*
         * Setting up the timer in continuous callback mode that calls the callback
         * function every 10,000,000 microseconds, or 10 second.
         */
        Timer_Params_init(&params);
        params.period        = 10000000;
        params.periodUnits   = Timer_PERIOD_US;
        params.timerMode     = Timer_CONTINUOUS_CALLBACK;
        params.timerCallback = timerCallback;
    
        timer0 = Timer_open(CONFIG_TIMER_0, &params);
    
        if (timer0 == NULL)
        {
            /* Failed to initialized timer */
            while (1) {}
        }
    
        if (Timer_start(timer0) == Timer_STATUS_ERROR)
        {
            /* Failed to start timer */
            while (1) {}
        }
    
        return (NULL);
    }

    谢谢!
    Alex F

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

    谢谢、我会等待  RTC 的下次。