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.

[参考译文] TM4C1290NCPDT:休眠模块初始化

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/573457/tm4c1290ncpdt-hibernation-module-initialization

器件型号:TM4C1290NCPDT

我正在尝试初始化休眠模块、以便使用 TM4C1290NCPDT 上的 RTC 功能、并遇到很多问题。

我们的设计采用了外部32.768kHz 振荡器。 然而、在调试我的问题时、我发现我们的电路板制造存在一些质量问题、在我最初的努力中、我真正遇到的是3V VBAT 短接至 XOSC0。 我已经移除了振荡器和短路、使得 XOSC0和 XOSC1现在悬空(无连接)。

相关代码如下所示。 在当前状态下、处理器在 HibernateEnableExpClk (sys_clock)调用中陷入无限循环。 我已经单步执行汇编、可以看到它尝试在 HIBCTL 寄存器中标记 CLK32EN 并等待写入完成标志(WRC)。 然而、所有写入最后完成的操作是复位 WRC 位、这一位永远不会再次变为高电平、从而导致代码一直等待 WRC 位、从而导致无限循环。

我在这里出了什么问题?

SYS_CLOCK = SysCtlClockFreqSet (SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、25000000);

SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
while (!SysCtlPeripheralReady (SYSC_HIBERNATHIBERNATE_WAITH

)(SYSC_HIBERNATHIBERNATHIBERM)(SYSC_HIBERNATHIBERNATHIBERNATHINCH)(SYNTRHOLATE)(SY_HIBERNATHIBERNATHIBERNATHIBERNATHIBERNATHIBERNATHIBERNATE_WAY)(SY_HIBERNATHIBERNATHINCH







  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想问题是、由于 HIBCTL 寄存器的默认值是 OSCSEL=0 (外部32KH osc 源)、当您调用 HibernateEnableExpClk ()时、寄存器写入等待与外部32KHz 晶振同步。 由于您的硬件中没有可用的外部32KHz 晶振、因此写入永远不会完成、WRC 位保持低电平。 一旦您的硬件被修复、此问题就会解决。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bob。 您完全正确。 问题出在 HIBCTL 寄存器的 OSCSEL 位。

    我能够使用内部振荡器来初始化休眠模块、只需一次手动设置 CLK32EN 位和 OSCSEL 位、而不是使用 TivaWare 库 API 调用来初始化休眠模块。 尽管内部低频振荡器的 RTC 运行不精确、但现在我可以在重新设计样片板的同时继续开发。 下面是我为未来的 Googleers 修改的代码。

    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE)
    ){
    //等待休眠模块初始
    化}
    if (!HibernateIsActive())
    {
    tempRegVal = HWREG (HIB_CTL);
    while (!(tempRegVal & HIB_CTL_WRC))
    {
    //等待 WRC 位指示寄存器已准备好写入
    tempRegVal = HWREG (HIB_CTL);
    }
    HWREG (HIB_CTL)= tempRegVal | HIB_CTL_OSCSEL | HIB_CTL_CLK32EN;
    HibernateRTCEnable();
    HibernateCounterMode (HIBERNATE_COUNTER_24HR);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您考虑他人并发布您的代码。 如果您选择上面我的建议答案帖子上的"验证答案"按钮、这也将帮助其他人找到您的解决方案的此帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    完成。