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.

[参考译文] TM4C123GH6PM:RTC 不提供正确的亚秒计数

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/612883/tm4c123gh6pm-rtc-does-not-give-the-correct-sub-second-count

器件型号:TM4C123GH6PM

我能够以秒为单位获得 RTC 计数、但 次秒计数不正确。  

我附加了我的程序和 RTC valuese2e.ti.com/.../RTC.c 的快照

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您告诉我们您正在做什么、从哪里获得亚秒值、如何配置计时器、可能会有所帮助... 还应分享您使用此类配置的原因、以及您希望实现的目标...
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在上面的注释中,我附加了一个名为 rtc.c 的文件。
    我正在开发一个应用、在该应用中、我需要在每个传入的 CAN 消息中添加一个时间戳。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jithin、
    您是否查看了 MCU 数据表上的"7.3.5.1 RTC 计数器-秒/亚秒模式"?
    我在便携式设备上、看不到您附加的文件、但您可能没有启用亚秒?
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的程序如下所示。我正在使用 TI 的外设库进行编程。
    它说


    #include
    #include
    #include
    #include
    #include
    #include "inc/tm4c123ghp6.h"//将此信息更改为要使用的微信息。
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"
    #include "driverlib/hibernate.h"

    void enableRTC (void)


    //启用休眠模块。
    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);

    //等待休眠模块准备就绪。
    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))


    HibernateEnableExpClk (SysCtlClockGet ());

    //
    //等待模块上电的时间。
    //

    //配置休眠模块的时钟源并启用
    // RTC 功能。
    HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
    HibernateRTCEnable();


    void setRtcValue (uint32_t time)

    //将 RTC 设置为初始值。
    HibernateRTCSet (Time);


    uint32_t getRtcValueInSec (空)

    返回 HibernateRTCGet ();

    uint32_t getRtcValue (空)

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

    您没有包括整个程序、您是否正在读取休眠中断例程中的子秒? 如果是这样、除非您运行了一些其他中断例程、这些中断例程只会导致休眠中断例程延迟几次、否则亚秒值可能每次都相同。 尝试添加一些任意延迟,看看您是否获得了与 HibernateRTCSSGet 不同的值。

    在将来发布代码时,我建议您使用“丰富的格式”并使用“ "格式选项。 它会保留间距并使代码可读性更高。

    uint32_t getRtcValue (void)
    {
    return HibernateRTCSSGet ();
    }
    

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob、富格式化是否有可能成为默认模式???
    这种情况 故事每天都在这里重复、对于新用户来说、我们可以看到、这一点不太明显。 如果丰富的模式是标准的、那么上面所有这些彩色按钮的存在肯定会邀请您探索!
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob Crosby:
    我不使用休眠中断例程。 我的主要内容类似这样。

    void main()

    enableRTC();
    setRtcValue (43200);//12 PM

    while (1)

    uint32_t timeInSecond、timeInSubSecond;
    timeInSecond = getRtcValueInSec ();
    timeInSubSecond = getRtcValue();


    在这里、timeInSecond 将每秒更改一次。 但是、TimeInSubSecond 有时会在几秒钟内显示相同的值、然后它将更改为任何其他值。 在我的第一次提交中、我附加了一个屏幕截图、其中 PC 时间和 timeInSecond 是相同的。 但 TimeInSubSecond 小于 timeInSecond。当 timeInSecond 从48673增加到48690 (即17秒)时、TimeInSubSecond 是相同的(30089)。 如果我是正确的 TimeInSubSecond 应该以1/32、768秒的分辨率递增。 也就是说,每秒应该得到32768的计数。17秒应该是17*32768。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    子秒寄存器的宽度仅为15位。 函数 getRtcValue()永远不会返回大于32、767的数字。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jithin、
    我是否可以建议您从嵌入式 RTC 中改用毫秒?
    如果将 SysTick 配置为每毫秒中断一次,并使 ISR 内部的 UINT32*全局变量递增,则可以在极少的资源消耗下为所有系统提供非常方便的毫秒计数器(甚至无需清除 SysTick 的中断标志)。
    *如果您计划让您的产品开启49天以上,则需要更宽的变量。
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bruno Saraiva 和 Bob Crosby 为我提供的帮助