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.

[参考译文] CC1312R7:睡眠模式和电流消耗

Guru**** 2482225 points
Other Parts Discussed in Thread: CC1312R7, SYSCONFIG, CC1312R

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1207968/cc1312r7-sleep-mode-and-current-consumption

器件型号:CC1312R7
主题中讨论的其他器件: SysConfigCC1312R

大家好!

我使用 ti-rtos7和 simplelink_cc13xx_cc26xx_sdk_6_20_00_29 SDK 与 CC1312R7 MCU 配合使用。 所有代码均通过 IAR 8.50.9进行编译和刷写。

我正在尝试进入睡眠模式、但似乎没有进入。

此外、电流会保持不变、甚至会从0.48mA 增加到0.7mA。

对于 DIOS 配置、除了用于 TX 并定义为输出的 DIO3外、所有其他 DIO 都定义为具有上拉的输入、如下所示:  

/* DIO1*/   /* CC_GP1_TP        */   GPIO_CFG_INPUT   | GPIO_CFG_IN_pu      | GPIO_CFG_INT_DISABLE、

/* DIO2*/   /* Board_UART_RX    */   GPIO_CFG_INPUT   | GPIO_CFG_IN_pu      | GPIO_CFG_INT_DISABLE、

*/ DIO3*//   * Board_UART_TX     */   GPIO_CFG_OUTPUT  | GPIO_CFG_OUT_HIGH、

*/* DIO4*/   /* I2C_WP            */   GPIO_CFG_INPUT   | GPIO_CFG_IN_pu      | GPIO_CFG_INT_DISABLE、

*/*DIO5*/

要激活睡眠模式、我们通过 DockLight 调用以下命令并获取一个 ACK 响应:  

20/03/2023 17:16:24.779 [TX]- 06 A2 00 01 01 AA 0A.
20/03/2023 17:16:55.137 [RX]- 05 01 00 06 0A [ATE] ACK

该命令用于调用以下函数以进入待机模式、取消约束、关闭 UART 接口和进入睡眠模式。

void ATE_IO_Enter_Standby ( void )

// PowerCC26X2_MODULe.constraintCounts
Static Semaphore_Params semParams;
静态 semaphore_Struct semStruct;
Static Semaphore_handle SemHandle;

//创建互斥量
Semaphore_Params_init (&semParams);
semParams.mode = Semaphore_Mode_binary;
Semaphore_structure (&semStructurt、0、&semParams);
semHandle = semaphore_handle (&semStruct);
//生成 ACK
uint8_t HPR_ack [ sizeof (HPR_msg_header_t)+ sizeof (HPR_PAYLOAD_TYPE_e)+ sizeof (HPR_msg_PAYLOAD_ack_t)+ sizeof (HPR_msg_footer_t)];
HPR_ack_e response_description = HPR_ACK_MESSAGE_LEGAL;

HPR_PrepareAck ((HPR_msg_t_new*) HPR_ack、response_description);
HPR_PrepareMessage ((HPR_msg_t_new*) HPR_ack);
//在关闭之前将 ACK 打印到 UART
UART_WRITE (UART.DRIVER_Handle、HPR_ack、sizeof (HPR_ack));

 //等待一个位...
 for (int index = 0;index < 0xFFFF;++ index)
 {
   asm ("NOP");
 }
 //关闭 UART
 uart_close (uart.driver_handle);


uint_fast32_t mask = Power_getConstraintMask ();
//执行约束清洁更坚固
if ( mask )

  对于(int index = 0;index < PowerCC26X2_NUMCONSTRAINTS;++)
 {         //使用检查掩码状态对所有限制逐个执行该操作
   操作
   {      // PowerCC26X2_MODULe.constraintCounts
     if (mask &(1 << index)))
     {             //启用掩码中正确的位后,释放
                 ///约束,然后再次读取和检查掩码
         power_releaseConstraint( index );
     }
    MASK = Power_getConstraintMask ();
   }
   while ( mask &(1 << index ));
  }

}


if (!board_isClosedPin ( Board_UART_TX ))

 Board_closePin ( Board_UART_TX );
}
if (!board_isClosedPin ( Board_UART_RX ))

 Board_closePin ( Board_UART_RX );
}

Board_openPin (Board_UART_TX, PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_DIS );
Board_openPin (Board_UART_RX, PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_DIS );

睡眠(0xFFFFFFFF);

//输入互斥量
Semaphore_pend (semHandle、BIOS_wait_forever);

返回;
}

假设消除了所有功率限制、电流消耗没有下降和睡眠模式无法进入的原因可能是什么?  

cc1312R7在发布版本中闪存、即使断开所有电缆(如 UART 和 J-Link)后仍保持电流消耗不变、仅保留电源。

请注意、据我所知、该函数过去是在 CC1312R1上调用的、似乎已经起作用。

谢谢你。

-埃伦

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

    查看数据表中的功耗表:

    将标记最接近您测量的位置。 如果您监听(不直接测量) HF 时钟是否打开?  

    您测量的硬件是什么? 另一个选项是具有消耗电流的输入或类似产品。 尝试将所有 Dios 设置为高阻态、以避免上拉。  

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

    您好!

    感谢您的答复。

    我尝试了几种方法、包括更改 DIOS 配置以避免上拉、但在尝试进入待机模式时电流消耗保持不变。

    不过、当我添加到上述函数时、在   调用 SLEEP (0xFFFFFFFF)之后、需要调用 SysCtrlStandby (false、VIMS_ON_CPU_ON_MODE、0)、内容开始发生变化 、并且对电流消耗产生了影响、将电流消耗降至大约150nA。


    但是、如 GhostOf 所连接的表、此测量显示的更是"复位和关断"状态、而不是"待机"状态、该状态应在1μA μ A 左右。

    在将该行为与 CC1312R7上的行为与 CC1312R1的行为进行比较时、CC1312R1会按预期运行并降至大约 1μA μ V

    答:是否可以使用 SysCtrlStandby ()?

    该 API 包括在对 PRCMDeepSleep ()的调用中,因此预期只让 CPU 休眠。  

    有什么建议、为什么器件似乎进入 SHUTDOWN 模式而不进入睡眠模式?

    b.尝试将用于 CC1312R1项目的 ti_devices_config.c 与 CC1312R7 项目中 SysConfig 实用程序(通过 IAR 激活)生成的 ti_devices_config.c 进行比较。

    它们之间的所有定义似乎都与 CC1312R1驱动程序中存在的定义相同、但 CC1312R7驱动程序中不存在该定义:

    #define CC1312R7:SET_CCFG_SIZE_and_DIS_FLAGS_DIS_ALT_DCDC_SETTING 0x0

    此定义是否会使两个  CPU 之间的差异?  

    (请注意、未选中"Enable DCDC"、因此  SET_CCFG_MODE_CONF_DCDC_REARGE 和  SET_CCFG_MODE_CONF_DCDC_ACTIVE 为0x1)

    我想将  CC1312R7:SET_CCFG_SIZE_and_DIS_FLAGS_DIS_ALT_DCDC_SETTING 添加到 CC1312R7驱动器中。 在 SysConfig 实用程序中的哪里可以找到该文件?  

    非常感谢

    此致、

    埃伦

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

    您好、Elan:  

     您参考的 SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_ALT_DCDC_SETTING 似乎不是用户可通过 SysConfig 配置的设置、建议不进行更改。 默认情况下、此设置设为0。

    #define SET_CCFG_SIZE_and_DIS_FLAGS_DIS_ALT_DCDC_SETTING   0x0  //启用备用直流/直流设置
    此文件位于 SDK 中的 source/ti/devicec/cc13x2x7_cc26x2x7/startup_files/ccfg.c 中。 CC1312R 和 CC1312R7中具有相同的默认设置。  
    有趣的是、您之前的代码必须在 ti_devices.config.c 中再次强制定义这一点
    为了调试这种情况、请您构建项目一次。
    然后将其放入 SysConfig。 从编译中排除 ti_devices_config.c
    然后、您可以编辑之前生成的 ti_devices_config.c 文件。 这位于 ccs_project_folder/Debug/syscfg 文件夹中。
    您可以在此处添加一行、然后再次构建项目。 该文件不会被覆盖、因为您已从编译中排除该文件。
      不建议应用程序直接使用 driverlib 中的 SysCtrlStandby () API。 请在 ti_devices_config.c 中尝试进行上述更改 我将看到是否可以执行其他相关测试来检查导致器件不进入待机但空闲状态的原因。  此外、jsut 确保你的调试器没有连接正确吗?
    此致、
    SID
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sid:

     

    非常感谢您的答复和建议。

     

     首先、我来介绍一下我们的硬件设置。  

    为了减少对 CC1312R7测量的任何明显影响、只需将其安装在纸板上、连接到3V 电源、并具有一个用于闪存的 JTAG 接口和一个用于与 Docklight 通信的 UART Rx/Tx 接口。

    (请参阅电子邮件主题中的附件)

     此外、对于您的问题、我们仅以发布版本刷写 CPU、因此对于 ATE 团队执行的任何测试、未连接 IAR 调试器。

    我已经按照您的指令在 SysConfig 中禁用驱动程序的生成、并向驱动程序文件添加了 SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_ALT_DCDC_SETTING。

    我将在收到结果时进行更新。   

    我还想谈谈 SysCtrlStandby (),如果你可以的话。  

    (本文开头所述的待机功能确实会使 CPU 进入 CC1313R1的待机状态、但不会进入 cc1312R7的待机状态)

    (我们同样为 cc1312R1简化了硬件设置)

     

    由于 Power_releaseConstraint 不会影响待机模式、因此我开始尝试直接调用电源相关 API 来查看哪些 API 有效、哪些无效。

    似乎只有调用 SysCtrlStandby ()对电流消耗有任何影响。

    是否应该间接调用 SysCtrlStandby?

      

    此致、

    埃伦

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

    您好、Elan:

    在这里、我想澄清几点。

    1. 这是您运行此测试时执行的唯一函数吗? 如果您正在为外设使用驱动程序、就像您在 UART 中所使用的那样、您甚至无需像在应用中所做的那样自行释放限制。 驱动程序应释放功率限制和依赖项本身。  
    2. 这引出了另一个问题、 您是否在代码中的其他位置设置了功率限制? 代码正在执行、从而不允许待机。 应该弄清楚是什么导致了芯片不允许待机、而不是强制它进入待机状态。 在这里使用 SysCtrlStandby 似乎不是一个好主意。
    3. 当您为 cc1312R1和 CC1312R7生成固件时、 您是使用相同的 SDK 还是使用不同的 SDK 版本来为这两个器件生成固件?
    4. 是否有方法可以在 uart_close()之后检索功率约束掩码?  

    此致、

    SID

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

    尊敬的 Sid:

    在当前项目中、我们在 PGH 器件内使用 CC1312R7 CPU、该器件与面板连接并由面板持续供电。

    在此项目中、CPU 并不希望在正常运行中进入待机模式、在量产版本中也绝不会进入待机模式。

    (但是、在未来、我们 可能需要将 CC1312R7与 powerG 探测器一起使用、这些探测器由电池供电、然后待机将至关重要。)

     

    目前、我们仅在 ATE 多射频测试版本、频率、RTC、电流消耗等测量中需要待机模式

    话虽如此、这意味着出于 ATE 目的、CPU 不会自动进入待机模式、除非我们特别要求它进入待机模式。

    这就是在 STANDBY 函数中释放限制条件的原因。

     

    关于您的问题、

    1. 可以。 在函数退出而未进入待机模式后、应用程序进入空闲模式。
    2. 可以。 无线电任务和 UART 任务在进入其主循环之前设置了限制。  

    调用以下函数来设置约束条件:

    void power_setPowerConstra( void )

      //输入临界区
    #ifdef support_TIRTOS7.
           intptr_t key = GateHwi_enter (power_GateHwi_handle);
    #else       
           UINT gateKey = GateAll_enter( gate );
    #endif //support_TIRTOS7.
     

     //设置功率限制

     power_setConstraint ( PowerCC26XX_SB_VIMS_cache_retain );

     power_setConstraint (PowerCC26XX_SD_disallow);

     power_setConstraint (PowerCC26XX_SB_disallow);

     power_setConstraint (PowerCC26XX_IDLE_PD_disallow);

    #if (已定义(改进_功率_约束)&&(改进_功率_约束== 1))     
            power_setConstraint (PowerCC26XX_IDLE_PD_disallow);
    #else
           power_setConstraint (PowerCC26XX_Need_FLASH_in_idle);
    #endif  

    //退出关键段
    #ifdef support_TIRTOS7.    
            GateHwi_leave (power_GateHwi_handle、key);    
    #else          
        GateAll_Leave ( gate, gateKey );
    #endif  //support_TIRTOS7.
    }      

    无线电任务也设置为:
    PowerCtrlSourceSet (PWRCTRL_PWRSRC_GLDO);              // 0x00000000

     

     3.当我们迁移到 CC1312R7时、我们已经切换到 SDK:simplelink_cc13xx_cc26xx_sdk_6_20_00_29。

     4.是的、运行调试会在调用前捕获以下掩码值 uart_close ():

       屏蔽从值= 31开始并显示了以下值、在循环中循环: 30、28、24、16、0

    此致、
    埃伦

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

    您好、Elan、您好!我们使用什么 SDK 来开发适用于 CC1312R 的应用程序? 如果两个器件上的应用程序级代码相同、则预计这些器件会出现相同的行为。

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

    Sid 您好!

    在 CC1312R1中、我们使用 simplelink_cc13x2_26x2_SDK_4_40_04_04作为 SDK。

    此致、

    埃伦

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

    我没有看到这两个 SDK 之间的电源驱动器源发生变化。 我将与 rnd 进行检查、以查看是否有其他东西阻止它进入待机状态。 但是、您是否可以在两个器件上测试 SDK 中的 GPIO 待机示例并测量设置中的电流?

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

    I Sid、

    我查看了您 在中建议的示例: simplelink_cc13xx_cc26xx_sdk_6_20_00_29\examples\rtos\LP_CC1312R7\drivers\gpiostandb\tirtos7\IAR

    他们做的是一个简单的睡眠()。 这对于模拟进入待机状态是否足够?  
    此外、syscfg 与 ATE 团队用于其测量的方式有所不同、例如直流/直流配置。 对于此测试、我应该保持 syscfg 不变、还是出于 ATE 目的对其进行调整?

    无论如何、我可以在 ewp 文件中添加一个部分来创建发布版本、并且还需要为 R1设置回 env。 我将在 ATE 测试这些后再次回复。

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

    您能概述一下为什么更改直流/直流设置吗? 上一篇文章表明您已更改了  SET_CCFG_SIZE_and_DIS_FLAGS_DIS_ALT_DCDC_SETTING 、这基本上是一个非触摸设置。  

    Sleep ()将在示例中将芯片置于待机状态(如果您尚未这样做,则测量电流配置文件)。 RTOS 将始终尝试将芯片降低到可能的最低电流消耗、而在调用 sleep ()时、它并不会阻止芯片进入睡眠状态(没有驱动程序需要资源等)。

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

    您好!

    抱歉、我没有提到 SET_CCFG_SIZE 与 DIS_FLAGS_DIS_ALT_DCDC_SETTING、正如您所说、这是无关的。

    我之前提到过这些确实会影响其各种测量的方法:
    ATE 要求:
    #define CCFG_FORCE_VDDR_HH 0x1
    #define SET_CCFG_MODE_CONF_DCDC_REARGE 0x1
    #define SET_CCFG_MODE_CONF_DCDC_ACTIVE 0x1
    #define SET_CCFG_MODE_CONF_XOSC_CAP_MOD 0x0
    #define SET_CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA 0x3


    TI RTOS7 GPIO_STANDBY 示例:
    #define CCFG_FORCE_VDDR_HH 0x0
    #define SET_CCFG_MODE_CONF_DCDC_REARGE 0x0
    #define SET_CCFG_MODE_CONF_DCDC_ACTIVE 0x0
    #define SET_CCFG_MODE_CONF_XOSC_CAP_MOD 0x1

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

    此处列出的4种设置由用户定义并取决于您的电路板设计。 您应更改 syscfg 以反映这一点  

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

    谢谢。 当 ATE 获得这些构建的结果时、我将进行更新。

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

    Sid 您好!  

    ATE 响应称、根据示例、构建仿真待机模式正常、电流测量也正常。  

    汇总测试的版本:

    对于 CC1312R1:
    项目: C:\ti/simplelink_cc13x2_26x2_SDK_4_40_04_04\examples\rtos\CC1312R1_LAUNCHXL\drivers\pinStanding\tirtos\IAR\pinStandby CC1312R1_LAUNCHXL_tirtos_IAR.template.eww
    SDK:simplelink_cc13x2_26x2_SDK_4_40_04_04
    IAR:8.50.1

    对于 CC1312R7:
    项目:  
    C:\ti\simplelink_cc13xx_cc26xx_sdk_6_20_00_29\examples\rtos\LP_CC1312R7\drivers\gpiostandal\tirtos7\IAR\gpiostandby_LP_CC1312R7_tirtos7_IAR.template.eww
    SDK:simplelink_cc13xx_cc26xx_sdk_6_20_00_29
    IAR:8.50.9.

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

    您好、Elan:  

    要对此进行汇总、  

    开箱即用 SDK 示例中的两块电路板都达到了预期的待机状态、而且电流消耗数字也达到了预期值?

    现在的问题是、进行测量时这些示例的 SysConfig 与您在未达到待机状态的测试中使用的 SysConfig 是否不同。  

    此致、
    SID  

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

    您好!

    可以、根据 ATE、带有 SDK 示例的两个电路板均达到待机状态。 R7立即下降到大约1.0uA、而 R1花费更长的时间来降低 电流消耗、但达到1.9uA。  

    与使用 SDK 示例进行刷写的 R7使用了相同的 SysConfig、以及无法进入待机模式的版本。

    我们还尝试将示例中任务的代码集成到待机函数中(在随附的 rar 文件中)、但当前显示的是5mA、因此仍然没有影响。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    和 R1花费较长的时间来降低 电流消耗,但达到1.9uA。

    电流消耗与时间的关系曲线是什么样的? 当芯片进入待机状态时、应该会出现即时压降。 如果电流缓慢减小、听起来可能有些引脚未正确定义(悬空或慢放电)  

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

    您好!
    我将附上 ATE 团队捕获的测量值、以比较 R1和 R7的行为。 经过另一个分析、似乎两者都立即进入睡眠状态、但平均电流测量值存在差异、而当放大每个事件脉冲时、行为似乎出于某种原因而有所不同。  


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

    您好、Elan:

    在这两种情况下,似乎都已达到待机状态。 如果是这种情况、在您的电路板中、cc1312r7能够进入待机状态。  

    请您检查重新使用了两个项目的哪些组件、以及两者之间软件的确切差异是什么。 使用开箱即用示例时、他们进入待机状态似乎没有问题。  

    此致、

    SID