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.

[参考译文] RTOS/CC3220:在 LPDS 模式下、无法退出睡眠功能。

Guru**** 2524550 points
Other Parts Discussed in Thread: CC3220R, UNIFLASH, CC3220S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/690342/rtos-cc3220-in-lpds-mode-cannot-exit-the-sleep-function

器件型号:CC3220

工具/软件:TI-RTOS

条件:

1.将 power_measurement 示例与 SDK 版本2_10_00_04一同使用、目标芯片为 CC3220R。

2.在 LPDS 模式下选择 UseCase_AlwaysConnected 模式,保持与路由器的连接,使用串行端口的阻塞模式接收数据,并在接收过程之前使用 Power_DisablePolicy ()以防止 CC3220进入 LPDS 模式。

3.在等待串行端口接收的过程中,如果等待时间较长,则数据收集完成后将被阻止,无法退出睡眠功能

然后、我尝试使用 D:\ti\simplelink_cc32xx_sdk_2_10_00_04\source\ti\devices\cc32xx\driverlib\uart.c .h 中的驱动程序函数来实现串行端口发送和接收的功能、并发现问题再次出现。

 为什么会发生这种情况?如何解决此问题?

我希望 CC3220在保持连接路由器的同时进入 LPDS 模式、然后外设通过 IO 端口唤醒3220并与串行端口通信。

 在睡眠状态下进行阻断时的电流波形(电流波形为正常 LPDS 模式):

代码(power_measure.c):

代码(UART_TERM.c):

日志信息:

项目文件:

e2e.ti.com/.../power_5F00_measurement_2D00_uart_2D00_lib.zip

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

    您好、Xinggang、

    我已使用自己的 CC3220 Launchpad 重现了该问题、在发送 UART 数据之前等待~5分钟会导致 SLEEP (LPD_IDLE_TIME/5000)调用永不返回。

    我仍然没有确定根本原因、但尝试了以下操作、以查看其是否解决了问题:

    • 将 UART 驱动程序从 UARTCC32XX 更改为启用了 DMA 的 UARTCC32XXDMA
    • 调用 PRCMLPDSWakeupSourceEnable (PRCM_LPD_TIMER)以确保将 RTC 用作唤醒源
    • 将 UART 读取函数更改为非轮询 UART_read()
    • 向 UART_READ()函数添加了超时,以便在10秒后返回,如果未发送任何数据,则重复 UART 读操作。

    遗憾的是、上述调试权变措施均无法解决该问题。

    我将继续对此进行调试、了解可能导致问题的原因、并在我找到解决方法或解决方法时告知您。

    此致、

    Michael

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

    您好、Michael、

    现在是否有任何进展?这似乎是一个软件错误。

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

    您好、Xinggang、

    我们发现、从 SDK 版本开始、RTOS 内核中存在一个错误。 2.10.00.04、其中未考虑 RTOS 时钟模块使用的基于快速时钟的 SysTick 与 MCU 在 LPDS 下使用的 RTC 之间的时钟漂移。 当您进入 LPDS 时、SysTick 会停止、因为快速时钟已禁用、因此当您退出 LPDS 时、您需要根据在 LPDS 期间经过的时间将 SysTick 恢复并重新同步到正确的计数。

    处理 LPDS 转换的内核电源模块假定 SysTick 和 RTC 之间没有时钟漂移、因此当它恢复 SysTick 时、它不会将其恢复到正确的时间。 从我们正在运行的一些实验中、我们观察到 SysTick 的漂移比 RTC 慢了几百毫秒/小时。 这与您看到的问题有关、因为调度程序在 SysTick 计数上有挂起的事件、这些事件将永远不会被触发、因为 SysTick 已经超过了它们应该发生的计数。 让我说明一下正在发生的情况:

    事件 SysTick 时间 RTC 时间
    时钟模块初始化 0 0
    (正在运行) (笑声) (笑声)
    sleep()上的 Task1块,要阻止5s。 5890.0 5890.55
    调度程序将事件设置为在5895.0s 解除任务1的阻断 5890.0

    5890.55

    电源模块进入系统进入 LPDS 5890.0

    5809.55

    (睡眠) (笑声)

    (笑声)

    MCU 由 RTC 从睡眠模式唤醒 5890.0

    5895.55

    电源模块将 SysTick 重新同步到 RTC 5895.55

    5895.55

    调度程序检查是否有任何任务可以运行 5895.55

    5895.55

    没有任务就绪、任务1被阻止、直到 SysTick 循环返回到5895.0s 5895.55

    5895.55

    由于没有可运行的任务、电源模块进入系统进入 LPDS 5895.55

    5895.55

    我们目前正在测试内核中电源模块的修复程序、以便将 SysTick 重新同步到 RTOS 的调度程序/其余部分所需的正确时间。 此修复程序应提交到下一个 SDK 版本中。 我将告诉您是否有任何变化、以及何时我们发布此修复程序。

    此致、
    Michael

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

    谢谢!

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

    您好、Michael:

    当我将睡眠时间更改为5s 时、它崩溃。

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

    您好、Xinggang、

    您是否使用 TIRTOS? 使用 FreeRTOS 时、会出现类似的 LPDS 唤醒问题、但需要进行不同的修复、因为电源策略中的时钟恢复处理方式不同。

    如果您使用 TIRTOS、则修复程序应该有效。 我已经使用最新 SDK (v.2.10.00.04)上的 power_measurement 示例对其进行了测试。 以下是我复制和问题的方式、然后确认修复是否有效:

    1. 导入 power_measurement 示例
    2. 使用我的 AP 详细信息编辑 common.h。
    3. 将默认 power_measure.c 文件替换为 UART 读取修改。 (请参阅此帖子末尾附带的文件)。
    4. 将固定的 PowerCC32XX_tirtos.c 文件复制到项目中
    5. 将以下定义插入 UART_TERM.h 中:
      int UartRead (char* buf、int len); 

      然后、该函数的以下实现方式进入 UART_TERM.c:

      int UartRead (char* buf、int len){
      返回 UART_readPolling (uartHandle、buf、len);
      } 

    6. 构建、然后使用 Uniflash 在 CC3220上进行编程

    我所做的以及您的设置是否有不同之处?

    此致、

    Michael

    /cfs-file/__key/communityserver-discussions-components-files/968/power_5F00_measure.c

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

    你(们)好,Michael

    此修复程序正常工作、

    我的意思是、这是另一个导致程序崩溃的问题、永远不会再次唤醒。

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

    您好、Xinggang、

    好的、我现在明白了。 当您提到使用 SLEE()仍会使您处于不良状态时,我感到困惑。

    在终端输出中、您似乎没有在崩溃的迭代中进入睡眠状态(5)。 看起来就像你在崩溃 UartReadPolling()。 我假设在此期间处理器处于活动状态、因此您可以使用调试器检查系统状态。 这样做会很有趣、并且可以看到在您的碰撞过程中发生了什么。

    您是否查看了我提供的代码并进行了检查、以查看我正在运行的代码与导致器件崩溃的代码之间是否存在任何差异? 我无法使用 launchpad 上提供的代码复制此崩溃行为。

    您是否正在使用自己的定制板? 如果是、最好在 LaunchPad 上运行代码、看看是否遇到相同的问题。

    此致、
    Michael

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

    你(们)好,Michael

    很抱歉、这是我的错。

    仅 当 keepDebugActiveDuringLPDS 为 false 时才会出现此问题、如果 keepDebugActiveDuringLPDS 设置为 true、则永远不会再次发生。因此、我无法调试代码。

    是的、我正在使用我自己的定制板、我现在没有 LaunchPad。

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

    你(们)好,Michael

    这一问题并非总是发生的。 有时工作正常。

    这是正常的电流波和误差电流波。

    这是电流 测量的视频。(从启动到错误发生)

    e2e.ti.com/.../current-test.mp4

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

    感谢您发布示波器捕获和视频。
    您在我假设的 VIN 上看到的骤降可能太大、以至于器件无法承受。 您的 VIN 标称值是多少?当您具有高电流消耗时、电压会下降到什么?

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

    你(们)好,Michael

    我将一个1欧姆电阻器连接到 VIN 以捕获电流波形、因此降压电压几乎为300mV。 如果我将 VIN 直接接线至 VCC、则仍然会出现此问题。

    CC3220 发送数据时会产生高电流消耗、电源电压为3.28V。

    当我将 keepDebugActiveDuringLPDS 设置为 true 时、CC3220工作正常、因此我不认为电源压降会导致问题发生。

    这个问题发生的概率很高、并非总是如此。

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

    您认为电源压降不是问题的原因似乎是正确的。 但有趣的是、设置 keepDebugActiveDuringLPDS 可以消除该问题。 我必须检查一个位、看看在 LPDS 中保持调试器/JTAG 处于活动状态时有何不同。

    我认为您应该仔细检查 CC3220 Launchpad 是否也会出现这种行为。 虽然没有 CC3220R LaunchPad、但您可以使用 CC3220S Launchpad 运行代码。 您可以使用相同的代码、并将其作为 Uniflash 的 CC3220R 项目进行刷写、其工作方式应与在 R 器件上运行代码完全相同。 通过在 LaunchPad 上运行它、我们将能够确认它绝对不是软件问题。

    我已要求现场团队与您联系、并让您使用他们的 CC3220S LaunchPad 之一。 请告诉我您使用 launchpad 的测试结果。

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

    你(们)好,Michael

    好的、谢谢您、  当我获得 launchpad 时、我会再次检查这个问题。

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

    您好、Michael、

    您是否对 FreeRTOS 有类似的修复程序?  (相同的 SDK 版本)

    此致

    Ron