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 亚秒(HIBRTCSS)

Guru**** 2522140 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1288462/tm4c123gh6pm-reading-hibernation-rtc-sub-seconds-hibrtcss

器件型号:TM4C123GH6PM

您好!

第522页的数据表指出:

可以读取 RTC 值
首先读取 HIBRTCC 寄存器、再读取 HIBRTCSS 寄存器的 RTCSSC 域、然后
然后再次读取 HIBRTCC 寄存器。 如果 HIBRTCC 寄存器两次读取的数值一样、则读取有效。

为什么会这样呢? 当 hibrtcc 变为+1时、亚秒寄存器会发生什么情况?

我编写了两个可以互换使用的函数:

uint32_t get_rtc_posix_sub(void) {
    return (HibernateRTCGet() << 15) | (HWREG(HIB_RTCSS) & HIB_RTCSS_RTCSSC_M);
}

// notice: this recursive variant does it as stated in datasheet.
uint32_t get_rtc_posix_sub_formal(void) {
    uint32_t posixTime = HibernateRTCGet();
    uint32_t subseconds = (HWREG(HIB_RTCSS) & HIB_RTCSS_RTCSSC_M);
    if(posixTime==HiberNateRTCGet()) {
        return (posixTime << 15) | (HWREG(HIB_RTCSS) & HIB_RTCSS_RTCSSC_M);
    } else {
        return get_rtc_posix_sub_formal();
    }
}

基本而言、在正常运行 RTC 之后、我只需要能够对位置时间+ 15位亚秒的内容进行时间戳记。 由于提供的 RTC 没有日历、因此计数范围为9到3600 x 24

因此、由于它不会超过17位、我将秒计数器移动15位、并将次秒计数器放置到该15位的空白处、以获得第二个+次秒时间戳。

非常感谢您提出任何想法。 之前是否有 类似目的的工作示例?

此致、

C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="91011" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1288462/tm4c123gh6pm-reading-hibernation-rtc-sub-seconds-hibrtcss

    可以读取 RTC 值
    首先读取 HIBRTCC 寄存器、再读取 HIBRTCSS 寄存器的 RTCSSC 域、然后
    然后再次读取 HIBRTCC 寄存器。 如果 HIBRTCC 寄存器两次读取的数值一样、则读取有效。

    为什么会这样呢? 当 hibrtcc 变为+1时、亚秒寄存器会发生什么情况?

    [/报价]

    原因是 HIBRTCC 和 HIBRTCSS 是两种不同的寄存器。 HIBRTCC 位于地址偏移0x0、而 HIBRTCSS 寄存器位于0x28。  要读取 RTC 计数器的秒和亚秒、需要处理器执行两种不同的读取操作、方法是先读取 HIBRTCC 寄存器、然后 读取 HIBRTCSS 寄存器。 在读取 HIBRTCSS 寄存器时、HIBRTCC 寄存器可能已经递增到下一个计数值。 例如、假设 RTC 的值包含的 HIBRTCC 为0x1234、HIBRTCSS 为0xFFFF。 如果 CPU 读取 HIBRTCC、则得到0x1234。 接下来、您将读取 HIBRTCSS。 这是可能出现问题的地方。 当 CPU 读取 HIBRTCSS 时、亚秒数可能已回滚至0、而 HIBRTCC 变为0x1235。 如果您只需将 HIBRTCC 和 HIBRTCSS 连接起来、则第二次获得0x1234、次秒获得0x0。 与预期值0x1234和0xFFFF 相比、这显然是错误的。 这就是再次重新读取 HIBRTCC 寄存器的原因。 如果第二次读取 HIBRTCC 的值与第一次读取不同、那么您就知道刚刚发生了回滚。   

    向休眠 RTC 加载(HIBRTCLD)寄存器执行写入操作即可置位 HIBRTCC 寄存器。 写入
    寄存器添加一个注释、说明 HIBRTCSS 寄存器中的15位亚秒计数器域、RTCSSC、
    寄存器。 为确保有效读取 RTC 值、应首先读取 HIBRTCC 寄存器、然后
    通过读取 HIBRTCSS 寄存器的 RTCSSC 域、然后重新读取 HIBRTCC 寄存器。
    如果 HIBRTCC 寄存器两次读取的数值一样、则读取有效。 通过执行此过程、可以将
    原因是 HIBRTCC 寄存器在读取
    RTCSSC 域被阻止。