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.

[参考译文] CC2674R10:待机模式和 energytrace++

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1521586/cc2674r10-standby-mode-and-energytrace

器件型号:CC2674R10
Thread 中讨论的其他器件:CC3351、SysConfig、 ENERGYTRACE

工具/软件:

您好 TI 社区、

我正在 CC3351 上开发一种低功耗应用、要求器件大部分时间都处于待机模式。 该系统包括:

  • 具有 ADC 和电容式触控任务的传感器控制器
  • CC3351 配置为 MQTT 客户端
  • 基于 FreeRTOS 的应用

问题描述: 目前、我正在尝试使用简化的测试用例验证待机模式运行(禁用传感器控制器和 MQTT 功能)。 但是、尽管实现了以下主循环、器件似乎仍保持运行模式:

while (1) {
    vTaskDelay(pdMS_TO_TICKS(500));
    
    switch(state) {
        case STATE_INIT:
            state = STATE_SLEEPING_WITH_TOUCH;
            break;
            
        case STATE_SLEEPING_WITH_TOUCH:
            if (++debugCounter >= 20) {
                debugCounter = 0;
                // Additional debug code here
            }
            break;
    }
}

所采取的调试步骤:

  1. 功率限制验证:
void debug_constraints() {
    uint_fast32_t constraints = Power_getConstraintMask();
    LOG_INFO("Current constraints: 0x%08X", constraints);
    
    if (constraints & (1 << PowerCC26XX_DISALLOW_STANDBY)) {
        LOG_INFO("STANDBY is BLOCKED");
    }
}

输出: [14:28:06.458] [MAIN::INFO] Current constraints: 0x00000000

  1. 待机延迟检查:
uint32_t standbyLatency = Power_getTransitionLatency(PowerCC26XX_STANDBY, Power_TOTAL);
LOG_INFO("Standby latency: %d us", standbyLatency);

输出: [14:30:08.027] [MAIN::INFO] Standby latency: 1000 us

  1. 时钟源验证:
LOG_INFO("---------------------------Testing LF and HF quartz-----------------------------------");
OSCHF_TurnOnXosc(); 

// Ensure switch to XOSC
while (!OSCHF_AttemptToSwitchToXosc()) {
    vTaskDelay(pdMS_TO_TICKS(10));
}

LOG_INFO("HF crystal real amplitude : %d mv", OSCHF_DebugGetCrystalAmplitude());
LOG_INFO("HF crystal expected amplitude : %d mv", OSCHF_DebugGetExpectedAverageCrystalAmplitude());

uint32_t hf_source = OSCClockSourceGet(OSC_SRC_CLK_HF);
if (hf_source == OSC_XOSC_HF) {
    LOG_INFO("HF crystal source: XOSC");
} else if (hf_source == OSC_RCOSC_HF) {
    LOG_INFO("HF crystal source: RC clock");
} else {
    LOG_ERROR("HF crystal source: Invalid configuration (value: %d)", hf_source);
}

uint32_t lf_source = OSCClockSourceGet(OSC_SRC_CLK_LF);
if (lf_source == OSC_XOSC_LF) {
    LOG_INFO("LF crystal source: XOSC");
} else if (lf_source == OSC_RCOSC_LF) {
    LOG_INFO("LF crystal source: RC clock");
} else {
    LOG_ERROR("LF crystal source: Invalid configuration (value: %d)", lf_source);
}
LOG_INFO("----------------------------------------------------------------------------------------");

时钟验证输出:

[14:37:04.538] [MAIN::INFO] ---------------------------Testing LF and HF quartz-----------------------------------
[14:37:04.618] [MAIN::INFO] HF crystal real amplitude : 495 mv
[14:37:04.618] [MAIN::INFO] HF crystal expected amplitude : 465 mv
[14:37:04.618] [MAIN::INFO] HF crystal source: XOSC
[14:37:04.618] [MAIN::INFO] LF crystal source: XOSC
[14:37:04.618] [MAIN::INFO] ----------------------------------------------------------------------------------------

观察结果:

  • 无功耗限制处于活动状态 (0x00000000)
  • HF 和 LF 时钟都成功在 XOSC 上运行
  • 晶体振幅在预期范围内
  • 电源策略在 SysConfig 中使用适当的设置进行配置
  • 遗憾的是、EnergyTrace++在当前 CCS 版本中不起作用、阻止了直接功耗模式验证

问题:

  1. 除了限制清除和时钟配置之外、是否还有其他要求可以实现自动待机转换?
  2. FreeRTOS 任务调度是否会阻止待机进入(尽管有 500ms 的延迟)?
  3. 是否有建议的方法来验证在没有 EnergyTrace++的情况下进入待机模式?

任何见解都将非常感谢。 谢谢!

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

    您好、

    作为第一步,在你的主循环,而不是 vTaskDelay(pdMS_TO_TICKS(500));“,你能尝试“uleep(500000 );“?

    谢谢、
    Toby

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

    感谢您的快速响应,我已经尝试过不同的睡眠,如 OSI_Usleep()、sleep()、usleep() 方法,但不幸的是,这不会改变任何事情。

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

    感谢您的确认。

    这是定制硬件吗?  

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

    是的、它是定制硬件。 我已经只通过使用 TI-RTOS 进行的测试就设法使系统进入待机模式、但我无法通过 FreeRTOS 复制相同的行为。 该工程还包括 CC33xx 等其他组件 我已经确定主芯片消耗了大部分电量 — 当我将其保持在复位状态时,可以解决 20µA 消耗问题、但当它运行时可以解决 5mA 消耗问题。


    我在文档中看到了我们可能需要断开 MCU 总线的连接:

    并更改断电时钟和一些 AUX:



    文档说仅使用 TI 提供的 API、但我不知道在哪里可以找到适用于 AON/AUX 和 MCU 总线的 API 文档。

    感谢您的帮助

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

    关于“TI 提供的 API“、TI 驱动程序(包括电源)位于以下位置: C:\ti\simplelink_cc13xx_cc26xx_sdk_8_30_01_01\source\ti\drivers

    通常、用户应用程序只需要调用在 ti/drivers/Power.h 中声明的 Power_*函数、然后这些函数将转换为特定于器件的函数(在 ti/drivers/power 中)。

    此外、电源驱动程序本身由默认启动代码进行初始化。

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

    好的,这就是为什么我在想,所以你只需要调用命令上的驱动程序 libs 从 TI ,而不需要直接更改注册?

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

    是的、正确!

    虽然寄存器读取/写入可以达到相同的功能、但我们尝试通过提供 TI 驱动程序来降低代码开发的复杂性。

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

    RTOS 此时是否启动?

    后退一步、我建议从一个更简单的示例开始、看看它是如何进入待机状态的。 例如空示例(但删除 mainThread 中的 GPIO 函数调用): https://dev.ti.com/tirex/explore/node?node=A__AHhWibQBN9XX39FT3iQlgw__com.ti.SIMPLELINK_LOWPOWER_F3_SDK__58mgN04__LATEST

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

    实际上、我尝试了一个非常简单的项目、有一段时间、在我的主线程中睡眠、首先由 FreeRTOS 的 main 启动。 但我仍然有很多的消耗(约 700uA,我不知道它是否真的进入待机模式)我也不知道如何使能量跟踪++工作,因为我启动它,没有显示在图形上,这个工具可能是有用的,以知道设备的状态,旧能量跟踪不能这样做。


    一个空项目和我的项目之间的实际区别是什么,只是一个 while 循环在主任务上有延迟?  



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

    编辑:实际上,它在空项目中重置后工作,在那里我得到大约 19uA 的消耗量,但在我的主项目中,我可以重置原因它在启动时与系统重置原因保持重置。  

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

    尊敬的 Valentin:

    一个空项目和我的项目之间的实际区别是什么,只有一个在主任务上有延迟的一段时间循环?  [/报价]

    区别在于、空载不会直接调用函数来进入待机模式;它调用睡眠模式、然后 RTOS 会将器件置于最低功耗状态。

    我刚才提到了调用 Power_*函数... 我可能会得到纠正、如果您使用的是 RTOS -- RTOS 将管理设备的电源状态。

    实际上它在空项目中重置后工作[/报价]

    很高兴您能了解 EnergyTrace 功能正常运行! 过去、我发现在启动 EnergyTrace 之后、但在启动 EnegyTrace 测量之前、有时需要在器件上进行复位。

    在我的主项目中、我可以重置、原因是它在启动时继续重置、带有系统重置原因
    [/quote]

    您看到的重置原因是什么?

    谢谢、
    Toby

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

    感谢您的响应、Enegrytrace 不工作、但器件在空工程中进入待机状态、我尝试使用我的实际工程、只在主线程中等待一段时间、但我仍然有大量消耗、因此我认为这可能是 Free RTOS 配置的问题。

    重置原因是:PowerCC26X2_RESET_SYSTEM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试使用我的实际项目、只做一段时间、在主线程中睡觉、但我仍然有很多消耗[/报价]

    这种新消费是否高于或低于以前?

    我认为、如果您执行硬复位(按下复位按钮)、那么重置原因是典型的--所以没有任何问题。

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

    您在 FreeRTOS 配置与 SDK 空示例(假设您看到低电流消耗)中看到了哪些差异?

    要查看的文件(编译工程后):

    1. /Debug/syscfg/FreeRTOSConfig.h
    2. /Debug/syscfg/ti_freertos_config.c
    实际上它在空项目中重置后工作、在该项目中、我可以得到大约 19uA 的消耗量、但在我的主项目中、我可以重置原因是它在启动时继续重置、并带有系统重置原因

    您能进一步描述一下此处的“复位“是什么意思吗?

    1. “...it 工作后 复位 在空工程中...“
    2. “我可以在...in 上执行我的主要项目 复位 因为它保留 复位 启动时...“

    根据我的理解、1) 讨论的是空项目和  复位  1) 您通过按下引脚以物理方式复位器件、您会看到复位原因“按钮复位的另一个复位原因“、2) 是您的主项目、即使您没有特意按下具有复位原因的复位按钮“PowerCC26X2_RESET_SYSTEM",“,您、您也会一直看到器件复位。

    这是正确的吗?

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

    您好感谢的帮助和您的时间,错误是与一些 GPIO 使消耗非常高! 现在我可以实现 19uA 的消耗!