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:TM4C12123读取 RTC 不符合预期

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1519589/tm4c123gh6pm-tm4c123-read-rtc-not-as-expected

器件型号:TM4C123GH6PM

工具/软件:

您好:

我按如下方式读取 RTC 秒和秒数:

            // process rtc
            if(!rtc_semaphore) {                                                  // check if rtc is being accessed
                rtc_semaphore = true;                                             // set rtc semaphore true
                g_rtc_mark = HWREG(HIB_RTCC);                                     // mark rtc seconds
                g_rtc_sub_mark = (HWREG(HIB_RTCSS) & HIB_RTCSS_RTCSSC_M);         // mark rtc subseconds
                valid_timing = (g_rtc_mark == HWREG(HIB_RTCC));                   // if seconds are not the same timing is valid
            } else {
                valid_timing = false;                                             // rtc is being accessed
            }
            rtc_semaphore = false;                                                // set rtc semaphore false as soon as we are done with RTC

这在定期触发的循环内运行。 按照数据表中的指示、我先读取 RTCC、然后读取 RTCSS、然后再次读取 RTCC (与第一次读取相比)、只有当两者都相等时、我才处理通过 VALID_TIMING 标志读取的数据。 还有一个 RTC_信 标将在 RTC 被代码的另一部分读取时(例如 usb_handler.h 中)跳过数据包、用于测量传入的同步数据包与 RTC 的差异。

以下是 RTC 和主机时间戳及其差异(以纳米为单位)的日志:

[node-1] [INFO] [1748355072.989121466] [node]: nanos_diff 769990 rtc 1748355072.32386 host 1748355072.989112275
[node-1] [INFO] [1748355072.992817739] [node]: nanos_diff 559546 rtc 1748355072.32514 host 1748355072.992808081
[node-1] [INFO] [1748355072.996931401] [node]: nanos_diff 767505 rtc 1748355072.32642 host 1748355072.996922290
[node-1] [INFO] [1748355073.000778899] [node]: nanos_diff -999196287 rtc 1748355073.32767 host 1748355073.773195
[node-1] [INFO] [1748355073.004645475] [node]: nanos_diff 761379 rtc 1748355073.127 host 1748355073.4637111
[node-1] [INFO] [1748355073.008656346] [node]: nanos_diff 865244 rtc 1748355073.255 host 1748355073.8647226
[node-1] [INFO] [1748355073.012311718] [node]: nanos_diff 614277 rtc 1748355073.383 host 1748355073.12302509
[node-1] [INFO] [1748355073.016466674] [node]: nanos_diff 865056 rtc 1748355073.511 host 1748355073.16459538

发生的情况是、在第二个读数即将结束时、RTC 位于1748355072.32642、下一个读数位于 RTC 1748355073.32767、下一个读数为1748355073.127

第二次跳到新的第二次,但次秒属于旧的第二次。 如果我先读取 RTCSS、然后读取 RTCC、RTCC 可以递增+1。 但我首先读取 RTCC、读取子秒、然后再次读取 RTCC、看看它们是否相等。 它们一直是、但第二个是比预期的+1。

任何想法的建议都有助于非常感激。

此致、

c.

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

    好的、我还需要添加我使用 RTCTrimSet (RTC_NEUTRAL + RTC_OFFSET 每64秒第60秒)。 TRIM 语句在第63秒生效,我们无法控制它何时生效。 可能是在应用 TRIM 时、我轮询 RTC?

    ----编辑----

    进一步调试时、明确地应用了 RTC 修整。 rtcss 会增加、但 rtcss 会递减至修整值、以便递增计数。 我找到了原因、但没有找到解决方案。 无法真正隔离它将应用修整的点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我还需要添加 RTCTrimSet (RTC_NEUTRAL + RTC_OFFSET 每64秒第60秒)。 TRIM 语句在第63秒生效,我们无法控制它何时生效。 可能是在应用 TRIM 时我正在轮询 RTC?

    您好 CAN、

     我认为这是很不可能的。 对于实验、您能否注释掉  RTCTrimSet 并看到相同的问题? 数据表中确实提到了额外中断或中断缺失。  

    使用接近中子秒匹配值的修整值时、必须小心
    HIBRTCSS 寄存器。 当使用高于0x7FFF 的修整值来接收两个匹配时、可能会出现这种情况
    会针对同一计数器值执行中断。 此外、当使用低于0x7FFF 的修整值时、也可以使用此方法
    错过匹配中断。
    如果修整值大于0x7FFF、则当 HIBRTCSS 寄存器中的 RTCSSC 值达到该值时
    0x7FFF、RTCC 值从0x0递增至0x1、而 RTCSSC 值减小
    修整金额。 在滚动到0x0开始之前、RTCSSC 值会再次计数到0x7FFF
    倒计时。 如果匹配值在此范围内、则触发两次匹配中断。 指定
    例如、如第515页的图7-5所示、如果匹配中断配置为 RTCM0=0x1
    且 RTCSSM=0x7FFD 时、将触发两个中断。

    如果修整值小于0x7FFF、则 RTCSSC 值从0x7FFF 提前到修整
    RTCC 值从0x0递增至0x1时的值。 如果匹配值在该范围内、
    不触发匹配中断。 例如、如第515页的图7-6所示(如果匹配)
    中断配置为 RTCM0=0x1且 RTCSSM=0x2、永远不会触发中断。

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

    好的、没有中断。 但是、我定期轮询 RTC、当发生这种情况(RTC 修整)时、会产生错误的结果。

    如果我注释掉 RTC TRIM 命令、不会导致任何错误。

    另外、数据表中也有错误、或者是我的误解:

    如果修整值大于0x7fff、在 RTC 计数到0x7fff 后、它将按修整量递减、并再次开始计数。

    对于小于0x7fff 的修整值、还显示"RTCSSC 值从0x7FFF 提前到 TRIM"

    这是否会产生同样的效果? 第一个导致延迟、但对于第二个、需要跳转到0x7fff。 或从0跳到修整量。 (修整量是与0x7fff 的距离)数据表中的图示也没有意义。 图7-5和7-6具有相同的效果。

    此致、

    c.

    ——编辑

    我找到了 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/610515/tm4c123gh6pm-discrepancies-in-description-of-rtc-trim-in-datasheets

    虽然我了解 RTC 修整的工作原理、但我无法在更新过程中找到不轮询它的方法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于大于0x7fff 的修整值、在 RTC 计数到0x7fff 后、它按修整量递减、并再次开始计数。

    下面是数据表中的说明。 我看不出它有什么问题。 也就是说、如果 Trim 值像图中所示的0x8002一样大、则 RTCSSC (子秒)将首先递减修整量(即3)、然后再次开始从0开始计数。 由于0x8002 - 0x7FFF = 3、因此该器件将从0x7FFD -> 0x7FFE -> 0x7FFF 再次重复最后三个子秒、然后再从0开始。  

    如果修整值大于0x7FFF、则当 HIBRTCSS 寄存器中的 RTCSSC 值达到该值时
    0x7FFF、RTCC 值从0x0递增至0x1、而 RTCSSC 值减小
    修整金额。 在滚动到0x0开始之前、RTCSSC 值会再次计数到0x7FFF
    倒计时。

    [报价 userid="91011" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1519589/tm4c123gh6pm-tm4c123-read-rtc-not-as-expected/5841112 #5841112"]

    对于小于0x7fff 的修整值、还显示"RTCSSC 值从0x7FFF 提前到 TRIM"

    [/报价]

    以下是数据表中的说明。 这有点不清楚、我同意。 我想它试图说的是、如果修整值较小、它将以修整差异启动 RTCSSC 计数器。 使用如图所示的0x7FFC 修整值、修整差异为0x7FFF - 0x7FFFC = 0x3。 然后、RTCSSC 将从0x3开始、而不是从0x0开始。 它将从0x3 -> 0x4 -> 0x5 ->……开始计数 ->  0x7FFD -> 0x7FFE -> 0x7FFF。  

    如果修整值小于0x7FFF、则 RTCSSC 值从0x7FFF 提前到修整
    RTCC 值从0x0递增至0x1时的值。

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

    发生此调整时、是否有任何方法可以产生中断? 它发生在每64秒第63次,但这是不够的。 我是否可以在 RTC 计数器被跳回或高级时产生中断? 或者是否有任何其他方法来检测它? 此致。

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

    您好 CAN、

    发生此调整时、是否有办法生成中断? 它发生在每64秒第63次,但这是不够的。 我是否可以在 RTC 计数器被跳回或高级时产生中断? 或者是否有任何其他方法来检测它?

    没有唯一的中断 标志来指示计数器是跳回还是高级计数器。 这只是一个想法。 初始设置 RTC 以在一秒时为  RTCM0=0x0 且 RTCSSM=0x7FFF 生成匹配中断。 假设修整值为0x8002。 达到匹配时、表示已经过去一秒、在 ISR 中设置 RTCM0= 0x1和  RTCSSM=0x7FFF。   在接下来的一秒中 、两个中断应该彼此非常接近、而不是相隔一秒。 我想通过这种方式检测计数器被跳回。 您可以继续执行下一秒的中断、并将  RTCM0更改为0x2、0x3、0x4、依此类推、直到中断0x63、然后复位您的全局计数器。 只有当 RTCM=0x1且 RTCSSM=0x7FFF 时、才会获得两个非常接近的中断。

     对于小于0x7FFF 的修整值、您也可以类似地执行此操作。 在一种情况下、您只会在两秒后接收中断、而所有其他中断每秒发生一次。  

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

    谢谢你、查尔斯、

    虽然该方案将以独特的方式检测这种情况、但其工作分辨率为0至2秒。 我需要在读取 RTC 时跳过此数据包、例如在 RTC 正在更新时读取标志。

    不过、我们知道确切的时序。 它发生在第63秒的开始。 因此、我可能会尝试每秒生成一个中断、如果是第63秒、则设置一个标志。 但这也会很慢。

    现在、我只是将它们与过去的值进行比较、如果发生较大的跳过、我将不处理它们。

    此致、

    c.