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.

[参考译文] CC3220MODA:在休眠期间使用 IO 保持技术替换分立式外部下拉电阻器

Guru**** 2466550 points
Other Parts Discussed in Thread: CC3235SF, CC3220SF, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1533598/cc3220moda-using-io-retention-to-replace-discrete-external-pull-down-during-hibernate

器件型号:CC3220MODA
《Thread 中讨论的其他部分:CC3235SFCC3220SFSysConfig》

工具/软件:

在为新设计生成一套硬件后、我们发现对我们希望在不修改硬件的情况下修复固件的设计有了一些疏忽。

该系统主要保持在休眠模式、但每小时唤醒几次以进行一些传感器测量。 只需关闭这些外部传感器的专用电源即可实现这些外部传感器的电源管理。

我们意外省略了 Q1 栅极上的外部下拉电阻、以确保 在 CC3220 休眠且 GPIO8 为高阻态时 LDO 和传感器保持关闭状态 因此、我们看到了一些不可预测的行为、因为在 CC3220 休眠时、GPIO8 会随机浮动。

阅读 CC3220 数据表和手册、似乎我们应该能够通过确保执行以下操作、仅使用固件来解决此问题:

  1. 配置 IO 保留以 包括保留组#0、其中(四个组中的)是包含 GPIO8 的组
  2. 休眠之前、 以及 激活 IO 保留之前的紧固件、(重新)将 GPIO8 配置为启用内部下拉的输入
  3. 将 GPIO8 重新配置为带 PD 的输入后、但在休眠之前、激活/启用 IO 保留
  4. 进入休眠模式、其中 GPIO8 的下拉状态应在整个休眠期间保持

这是我们的理解,但在采取一个裂缝(或五个)在它自己,我们没有太多的成功获得期望的结果。

TI 能否确认...

  • 应该可以 仅通过固件更新来解决这种“缺少外部下拉电阻导致休眠期间出现随机行为“问题?
  • 我们是否缺少(或误解)任何关键步骤以使其按预期工作?
  • 使用该 IO 保留功能时有任何常见缺陷/注意事项/缺点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    感谢您提出这个主题。 对回复的延迟深表歉意。  

    阅读您概述的步骤后、实现这一点似乎是合乎逻辑的。  

    您能否验证 GPIO8 在休眠期间是否保持稳定? 为此、请将 GPIO8 配置为具有内部上拉电阻器的输出。 这将有助于了解 GPIO 在休眠状态下是稳定的/正确配置的。  

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

    让 GPIO8 在休眠期间可靠地运行是整个问题。 如果是、这里不会有任何问题需要解决。

    我们看到的是、在休眠期间尝试控制 GPIO8 之前、GPIO8 会在休眠期间进入 hi-z、从而导致不可预测的系统性能。 然后、在更改固件以尝试在休眠期间控制 GPIO8 后(至少按照我们的最佳理解)、我们看到系统行为没有变化。 似乎 GPIO8 在休眠期间仍处于高阻态、比如我们缺少一些关键配置步骤或其他内容。

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

    是的。 我知道在休眠模式下、GPIO8 不能可靠地变为低电平。 由于我们无法在休眠时测量低电平状态、因此我们想尝试在休眠期间测量处于“高电平“状态的 GPIO。 这样我们就可以验证您放置 GPIO 所遵循的步骤。 这就是提出这一请求的目的。  

    您能否共享用于配置 GPIO8 休眠的源代码(上述步骤 1 至 4)?  

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

    尽管当作为输出主动驱动时、我认为我们通常不会启用上拉或下拉电阻、但我们可以在休眠模式之外可靠地控制 GPIO 的状态来将其驱动为高电平或低电平。 我们可以仔细检查此项以确认、但我认为该问题与 GPIO 控制无关、但更有可能与某些特定于保留的功能有关、例如“保留组“或如何正确 启用保留(而不仅仅是进入无保留休眠模式)。

    我个人不是该产品的固件工程师、但我将与他联系、分享一些相关代码以供查看。

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

    下面是配置的固件片段和 powerShutdown() 调用、该调用通过调用库中的 Power_shutdown () 来启动休眠。

    这是用于 GPIO8 配置以及休眠前修改以尝试使用 IO 保留的代码。  正如 CJ 所述、除了以下设置外、还尝试了几种不同的 GPIO8 配置:PowerCC32XX_WEAK_PULL_DOWN_STD、包括 PowerCC32XX_NO_PULL_HIZ、PowerCC32XX_WEAK_PULL_OPENDRAIN 和 PowerCC32XX_DRIVE_LOW、以查看是否观察到任何差异。  结果没有因这些更改而发生变化。此外、当将数字逻辑探头连接到 GPIO8 时、GPIO8 引脚会根据需要在休眠期间保持低电平。  逻辑探头的阻抗为 1Mohm、10pF。  断开此探头时、错误行为将返回。

    我们现在正在运行一个使用.enablePolicy = true 的测试来验证行为。  在当前每次测量之前调用 Power_enablePolicy()、但也会测试此行为。

    GPIO_PinConfig gpioPinConfigs[] = {
        /* input pins with callbacks */
        /* WiFi TH USB Power Monitor */
        GPIOCC32XX_GPIO_17 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_FALLING
        /* WiFi TH push button */
        , GPIOCC32XX_GPIO_04 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_BOTH_EDGES
        /* WIFI-CO2 - CO2 READY pin */
        , GPIOCC32XX_GPIO_24 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_FALLING
        /* Input pins without callbacks */
        /* Output pins */
        /* WiFi TH I2C sensor power */
        , GPIOCC32XX_GPIO_16 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW
        /* WiFi TH battery measurement switch */
        , GPIOCC32XX_GPIO_06 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW
        /* WiFi TH board ID */
        , GPIOCC32XX_GPIO_22 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE
        , GPIOCC32XX_GPIO_13 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE
        , GPIOCC32XX_GPIO_12 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE
        /* WIFI-LD - Leak Cable Continuity */
        , GPIOCC32XX_GPIO_07 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_LOW | GPIO_CFG_OUT_LOW
        /* WIFI-LD - +5.0v Power Enable */
        , GPIOCC32XX_GPIO_08 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_LOW | GPIO_CFG_OUT_LOW
        /* WIFI-1WIRE - I2C-to-1WIRE Bridge SLPZ pin */
        , GPIOCC32XX_GPIO_28 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_LOW | GPIO_CFG_OUT_LOW
    };
    PowerCC32XX_ParkInfo parkInfo[] = {
    /*          PIN                    PARK STATE              PIN ALIAS (FUNCTION)
         -----------------  ------------------------------     -------------------- */
        {PowerCC32XX_PIN01, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO10              */
        {PowerCC32XX_PIN02, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO11              */
        {PowerCC32XX_PIN03, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO12              */
        {PowerCC32XX_PIN04, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO13              */
        {PowerCC32XX_PIN05, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO14              */
        {PowerCC32XX_PIN06, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO15              */
        {PowerCC32XX_PIN07, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO16              */
        {PowerCC32XX_PIN08, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO17              */
        {PowerCC32XX_PIN13, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* FLASH_SPI_DIN       */
        {PowerCC32XX_PIN15, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO22              */
        {PowerCC32XX_PIN16, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* TDI (JTAG DEBUG)    */
        {PowerCC32XX_PIN17, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* TDO (JTAG DEBUG)    */
        {PowerCC32XX_PIN19, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* TCK (JTAG DEBUG)    */
        {PowerCC32XX_PIN20, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* TMS (JTAG DEBUG)    */
        {PowerCC32XX_PIN18, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO28              */
        {PowerCC32XX_PIN21, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* SOP2                */
        {PowerCC32XX_PIN29, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* ANTSEL1             */
        {PowerCC32XX_PIN30, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* ANTSEL2             */
        {PowerCC32XX_PIN45, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* DCDC_ANA2_SW_P      */
        {PowerCC32XX_PIN50, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO0               */
        {PowerCC32XX_PIN52, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* RTC_XTAL_N          */
        {PowerCC32XX_PIN53, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO30              */
        {PowerCC32XX_PIN55, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO1 (XDS_UART_RX) */
        {PowerCC32XX_PIN57, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO2 (XDS_UART_TX) */
        {PowerCC32XX_PIN58, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO3               */
        {PowerCC32XX_PIN59, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO4               */
        {PowerCC32XX_PIN60, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO5               */
        {PowerCC32XX_PIN61, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO6               */
        {PowerCC32XX_PIN62, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO7               */
        {PowerCC32XX_PIN63, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO8               */
        {PowerCC32XX_PIN64, PowerCC32XX_WEAK_PULL_DOWN_STD}, /* GPIO9               */
    };
    /*
     *  This structure defines the configuration for the Power Manager.
     *
     *  In this configuration the Power policy is disabled by default (because
     *  enablePolicy is set to false).  The Power policy can be enabled dynamically
     *  at runtime by calling Power_enablePolicy(), or at build time, by changing
     *  enablePolicy to true in this structure.
     */
    const PowerCC32XX_ConfigV1 PowerCC32XX_config = {
        .policyInitFxn = &PowerCC32XX_initPolicy,
        .policyFxn = &PowerCC32XX_sleepPolicy,
        .enterLPDSHookFxn = NULL,
        .resumeLPDSHookFxn = NULL,
        .enablePolicy = false,
        .enableGPIOWakeupLPDS = true,
        .enableGPIOWakeupShutdown = true,
        .enableNetworkWakeupLPDS = true,
        .wakeupGPIOSourceLPDS = PRCM_LPDS_GPIO2,    // UART RX
        .wakeupGPIOTypeLPDS = PRCM_LPDS_RISE_EDGE,
        .wakeupGPIOFxnLPDS = NULL,
        .wakeupGPIOFxnLPDSArg = 0,
        .wakeupGPIOSourceShutdown = PRCM_HIB_GPIO4, // push button
        .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,
        .pinParkDefs = parkInfo,
        .numPins = sizeof(parkInfo) / sizeof(PowerCC32XX_ParkInfo)
    };
    void powerShutdown(uint32_t shutdownTime)
    {
    #ifdef CC32XX
        Power_NotifyObj hibSignal;
    #endif
    #ifdef __MSP432P401R__
    #if 0
        Power_registerNotify(&hibSignal, PowerMSP432_ENTERING_SHUTDOWN,
                             preHibConfig,
                             (uintptr_t)NULL);
        if(shutdownTime != MAX_INT)
        {
            /* config gpio to wakeup from hib */
        }
        /*
         *    PowerMSP432_SHUTDOWN_0 => PCM_LPM35_VCORE0
         *    PowerMSP432_SHUTDOWN_1 => PCM_LPM45
         */
        Power_shutdown(PowerMSP432_SHUTDOWN_0,0);
    #else
        if(shutdownTime != MAX_INT)
        {
            if(shutdownTime >= 1000)
            {
                sleep(shutdownTime / 1000);
            }
            usleep((shutdownTime % 1000) * 1000);
        }
    #endif
    #endif
    #ifdef CC32XX
        // modify GPIO8 config for CO2 sensor
        GPIO_PinConfig gpiocfg = GPIOCC32XX_GPIO_08 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE;
        GPIO_setConfig(9, gpiocfg);
        Power_registerNotify(&hibSignal, PowerCC32XX_ENTERING_SHUTDOWN,
                             preHibConfig,
                             (uintptr_t)NULL);
        Power_shutdown(0,shutdownTime);
    #endif
    }

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

    创建新的并行线程、因为我不想破坏主对话...

    解决这个问题的另一个好方法是、TI 的某个人要制作一个非常简单的工程 、以其 SimpleLink LaunchPad 开发套件之一为目标、此时所有工程只需将 GPIO8 配置为下拉 IO 保持、然后一直直接进入 HIB 模式。

    然后、TI 会验证其电气功能是否按预期运行(GPIO8 上的~10MΩ Ω 外部上拉电阻器?)、并与我们共享工程文件。 然后、我们购买了相同的开发套件、完全复制演示、进行自我验证、然后将功能迁移到我们的应用程序中。

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

    您好 Alan、
    是否可以尝试将“GPIOCC32XX_CFG_USE_STATIC"用于“用于 GPIO 配置?

    为了将引脚“停止“在 PowerCC32XX_CONFIG.pinParkDefs[]表中静态定义的状态下、需要定义此配置。 您能尝试一下并告诉我吗?  

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

    是的、我会在测试之前进行更改。

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

    我在 SDK 库中没有定义。   simplelink_cc32xx_sdk_2_40_00_05。

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

    您可以尝试使用该定义“GPIOCC32XX_USE_STATIC"。“。 它看起来像是被重命名了。  


    software-dl.ti.com/.../group___g_p_i_o_c_c32_x_x___pin_config_ids.html

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

    明白了、谢谢!  

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

    这不会改变行为。  在休眠期间、GPIO8 不会保持低电平。

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

    您好 Alan、

    感谢您提供的测试结果。 这是令人失望的!  
    您是否可以尝试以下操作?  

    您能否验证 GPIO8 在休眠期间是否保持高保留状态? 为此、请将 GPIO8 配置为具有内部上拉电阻器的输出。 这将有助于了解 GPIO 已根据您要执行的步骤在休眠状态中正确配置。 如前所述、 当逻辑探头尝试驱动为低电平时、其阻抗会影响输出读数。  
    我确认您使用的是正确的 GPIO8 保留组。 我们会与硬件工程师讨论这一点、并进行跟进。  

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

    您是否还能仔细检查以下内容?

    在 powerShutdown() 函数中、为 GPIO8 设置配置。 您能否确认“9"是“是正确的输入?
    我指的是这一行:

    gpio_setConfig (9、gpiocfg);

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

    在上面的 gpioPinConfigs[]代码中、如果我是正确的、则行 4,6,8,12,14,16,18,20,22 是配置 0-9 的索引、行 22 是 GPIO8。  我认为是对的。

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

    好的。 但是、我提到了第 124 行 (gpio_setConfig (9、gpiocfg);)
    请仔细检查 gpio_set() 函数的第一个参数。  

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

    右侧、在 GPIO_setConfig 中、它引用 PinConfig   * CONFIG =(PinConfig *)&GPIOCC32XX_CONFIG.pinConfigs[index]; 这是上述 POST 中从第 1 行(即该配置的索引 9)开始列出的引脚配置。

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

    好的。  
    对于第 123 行、 GPIO_PinConfig gpiocfg = GPIOCC32XX_GPIO_08 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE;

    我们不会在配置中包含 GPIO 索引。 您可以尝试不使用索引(只使用下拉列表和 init none)吗?
    GPIO_PinConfig gpiocfg = GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_NONE;

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

    是的、我可以尝试一下。  这会有点影响。

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

    您好 Alan、
    对此有任何更新? 您有机会尝试一下吗?  
    确保也将“GPIOCC32XX_USE_STATIC"用于“用于 GPIO 配置以及进行此更改。  

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

    我确实得到了一个机会来尝试这个,这也没有改变行为。  不是很好

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

    您好 Alan、

    很抱歉、稍后回复。 我当时尝试使用 CC3235SF LaunchPad 在我们这边重现此问题。 我能够看到 GPIO 配置为输入并驱动为低电平的行为。 在这种情况下、PIN 在休眠时似乎不会驱动为低电平。  

    但是、如果我们将 PIN 配置为输出并使用内部下拉电阻器、我们可以将 GPIO 置于低电平。

    这是你已经尝试过的东西吗?  如果没有,您可以在 powerShutdown() 函数中尝试以下操作吗?

    GPIO_PinConfig gpiocfg = GPIOCC32XX_GPIO_08| GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_PULL_DOWN_INTERNAL | GPIOCC32XX_CFG_USE_STATIC;

    因此、我们能够看到 GPIO 处于低电平状态、用于休眠。  

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

    我没有尝试该确切的配置、因为我们的版本没有 GPIO_CFG_OUTPUT_INTERNAL 或 GPIO_CFG_PULL_DOWN_INTERNAL 定义。  我猜他们的措辞在我们的版本中是不同的、所以我将搜索它。

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

    以下内容与我使用的内容类似。 请尝试以下 2 个选项。

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

    感谢您找到这些内容、我将试一下。

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

    您好 Alan、

    您能尝试一下吗? 是否有任何更新?  

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

    是的、很抱歉、我可以尝试一下、但忘记回复。  这也没有改变结果。

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

    好的。 您能否分享您正在使用的 GPIO_8 的确切代码片段?  是否用于 GPIO 引脚配置、停止信息和 PowerCC32XX_CONFIG?  

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

    您好 Alan、

    使用 CC3220SF LaunchPad 和 SDK 中的一个示例 (pwmled2) 进行了相同的实验。 我可以看到、在保持之前、GPIO 立即变为低电平、并在保持期间保持低电平

    以下是操作步骤。 是否有 CC3220SF LaunchPad 可以在您这边试用?

    1. 将 pwmled2 示例导入 CCS
    2. 在 CCS (GUI) 中打开 pwmled2.syscfg 并打开 GPIO 模块
    3. 添加 GPIO_8 并将其映射到接头上的 PIN62。 按如下方式配置 GPIO_8
      1. 模式 — 输出
      2. 输出类型 — 标准
      3. 输出强度 — 高
      4. 初始输出状态 — 高电平
      5. 启用静态驻车 — 已选中
    4. 在 SysConfig UI 中转到电源模块
      1. IO 保持关断 — 选择 GRP_0 和 GRP_1
      2. 无需更改引脚停止状态
    5. 在 mainThread 中添加代码更改以触发休眠
      1. 在 mainThread 中调用 powerShutdown()
      2. 如下所示定义 powerShutdown()
      3. int preHibConfig(unsigned int eventType,
                         uintptr_t eventArg,
                         uintptr_t clientArg)
        {
            return(Power_SOK);
        }
        
        void powerShutdown(uint32_t shutdownTime)
        {
            Power_NotifyObj hibSignal;
        
            GPIO_PinConfig gpiocfg = GPIOCC32XX_GPIO_08| GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_PULL_DOWN_INTERNAL | GPIOCC32XX_CFG_USE_STATIC;
            GPIO_setConfig(8, gpiocfg);
        
            Power_registerNotify(&hibSignal, PowerCC32XX_ENTERING_SHUTDOWN,
                                 preHibConfig,
                                 (uintptr_t)NULL);
            Power_shutdown(0,shutdownTime);
        }
        
    6. 当示例在 LaunchPad 上运行时、器件将 GPIO 配置为低电平状态并保持状态
      1. 在我的示例中、我添加了 2 个 GPIO (GPIO 7 和 GPIO 8)。 两者都运行正常。  
    7. 为了便于参考、ti_drivers_config.c 中的代码未从默认设置更改。 但这里仅供参考。
      1. /*
         *  ======== gpioPinConfigs ========
         *  Array of Pin configurations
         */
        GPIO_PinConfig gpioPinConfigs[33] = {
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_HIGH | GPIOCC32XX_CFG_USE_STATIC, /* GPIOCC32XX_GPIO_07 */
            GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_HIGH | GPIOCC32XX_CFG_USE_STATIC, /* GPIOCC32XX_GPIO_08 */
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIOCC32XX_DO_NOT_CONFIG, /* Pin not available */
            GPIOCC32XX_DO_NOT_CONFIG, /* Pin not available */
            GPIOCC32XX_DO_NOT_CONFIG, /* Pin not available */
            GPIOCC32XX_DO_NOT_CONFIG, /* Pin not available */
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
            GPIO_CFG_INPUT | GPIOCC32XX_DO_NOT_CONFIG,
        };
        
        PowerCC32XX_ParkInfo parkInfo[];
        /*
         *  This structure defines the configuration for the Power Manager.
         */
        const PowerCC32XX_ConfigV1 PowerCC32XX_config = {
            .policyInitFxn             = PowerCC32XX_initPolicy,
            .policyFxn                 = PowerCC32XX_sleepPolicy,
            .enterLPDSHookFxn          = NULL,
            .resumeLPDSHookFxn         = NULL,
            .enablePolicy              = false,
            .enableGPIOWakeupLPDS      = true,
            .enableGPIOWakeupShutdown  = true,
            .enableNetworkWakeupLPDS   = true,
            .wakeupGPIOSourceLPDS      = PRCM_LPDS_GPIO13,
            .wakeupGPIOTypeLPDS        = PRCM_LPDS_FALL_EDGE,
            .wakeupGPIOFxnLPDS         = NULL,
            .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,
            .latencyForLPDS            = 20000,
            .keepDebugActiveDuringLPDS = false,
            .ioRetentionShutdown       = PRCM_IO_RET_GRP_0|PRCM_IO_RET_GRP_1,
            .pinParkDefs               = parkInfo,
            .numPins                   = 31
        };
        
        /*
         * This table defines the parking state to be set for each parkable pin
         * during LPDS. (Device resources must be parked during LPDS to achieve maximum
         * power savings.)  If the pin should be left unparked, specify the state
         * PowerCC32XX_DONT_PARK.  For example, for a UART TX pin, the device
         * will automatically park the pin in a high state during transition to LPDS,
         * so the Power Manager does not need to explictly park the pin.  So the
         * corresponding entries in this table should indicate PowerCC32XX_DONT_PARK.
         */
        PowerCC32XX_ParkInfo parkInfo[] = {
        /*        PIN                    PARK STATE              Pin Alias
           -----------------  ------------------------------     ---------------*/
        
          {PowerCC32XX_PIN01, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP10 */
          {PowerCC32XX_PIN02, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP11 */
          {PowerCC32XX_PIN03, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP12 */
          {PowerCC32XX_PIN04, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP13 */
          {PowerCC32XX_PIN05, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP14 */
          {PowerCC32XX_PIN06, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP15 */
          {PowerCC32XX_PIN07, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP16 */
          {PowerCC32XX_PIN08, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP17 */
          {PowerCC32XX_PIN13, PowerCC32XX_WEAK_PULL_DOWN_STD},
          {PowerCC32XX_PIN15, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP22 */
          {PowerCC32XX_PIN16, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TDI */
          {PowerCC32XX_PIN17, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TDO */
          {PowerCC32XX_PIN18, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP28 */
          {PowerCC32XX_PIN19, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TCK */
          {PowerCC32XX_PIN20, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TMS */
          {PowerCC32XX_PIN21, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* SOP2 */
          {PowerCC32XX_PIN29, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP26 */
          {PowerCC32XX_PIN30, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP27 */
          {PowerCC32XX_PIN45, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP31 */
          {PowerCC32XX_PIN50, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP00 */
          {PowerCC32XX_PIN52, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP32 */
          {PowerCC32XX_PIN53, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP30 */
          {PowerCC32XX_PIN55, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP01 */
          {PowerCC32XX_PIN57, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP02 */
          {PowerCC32XX_PIN58, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP03 */
          {PowerCC32XX_PIN59, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP04 */
          {PowerCC32XX_PIN60, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP05 */
          {PowerCC32XX_PIN61, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP06 */
          {PowerCC32XX_PIN62, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP07 */
          {PowerCC32XX_PIN63, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP08 */
          {PowerCC32XX_PIN64, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP09 */
        };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们非常感谢您对这款 Santhosh 的支持、我相信 Alan 会尽快回复您。

    我对您的测试设置有一个问题。 当您将 GPIO7/8~为低保持电平并使用逻辑分析仪进行测量时、您是否添加了一个非常弱的电容器(10MΩ 1 μ F?) 从外部上拉到这些引脚?

    逻辑分析仪本身将以地为基准、这意味着只需将其连接到任何特定引脚、即可有效地为该引脚添加弱下拉电阻。 因此、无论保持功能是正常工作(在 HIB 期间将 GPIO 保持在低电平)还是不工作(在 HIB 期间将 GPIO 悬空)、您都会在示波器捕获中看到相同的结果、因为示波器本身会将 GPIO 偏置到接地端。

    我认为、具体证明保持功能有效的唯一方法是对 GPIO 进行弱拉 与保持状态的方向相反 、并看到在 HIB 期间 MCU 克服了这种外部 偏置并使 GPIO 保持在正确的期望状态。

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

    对于早期的测量、这些引脚上没有任何外部上拉电阻器。  

    但是,只是尝试了 内部上拉 GPIO 引脚 (GPIO 7 和 8)。 这是通过 SysConfig 进行配置的、并按如下方式产生 ti_drivers_config.c 更改 (PowerCC32XX_WEAK_PULL_UP_STD)。 如果您在  上一篇文章中查看 PowerCC32XX_PIN62 和 PowerCC32XX_PIN63、您将会看到两者之间的区别。  

    PowerCC32XX_ParkInfo parkInfo[] = {
    /*        PIN                    PARK STATE              Pin Alias
       -----------------  ------------------------------     ---------------*/
    
      {PowerCC32XX_PIN01, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP10 */
      {PowerCC32XX_PIN02, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP11 */
      {PowerCC32XX_PIN03, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP12 */
      {PowerCC32XX_PIN04, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP13 */
      {PowerCC32XX_PIN05, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP14 */
      {PowerCC32XX_PIN06, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP15 */
      {PowerCC32XX_PIN07, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP16 */
      {PowerCC32XX_PIN08, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP17 */
      {PowerCC32XX_PIN13, PowerCC32XX_WEAK_PULL_DOWN_STD},
      {PowerCC32XX_PIN15, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP22 */
      {PowerCC32XX_PIN16, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TDI */
      {PowerCC32XX_PIN17, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TDO */
      {PowerCC32XX_PIN18, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP28 */
      {PowerCC32XX_PIN19, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TCK */
      {PowerCC32XX_PIN20, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* TMS */
      {PowerCC32XX_PIN21, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* SOP2 */
      {PowerCC32XX_PIN29, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP26 */
      {PowerCC32XX_PIN30, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP27 */
      {PowerCC32XX_PIN45, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP31 */
      {PowerCC32XX_PIN50, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP00 */
      {PowerCC32XX_PIN52, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP32 */
      {PowerCC32XX_PIN53, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP30 */
      {PowerCC32XX_PIN55, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP01 */
      {PowerCC32XX_PIN57, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP02 */
      {PowerCC32XX_PIN58, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP03 */
      {PowerCC32XX_PIN59, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP04 */
      {PowerCC32XX_PIN60, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP05 */
      {PowerCC32XX_PIN61, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP06 */
      {PowerCC32XX_PIN62, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP07 */
      {PowerCC32XX_PIN63, PowerCC32XX_WEAK_PULL_UP_STD},   /* GP08 */
      {PowerCC32XX_PIN64, PowerCC32XX_WEAK_PULL_DOWN_STD},   /* GP09 */
    };

    结果是相同的。 逻辑分析仪显示、GPIO 7 和 8 都被驱动至低电平、并在保持状态下保持低电平。

    希望这有助于您一方的验证。 你可以尝试一下吗?  

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

    你好、Santhosh、

    对不起,我生病了,我能够尝试这个结果,我们已经在这里。  如 CJ 所述、连接分析仪也会改变结果。  连接逻辑分析仪并运行测试即可。  当我从晶体管的另一侧断开分析仪和监视器时、结果会很糟糕。

    我没有可用于试用的 LaunchPad 电路板。

    谢谢、

    Alan

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

    尊敬的 Alan、CJ:

    我与我们的硬件工程师讨论了这个问题、他同意在我们测量 GPIO 时逻辑分析仪会影响逻辑电平(低电平)。 建议尝试通过测试将 GPIO 在休眠状态下驱动至高电平、然后查看驱动器是否可以在休眠期间驱动/保持信号处于高电平状态。  

    从该实验中、我首先看到 GPIO 仅在内部上拉电阻器的休眠中没有保持高电平。 GPIO8 会暂时变为高电平、但立即被驱动为低电平并处于休眠状态。  

    但是 、应用驱动程序 (GPIO_CFG_OUT_HIGH) 后、GPIO8 在休眠时保持高电平!  请参阅下面的屏幕截图。 在我的实验中、GPIO7 被驱动为低电平(使用内部下拉电阻)、但 GPIO8  在休眠模式下被驱动为高电平(使用 GPIO_CFG_OUT_HIGH)。  

    根据此结果、我们可以 针对您的场景反转逻辑电平。 你能试一下你身边的以下项目吗?

    更新 powerShutdown() 以使 GPIO8 配置如下?

    GPIO_PinConfig gpiocfg = GPIOCC32XX_GPIO_08| GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_LOW | GPIOCC32XX_CFG_USE_STATIC;

    GPIO8 配置为应用的输出。

    如果这有帮助或不有用、请告诉我们。  

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

    您好 Alan、

    希望您做得好。 您有机会尝试一下吗?