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.

[参考译文] CCS/TM4C123GH6PM:休眠(HIBERNATE_INT_RTC_MATCH_0)有时无法唤醒

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/596835/ccs-tm4c123gh6pm-hibernate-hibernate_int_rtc_match_0-sometimes-can-not-wake-up

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

工具/软件:Code Composer Studio

您好!

我们使用 EK-TM4C123GXL 进行测试休眠功能,参考代码表 SW-TM4C-DRL-UG-2.1.0.12573用户指南第318页和 QS-RGB 项目文件。

我们测试 了60秒、15秒或600秒的休眠 RTCMatchSet 唤醒时间、无法在 不同的时间唤醒、 但当我们每60秒设置一次唤醒、

无法在644+60 秒内唤醒。 参考信息如下: 请帮助我们重新关注此问题。

谢谢

由 HC 提供。 黄

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

    您好!

     我不清楚您的描述。 我知道您在从休眠模式唤醒时遇到问题。 我不知道如何解释您的终端窗口。 什么是(644/600)? 644表示什么、600表示什么? 您说"但是、当我们每60秒设置一次唤醒、无法在644 + 60 秒内唤醒。" 这意味着什么?

     我建议您下载最新的 TivaWare 版本2.1.4.178、并尝试查看它是否会对行为产生影响。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    "644"是从 RTC 模块读取的自由 RUM 计数器值,600是入侵数据,当 TM4C 复位时,RTC 从0开始。
    我们每18秒就会进入深度睡眠模式,在唤醒后60秒。 首先进入深度睡眠模式的是 RTC 18、并从 HIBERNATE_INT_RTC_MATH_0 "RTC (18+60)"唤醒、接下来进入深度睡眠模式的是 RTC 96、并从 RTC 156唤醒
    . 然后附加的图像 RTC 644进入深度睡眠时间模式,因此精确唤醒时间为 RTC 708,但不会唤醒。

    按照以下步骤修改代码以供您参考。

    无效 AppHibernateEnter (空)

    uint32_t ui32RtcMatch;
    //
    //通知我们将要休眠的 UART 命令行用户
    //
    SysTickDisable();
    SysTickIntDisable();

    HibernateRTCEnable();
    ROM_SysCtlPeripheralClockGating (真);
    HibernateWakeSet (HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);

    //
    //将状态信息存储到电池供电的内存中
    //由于 sizeof 返回我们转换为字和强制的字节数
    //四舍五入到下一个整字。
    //
    HibernateDataSet (((uint32_t*)&g_sAppState、sizeof (tAppState)/4+1);

    ui32RtcMatch = HibernateRTCGet ()+ 60;
    HibernateRTCMatchSet (0、ui32RtcMatch);// Hc
    if (ui32RtcMatch!= HibernateRTCMatchGet (0))
    UARTprintf ("匹配计数器错误...\n");
    //HC 休眠 RTCMatchSet (0、60);
    HibernateIntEnable (HIBERNATE_INT_RTC_MATH_0);
    HibernateIntClear (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_LOW_BAT | HIBERNATE_INT_RTC_MATH_0);

    //禁用 LED 100毫秒,让用户知道我们是谁
    //准备好休眠,并将在释放按钮时休眠
    //
    RGBDisable();
    SysCtlDelay (SysCtlClockGet ()/3/10);
    RGBEnable();

    SysCtlDelay (100);

    //
    //禁用 LED 以实现节能并进入休眠模式
    //
    RGBDisable();
    SysTickDisable();
    SysTickIntDisable();

    HibernateIntRegister (HibernateHandler);

    SysCtlDeepSleep ();

    UARTprintf ("RTC 匹配 INT...\n");

    UARTprintf ("从深度睡眠中唤醒...\n");

    //
    //初始化 SysTick 中断以处理颜色和按钮。
    //
    SysTickPeriodSet (SysCtlClockGet ()/ APP_SYSTICKS_PER_SEC);// 50ms
    SysTickEnable();
    SysTickIntEnable();
    IntMasterEnable();

    HibernateDataGet ((uint32_t*)&g_sAppState、sizeof (tAppState)/ 4 + 1);

    UARTprintf ("RTC 计数:(%u / 600)\n\r\n、HibernateRTCGet ());

    RGBEnable();

    ui32HibModeEntryCount = 0;
    G_sAppState_ui32Mode = APP_MODE_NORMAL;



    无效休眠处理程序(无效)

    uint32_t ui32Status;
    //
    //获取中断状态并清除所有挂起的中断。
    //
    ui32Status = HibernateIntStatus (1);
    HibernateIntClear (ui32状态);

    //
    //处理 RTC 匹配0中断。
    //
    if (ui32Status 和 HIBERNATE_INT_RTC_MATH_0)

    //UARTprintf ("RTC 匹配 INT...\n");

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hong Chun、
    感谢您的澄清。 现在、我了解了您如何进入休眠模式并从休眠模式中唤醒。 18秒后进入深度睡眠模式的代码在哪里? 在您的代码中、您调用 SysCtlDeepSleep ()、但我在调用之前看不到18秒的计时器。 也许我缺少一些东西。 请您澄清一下吗? 否则、我不会发现任何明显的错误。 也许你也可以尝试注释掉 AppHibernateEnter()内的所有 UARTprintf()。 UARTprintf()没有任何问题,但我只是想知道它们是否有任何影响。 过去、我知道将它们放在 ISR 中有时会影响 ISR 退出时间。 尽管您可能不会遇到这种情况、但请尝试一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    18个器件的主循环控制请在休眠释放后的 UARTprintf ()上参考以下内容。

    //
    //
    //主函数执行初始化并管理系统。
    //
    //在系统和编译器预初始化序列之后自动调用。
    //执行系统初始化调用,如果需要,从休眠状态恢复,以及
    //然后管理系统的应用环境职责。
    //
    //
    内部
    main (空)

    uint32_t ui32Status;
    uint32_t ui32 ResetCas;
    int32_t i32CommandStatus;


    //
    //为中断处理程序启用堆栈。 这允许使用浮点
    //在中断处理程序中使用的指令,但代价是
    //额外的堆栈用法。
    //
    ROM_FPUEnable();
    ROM_FPUStackingEnable();

    //
    //将系统时钟设置为与外部晶振一起在 PLL 的40MHz 频率下运行
    //参考。
    //
    ROM_SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz |
    SYSCTL_OSC_MAIN);

    //
    //启用休眠模块
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);

    //
    //启用和初始化 UART。
    //
    ConfigureUART();

    UARTprintf ("欢迎使用 Tiva C 系列 TM4C123G LaunchPad!\n");
    UARTprintf ("键入'help'查看命令列表\n");
    UARTprintf (">");

    //
    //确定发生系统复位的原因并做出相应的响应。
    //
    /*HC
    ui32 ResetCase= SysCtlResetCauseGet ();
    SysCtlResetCauseClear (ui32 ResetCase);
    if (ui32 ResetCases = SYSCTL_CAUSE_POR)

    if (HibernateIsActivate())

    //
    //读取状态位以查看导致唤醒的原因。
    //
    ui32Status = HibernateIntStatus (0);
    HibernateIntClear (ui32状态);

    //
    //唤醒是由于按钮所致。
    //
    IF (ui32Status 和 HIBERNATE_INT_PIN_WAKE)

    UARTprintf ("休眠唤醒引脚唤醒事件\n");
    UARTprintf (">");

    //
    //从电池供电恢复应用程序状态变量
    //休眠存储器。 将 ui32Mode 设置为 NORMAL。
    //
    HibernateDataGet ((uint32_t*)&g_sAppState、
    sizeof (tAppState)/ 4 + 1);
    G_sAppState_ui32Mode = APP_MODE_NORMAL;


    //
    //唤醒是由于 RTC 匹配所致
    //
    否则、如果(ui32Status 和 HIBERNATE_INT_RTC_MATH_0)

    UARTprintf ("休眠 RTC 唤醒事件\n");
    UARTprintf (">");
    //
    //从电池供电恢复应用程序状态变量
    //休眠存储器。 将 ui32Mode 设置为快速刷写 RGB。
    //
    HibernateDataGet ((uint32_t*)&g_sAppState、
    sizeof (tAppState)/ 4 + 1);
    G_sAppState_ui32Mode = APP_MODE_HIB_FLASH;



    其他

    //
    //首次加电时重置为冷态。
    //
    UARTprintf ("上电复位。 休眠未激活。\n");
    UARTprintf (">");

    G_sAppState_ui32Mode = APP_MODE_NORMAL;
    G_sAppState_fColorWheelPos = 0;
    G_sAppState_fIntensity = APP_ENSILED_DEFAULT;
    G_sAppState_ui32Buttons = 0;


    其他

    //
    //发生外部管脚复位或其他复位事件。
    //
    UARTprintf ("外部或其他复位\n");
    UARTprintf (">");

    //
    //将其视为冷上电复位,而不从休眠状态恢复。
    //
    G_sAppState_ui32Mode = APP_MODE_NORMAL;
    G_sAppState_fColorWheelPos = APP_PI;
    G_sAppState_fIntensity = APP_ENSILED_DEFAULT;
    G_sAppState_ui32Buttons = 0;

    //
    //在我们稍后调用 AppRainbow 时,颜色将获得默认初始化。
    //

    *
    UARTprintf ("外部或其他复位\n");
    UARTprintf (">");

    G_sAppState_ui32Mode = APP_MODE_NORMAL;
    G_sAppState_fColorWheelPos = APP_PI;
    G_sAppState_fIntensity = APP_ENSILED_DEFAULT;
    G_sAppState_ui32Buttons = 0;

    //
    //初始化休眠模块的计时
    //
    HibernateEnableExpClk (SysCtlClockGet ());
    HibernateRTCSet (0);// Hc
    HibernateRTCEnable();// HC

    //
    //初始化 RGB LED。 AppRainbow 通常仅从中断调用
    //上下文。 可以在此处调用以强制进行初始颜色更新、因为
    //中断尚未启用。
    //
    RGBInit (0);
    RGBIntensitySet (g_sAppState_fIntensity);
    AppRainbow (1);
    RGBEnable();

    //
    //初始化按钮
    //
    ButtonInit();

    //
    //现在对深度睡眠模式进行编程:自动时钟门控
    //
    SysCtlPeripheralClockGating (真);

    //
    //编程哪些外设将被选通,哪些外设必须保留
    //在深度睡眠中启用
    //
    SysCtlPeripheralDeepSlepEnable (SYSCTL_Periph_GPIOF);
    SysCtlPeripheralDeepSlepEnable (SYSCTL_Periph_HIBERNATE);
    /*
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_ADC1);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_GPIOA);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_GPIOC);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_I2C0);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_UART0);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_UART1);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_UART3);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_UART5);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_TIMER0);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_Timer1);
    SysCtlPeripheralDeepSlepDisable (SYSCTL_Periph_TIMER2);
    *
    //
    //选择深度睡眠时钟源作为 LFIOSC 的1分频
    //sysctl_DSLP_OSC_INT30
    //rom_SysCtlDeepSlepClockSet (SYSCTL_DSLP_DIV_1 | SYSCTL_DSLP_OSC_EXT32|SYSCTL_DSLP_PIOSC_PD);//设置深度睡眠
    ROM_SysCtlDeepSlepClockSet (SYSCTL_DSLP_DIV_1 | SYSCTL_DSLP_OSC_EXT32|SYSCTL_DSLP_MOSC_PD);//设置深度睡眠

    /*
    SysCtlDeepSlepClockConfigSet( 64、
    (SYSCTL_DSLP_OSC_INT30 | SYSCTL_DSLP_PIOSC_PD |
    SYSCTL_DSLP_MOSC_PD );
    *

    //
    //选择电源模式以将闪存和 SRAM 置于低功耗模式
    //选择睡眠模式中的 LDO 和待断电的 TS
    //
    SysCtlDeepSleep PowerSet (SYSCTL_LDO_SLEEP|SYSCTL_TEMP_LOW_POWER|SYSCTL_FLASH_LOW_POWER|SYSCTL_SRAM_LOW_POWER);

    //
    //选择 LDO 以在深度睡眠中扩展到0.9V
    //
    SysCtlLDODeepSlepSet (SYSCTL_LDO_0_90V);


    //
    //初始化 SysTick 中断以处理颜色和按钮。
    //
    SysTickPeriodSet (SysCtlClockGet ()/ APP_SYSTICKS_PER_SEC);
    SysTickEnable();
    SysTickIntEnable();
    IntMasterEnable();

    //
    //永远旋转并等待回车或状态更改。
    //
    while (1)


    UARTprintf ("\n>");


    //
    // Peek 以查看完整命令是否已准备好进行处理
    //
    while (UARTPeek ('\r')=-1)

    //
    //毫秒延迟。 这里的 SysCtlSleep ()也是可以的。
    //
    SysCtlDelay (SysCtlClockGet ()/(1000 / 3));

    如果(g_BPoll)

    G_bPoll = false;

    if (g_sAppState.ui32Mode!= APP_MODE_HIB)

    ui32HibModeEntryCount = ui32HibModeEntryCount + 1;
    if (ui32HibModeEntryCount = 580)

    UARTprintf ("正在进入深度睡眠...\n");
    UARTprintf ("RTC 计数:(%u / 600)\n\r\n、HibernateRTCGet ());

    if (ui32HibModeEntryCount >= 600)// 30秒

    ui32HibModeEntryCount = 0;
    G_sAppState_ui32Mode = APP_MODE_HIB;




    //
    //检查模式的更改并在请求时进入休眠状态。
    //在中断上下文中处理所有其他模式更改。
    //
    if (g_sAppState.ui32Mode = APP_MODE_HIB)

    AppHibernateEnter();



    //
    //检测到'\r\n'从用户获取文本行。
    //
    UARTgets (g_cInput、sizeof (g_cInput));

    //
    //将线路从用户传递到命令处理器。
    //将对其进行解析并执行有效的命令。
    //
    i32CommandStatus = CmdLineProcess (g_cInput);

    //
    //处理命令错误的情况。
    //
    if (i32CommandStatus = CMDLINE_BAD_CMD)

    UARTprintf ("命令错误!\n");


    //
    //处理过多参数的情况。
    //
    否则、如果(i32CommandStatus = CMDLINE_TOW_DONE_args)

    UARTprintf ("命令处理器的参数太多!\n");


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

    此问题是否有任何更新?
    感谢您的支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jefferey、

     您能否首先检查 HIBn 引脚 是否正确置位为低电平以进入休眠模式?

     您是否有另一个电路板可以测试您是否观察到相同的行为?

     我想知道下面的勘误表是否导致了问题。 请查看并按照建议实施权变措施、然后尝试是否有所不同。