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.

[参考译文] CC3220SF:如何查找(泄漏)电流/有源外设

Guru**** 2589275 points
Other Parts Discussed in Thread: SYSCONFIG, ENERGYTRACE, MSP430FR5969, CC3220SF, SYSBIOS

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/862745/cc3220sf-how-to-find-leakage-currents-active-peripherals

器件型号:CC3220SF
主题中讨论的其他部件:SysConfigENERGYTRACEMSP430FR5969SYSBIOS

尊敬的 TI:

我正在降低 CC3220MODASF 器件的电流消耗、以延长器件的电池寿命。 我尝试在 NWP 空闲连接(LSI 为500ms)的情况下使 MCU 处于 LPDS 模式、根据文档、该模式的典型功耗应为710uA。  但是、出于某种原因、当我的器件在空闲循环中运行时、似乎没有进入 LPDS 模式(我在 Power SysConfig 中激活了"启用策略")。

当我的所有任务都被阻止时、我使用示波器记录了该电流消耗(1mV = 1mA):

您可以看到、DTIM 每400ms 唤醒一次 NWP、但剩余的电流消耗保持在27mA 左右。

我猜是外设或 NWP 之一阻止了到 LPDS 模式的转换、但我不知道哪一个(我使用看门狗计时器、SPI、I2C、多个 GPIO 等)。
我曾尝试逐一禁用(或暂时删除)外设、但遗憾的是、由于流依赖性、这对于我合理大小的应用程序而言是不能(轻松)执行的。

我通过分析 CPU 执行来仔细检查 MCU 在执行期间是否处于空闲循环中、这是正确的(我的所有任务都被阻止)。
我已经尝试停用看门狗计时器(我看到过去有一些问题)、但这没有帮助。

因此、我想知道是否有方法可以确定哪些外设仍然处于活动状态。 是否有一些工具(或技巧)可用于检查此问题?
我检查的是 XDS110调试器+ Energytrace HDR 模块、但根据我以前对 MSP430FR5969 Energytrace 的经验、我不记得有此功能。

此致、

mj

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

    尊敬的 MJ:

    您是否正在运行功率测量示例? 它具有 UART 接口、您可以使用该接口将器件设置为低功耗模式、并在进入该模式时通知您。  

    Jesu

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

    否、我正在运行我的自定义示例。 只是为了显示它不会在应用中进入 LPDS 模式。
    我刚刚运行了功率测量示例、在 LPDS 和休眠模式下、电流显示为5.6mA。 我已经看到这个5.6mA 电流在我自己的应用中的某个点经过(因此它在那里也进入了 LPDS 模式一小段时间)、但出于某种原因、它此时不想进入 LPDS、我不知道原因。

    因此、基本上我有两个问题:

    (1) LPD/休眠电流过高。 因此、我猜某些(GPIO)端口会泄漏电流、因为端口未正确停驻(?)

    (2)我的自定义应用程序不想进入 LPDS 模式。

    第一个问题可以使用您提到的功率测量示例来解决、但第二个问题我不知道。

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

    好的、我可能已经找到了问题1的答案:我仔细检查了引脚的停车情况、发现有几个是不正确的。 但是、对于功率测量配置、产生的电流没有变化、仍然为5.6mA。 然后我隔离了所有周围的元件、我发现 SOP1到 VDD 的短接接头(带跳线)是其过高的原因。 移除短接跳线后、电流降至预期值:~4.5uA 用于休眠、~300uA 用于 LPDS (仍需确定小幅增加的来源)。

    然而,问题2仍未解决。 由于移除了 SOP1跳线(~20mA)、电流现在降低了一点、但从未进入 LPDS 模式。 我使用了 RTOS 执行分析器并临时禁用了电源策略、以便分析任务执行情况。 结果:

    如您所见、空闲循环大部分处于活动状态。 如何检查阻止器件的原因?

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

    尊敬的 MJ:

    如果在运行 power_measurement 示例时未获得预期电流、这表示存在潜在的硬件问题。 您使用的是定制板还是 LP?

    Jesu

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

    尊敬的 Jesu:

    我正在使用定制板、但运行了我的定制应用和其中的 power_measurement 示例。

    正如 我在上一帖子中提到的、在运行 power_measurement 示例时、电路板的电流消耗(几乎)与 LaunchPad 的预期电流完全相同。 因此、我认为这不是硬件问题。

    从电流消耗来看、CC3220似乎在我的定制应用中保持激活模式(NWP 处于非激活状态)、电流为~20mA。 我假设它不会进入 LPDS 模式、或者一些外设强制快速时钟保持活动状态。 我想知道是否有某种方法来检查是否(自动)激活了 LPDS、以了解如何解决此问题。

    mj

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

    MJ、

    如果您在运行建议的功率测量示例时在 Launchpad 上甚至看到正确的数字、 请问您使用的 SDK 版本和服务包是什么? 我刚刚从 SDK v3.30和 Service Pack 版本 sp_3.13.0.3_2.0.0.0_2.2.0.6.bin 运行 CC3220SF Launchpad 上的 power_measurement 示例、看到~130uA。

    Jesu

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

    尊敬的 Jesu:

    遗憾的是、几周前测试期间、由于连接的电路板上存在短路、我损坏了2块 LaunchPad 电路板、因此我将在定制电路板上执行所有测试。

    当我在使用 SDK v3.30和 service pack sp_3.13.0.3_2.0.0.0_2.2.0.6的定制板上运行 power_measurement 示例时、我会得到介于80 - 150uA 之间的值电流。 因此、在定制 PCB 上似乎可以正常工作。 当我不做选择时,电流消耗约为~23mA。

    如果我在同一电路板上测试自定义应用程序,并且我用以下代码替换了 mainTask()线程的循环:

    while (1)
    {
    /*启用 LPDS 策略*/
    power_enablePolicy();
    Task_sleep (5000);
    } 

    如果我执行应用程序、您将获得以下执行分析、这与上面发布的分析类似:

    您可以看到、空闲循环主要处于活动状态。 如果我运行自定义应用程序:

    电源策略禁用: ~30mA
    电源策略已启用:~20mA

    正如我现在多次说过的、我想弄清楚电流为什么不会进一步下降。

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

    尊敬的 MJ:

    您的其他线程的状态是什么(例如被阻止、准备就绪...)? 此外、 您的 PowerCC32XX_CONFIG 设置为什么? 您可以在工程的 Generated Source 文件夹中的 ti_drivers_config.c 中找到它。

    Jesu

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

    尊敬的 Jesu:

    感谢您提出问题。 除空闲循环外、所有任务都被阻止、但当我查看 PowerCC32XX_CONFIG 时、我记得我已将 GPIO 唤醒设置为 LPDS 模式。 所以我开始尝试了一点、结果如下所示:

    PowerCC32XX_CONFIG 为:

    CONST PowerCC32XX_ConfigV1 PowerCC32XX_CONFIG ={
    策略 InitFxn = PowerCC32XX_initPolicy、
    policyFxn = PowerCC32XX_sleepPolicy、
    enterLPDSHookFxn =空、
    resumeLPDSHookFxn =空、
    .enablePolicy = true、
    .enableGPIOWakeupLPDS = true、
    .enableGPIOWakeupShutdown = false、
    .enableNetworkWakeupLPDS = true、
    .wakeupGPIOSourceLPDS = PRCM_LPDD_GPIO4、
    .wakeupGPIOTypeLPDS = PRCM_LPD_RISE_EDGE、
    .wakeupGPIOFxnLPDS = IMUCallback、
    .wakeupGPIOFxnLPDSArg = 0、
    .wakeupGPIOSourceShutdown = PRCM_HIB_GPIO13、
    .wakeupGPIOTypeShutdown = PRCM_HIB_RISE_EDGE、
    ramRetentionMaskLPDS = PRCM_SRAM_COL_1|PRCM_SRAM_COL_2|PRCM_SRAM_COL_3|PRCM_SRAM_COL_4、
    keepDebugActiveDuringLPDS = false、
    ioRetentionShutdown = PRCM_IO_RET_GRP_0|PRCM_IO_RET_GRP_1|PRCM_IO_RET_GRP_2|PRCM_IO_RET_GRP_3、
    .pinParkDefs = parkInfo、
    .numPins = 31
    }; 

    GPIO4的中断有时会启动计时器(freq = 1Hz)、并且由于该计时器、功耗仍然很高。
    但是、由于计时器频率较低、我希望该计时器在较慢(RTC)时钟上运行、而不是在80MHz 时钟上运行。

    我以这种方式配置了计时器:

    Timer_Params 参数;
    Timer_Params_init (&params); 
    Params.periodUnits = Timer_Period_Hz; params.period = 1; params.timerMode = Timer_Continuous_callback; params.timerCallback = timerCallback; ActivityTimer = Timer_open (Board_TIMER0、params);

    如果我禁用计时器的启动、则电流会降至 uA 范围、因此计时器肯定是问题的原因。 我想这是自动完成的、但如何强制定时器在慢时钟(32.768kHz)上运行?

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

    MJ、

    电源管理单元直接控制慢时钟、不能用于应用。 所有通用定时器均使用系统时钟(80MHz)。 为了确保我理解、您说您必须先禁用应用计时器、然后再返回睡眠状态才能正确进入 LPDS?

    Jesu

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

    Jesu、

    是的、我必须(手动)禁用应用程序计时器才能正确进入 LPDS。
    问题是、该计时器用于跟踪处于该状态的时间、而它在大多数时间都处于 LPDS 状态。

    我认为电源管理模块将确保慢速计时器自动切换到低频时钟(显然没有)。 也许我使用的是"错误"计时器模块? 因为有时我不太清楚应该使用哪个计时器 API:

    - TI 驱动程序计时器(直接使用高速时钟在实际计时器模块上运行)

    - ti.sysbios.family.arm.cc32xx.Timer 模块(根据此模块管理32kHz RTC 计时器的文档)

    - ti.sysbios.family.arm.m3/Timer 模块(使用 SysTick 计时器)

    我已经快速了解了所有这些不同的计时器、但 API 调用似乎是相同的或至少非常相似的。 我没有经常使用 SYS/BIOS 模块、那么我如何知道我使用的是哪个模块? 如果 LPDS 处于活动状态、哪些会切换到低频时钟?

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

    MJ、

    您确切需要该计时器的目的是什么? 请记住、进入 LPDS 模式后、状态信息丢失、仅保留某些 MCU 寄存器。 如果您只需要定时器从睡眠模式唤醒、则需要使用 PRCM API。 更多信息、请参阅 TRM 第15.3节。

    Jesu

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

    Jesu、

    GPIO4端口(配置为从 LPDS 唤醒的端口)来自 IMU。 IMU 在开始移动或在特定时间内停止时生成中断。 我使用计时器来跟踪自静止检测(如秒表)以来经过的时间。

    如果我查看 TRM 的第15.3节、如果我手动存储计数器的值、然后手动将其转换为秒、慢时钟计数器似乎可以帮助我解决问题。 我将在星期一尝试实施这项计划。

    mj

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

    Jesu、

    我稍微重新编写了代码以使用时钟计数器、它的工作方式与我想象的一样。
    现在没有正在运行的定时器、并且已正确进入 LPDS 模式。
    我仍然能够检索基于轮询经过的时间(这是可以的、因为我已经为其他任务而唤醒)。
    感谢您的帮助!

    mj