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.

[参考译文] TM4C123GH6PZ:使用带有调整寄存器的 RTC

Guru**** 2484615 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/728026/tm4c123gh6pz-using-the-rtc-with-the-trim-register

器件型号:TM4C123GH6PZ
 我对休眠期间的 RTC 有几个问题、我注意到时钟运行得太快。
我在处理器规格中读出了 TRIM 寄存器: 休眠 RTC 修正(HIBRTCT)
应使用我理解的值来更正时间。
如何设置该寄存器?
什么影响该寄存器的值?
我使用的每个不同 MCU 是否会有所不同?
将其设置为设备后,所需的值是否可以更改? (例如温度是否发生变化)
非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    数据表中介绍了如何设置寄存器。 例如、如果 RTC 的运行速度比预期的要快、那么您需要将大于标称值0x7FFF 的值加载到 Trim 寄存器中。 0x7FFF 的原因是0x7FFF * 32.768kHz 等于1Hz。 每隔64秒、修整值将用于计算额外的亚秒数。 假设您将0x8002写入调整寄存器。 RTC 将每隔64秒计数额外的3个亚秒周期。 三个计数周期等于大约91.5uS (3 * 1/32.768kHz)。

    我想您还可以参考您选择的32.768kHz 外部振荡器的数据表、了解温度范围内的 IT 容差/稳定性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速重播、

    我将需要有关温度问题的更多帮助、
    您提到了哪些不同的外部振荡器? (您是指 VDD3ON 模式吗?)
    我找不到任何有关温度对振荡器的影响的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nadav、
    您将使用哪款32.768kHz 振荡器? 我参考振荡器数据表、了解其在整个温度范围内的容差和稳定性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaa]Hi Nadav、
    您将使用哪款32.768kHz 振荡器? 我参考振荡器数据表、了解其在整个温度范围内的容差和稳定性。

    [/报价]

    大家好、Charles、我不确定您的意思、我没有编写该代码、所以我还在学习 RTC。

    以下是 init 函数:

    void RTC_init (void)
    {
    int32_t ui32Status = 0U;
    //启用休眠模块。
    //
    
    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    
    //
    //等待休眠模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))
    {
    }
    
    HibernateEnableExpClk (SysCtlClockGet ());
    HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
    HibernateRTCEnable();
    if (HibernateIsActivate())
    {
    //
    //读取状态以确定唤醒原因。
    //
    ui32Status = HibernateIntStatus (false);
    //
    //测试状态位以查看原因。
    //
    IF (ui32Status 和 HIBERNATE_INT_PIN_WAKE)
    {
    //
    //唤醒是由于 WAKE 管脚置位所致。
    //
    }
    if (ui32Status 和 HIBERNATE_INT_RTC_MATH_0)
    {
    //
    //唤醒是由 RTC 匹配寄存器引起的。
    //
    }
    //
    //恢复以前保存的程序状态信息
    //休眠。
    //
    //HibernateDataGet (pui32NVData、64);
    //
    //现在已确定唤醒原因并已显示状态
    //恢复后,程序可以继续使用正常的处理器和
    //外设初始化。
    // ui32Status = HibernateIntStatus (0);
    HibernateIntClear (ui32状态);
    RTC_GetTime();
    }
    } 




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

    您好!

     RTC 可由三个不同的时钟源计时? 请参阅下面的内容。 前两个示例是外部32.768kHz 振荡器或外部32.768kHz 时钟源。 您曾问温度如何影响振荡器。 由于这些是外部组件、您需要参考您选择的外部振荡器的数据表。 您的外部振荡器的供应商应该在数据表中提供有关温度对振荡器稳定性和容差的影响的信息。  

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

    哪个代码行定义了时钟源?

    是:

    HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nadav、
    是的、此行指定要使用的外部32.768kHz 晶体。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、现在我明白了。
    我不知道电路板上有一个外部振荡器。

    我看到 RTC 在24小时后大约关了半个小时。
    我是否会使用内部低频振荡器获得更好的结果?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nadav、

     您要谈论的是哪个板? 我假设这是您自己的定制板、对吧?

     如果使用内部 LFIOSC、精度将会非常差。 LFIOSC 是器件的一部分、因此它记录在数据表中、以了解其电气时序规格。 请参阅下面的内容。 您可以看到、频率在10kHz 和75kHz 之间差异很大。 如果您希望获得壁式时钟精度、那么肯定不会选择您的振荡器。 如果您需要精度、则必须使用外部晶体。 请访问 Mouser.com 或 Digikey.com 以查找您的晶体振荡器并阅读其数据表。 您应该能够找到具有极低 ppm 的32.768kHz 振荡器。  

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