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.

[参考译文] CC3235MODASF:器件会随机退出休眠模式

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1450882/cc3235modasf-device-comes-out-of-hibernate-at-random-times

器件型号:CC3235MODASF

工具与软件:

固件将器件置于休眠模式后、器件会在164微秒至30秒的任何时间后退出休眠模式。 这种情况随机发生、大约是千分之一。 发生这种情况时、PRCMSysResetCauseGet ()返回 PRCM_HIB_EXIT (7)、 PRCMHibernateWakeupCauseGet ()返回0。

固件会在进入休眠模式之前执行此操作。  

PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO13、PRCM_HIB_FALL_EDGE);
PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO17、PRCM_HIB_FALL_EDGE);
PRCMHibernateIntervalSet ((32768 * 2));
PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO11、PRCM_HIB_FALL_EDGE);
PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO4、PRCM_HIB_FALL_EDGE);
PRCMHibernateWakeupSourceEnable (PRCM_HIB_GPIO4 | PRCM_HIB_GPIO13 | PRCM_HIB_GPIO17 | PRCM_HIB_GPIO11 | PRCM_HIB_SLOW_CLK_CTR);
uint32_t hibReg = hibRegRead ();
Display_printf (gDisplayHandle、"HibReg %x Hibernate Now!\n"、hibReg);
Display_printf (gDisplayHandle、0、0、"vvvvvvvvvv");
PRCMHibernateEnter();

使用此代码时、我们通常会看到器件在2分钟后退出休眠   模式、PRCMSysResetCauseGet ()返回 PRCM_HIB_EXIT (7)、PRCMHibernateWakeupCauseGet ()返回 PRCM_HIB_WAKEUP_CAUSE_SLOW_CLOCK (2)。

对于如何解决/解决此问题、您有什么想法吗?

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

    您好!

    我希望0x2用于慢时钟唤醒、或者0x4用于 GPIO 唤醒。

    0x0表示该中断意外唤醒。

    我不太熟悉代码中的这个区域(由于器件处于休眠状态、因此调试该区域确实更难)。

    我将尝试内部检查。

    Shlomi

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

    您好!

    在代码中、您可以看到、根据以下条件、它返回0:

     if ((HWREG (0x00000400)& 0xFFFF)>= 2)

     {

         返回((PRCMHIBRegRead ((OCP_SHARED_BASE + OCP_SHARED_O_SPARE_REG_8))>>2)&0x7);

     }

     设计

     {

         返回(0);

     }

    在代码中浏览时、此条件表示器件的 ROM 版本早于 ES2.0。

    这与它大部分时间都起作用这一事实并不相关、因此我认为 ROM 版本是可以的。

    在这种情况下、由于这不是由于时钟速度慢(唤醒确实与设置的周期相匹配)、因此我可以假设这是 GPIO 导致的。

    也许您可以尝试排除某些 GPIO、因为包含的许多 GPIO 作为唤醒源、看看它是否有任何不同。

    Shlomi

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

    Shlomi,

    我们已 在上述代码片段中修改了这些行。 遗憾的是、我们仍会看到间歇性随机复位的情况相同  

    // PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO13、PRCM_HIB_FALL_EDGE);
    // PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO17、PRCM_HIB_FALL_EDGE);
    PRCMHibernateIntervalSet ((32768 * 2));
    // PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO11、PRCM_HIB_FALL_EDGE);
    PRCMHibernateWakeUpGPIOSelect (PRCM_HIB_GPIO4、PRCM_HIB_FALL_EDGE);
    PRCMHibernateWakeupSourceEnable (PRCM_HIB_GPIO4 | PRCM_HIB_SLOW_CLK_CTR);
    PRCMHibernateWakeupSourceDisable (PRCM_HIB_GPIO13 | PRCM_HIB_GPIO17 | PRCM_HIB_GPIO11);
    // PRCMHibernateWakeupSourceEnable (PRCM_HIB_GPIO4 | PRCM_HIB_GPIO13 | PRCM_HIB_GPIO17 | PRCM_HIB_GPIO11 | PRCM_HIB_SLOW_CLK_CTR);

    uint32_t hibReg = hibRegRead ();
    Display_printf (gDisplayHandle、"HibReg %x Hibernate Now!\n"、hibReg);
    Display_printf (gDisplayHandle、0、0、"vvvvvvvvvv");
    PRCMHibernateEnter();

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

    您好!

    当研究 SDK 中的 power_measurement 示例、尤其是 UseCase_HIB 案例时、您可以看到它使用 platform.c 中的 API 来包装与电源相关的操作。 具体来说,如果您查看 powerShutdown(),您可以看到在实际使用您使用的 PRCM API 之前,执行的额外步骤很少。 例如、通知已注册的客户端、关闭 SFLASH 等

    您之所以直接调用 API 而不使用此包装器、有什么原因吗?

    是否可以使用它并重新测试?

    此外、您尚未删除 GPIO4。 您可以只保留 RTC 吗?

    Shlomi

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

    Shlomi,

    WiFi 配置需要 GPIO4、因此我必须对固件进行重大更改才能删除它。

    至于如何使用 powerShutdown 包装程序、看一下 Power_shutdown ()函数的 SDK 代码、它似乎不支持将 GPIO 启用为唤醒源。 我曾尝试使用它、但无法使 GPIO4正常运行。 此外、我不确定 哪些 函数会在 powerShutdown ()中关闭 SFLASH。   

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

    是否仍无法使用 GPIO4设置、然后调用  powerShutdown ()?