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.

关于CORTEX-M4内部RTC偏快的问题

你好!

         我现在在用TI的LM4F230H5QR(以前旧的型号),这个IC内部自带RTC,我现在用外部晶振32.768KHz,我不用M4的休眠功能,只是想用它的RTC功能,而RTC的配置如下:

void Rtc_Init(void)
{
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);   //使能RTC模块
    HibernateClockSelect(HIBERNATE_CLOCK_SEL_RAW);   // 时钟选择32.768KHz
    HibernateRTCEnable();     // 启动RTC
}

而RTC的读取如下:

void AppRtcTask(void *parg)
{
    struct tm *current_timer_point = &current_timer;
    U8 err;
    time_t timer_seconds,backupt_seconds;

    while(1)
    {

        timer_seconds = HibernateRTCGet();   // 读取RTC的秒

        current_timer_point = localtime(&timer_seconds); // get the timer_seconds --->year,month,second

        current_timer = *current_timer_point;

        OSTimeDly(100); // delay 200ms;
    }

}

我目前的问题是:经过试验,RTC运行10分钟的时候,大概快了8秒(同电脑的时间比较),我用的晶振用示波器看了,时钟没问题,而且,我也有换过其它品牌的晶振,问题依旧。

我想是不是时钟源设定不对?但是我也有尝试时钟源设定为:HibernateClockSelect(HIBERNATE_CLOCK_SEL_DIV128);但是仍旧快了。

  • Hi Haolin,

      在我们的M4的Hibernate模块里面有一个15位trim寄存器,可以用来说是指时钟的偏差。在使用我们M4的过程中,如果你对时钟精准度要求比较高,你需要通过HibernateRTCTrimSet()函数来修正RTC的数值。

    鉴于你现在RTC模块运行了10分钟,就有8秒的误差,所以建议你去设置一下trim这个预分频的寄存器。

    下面有一个我们英文论坛的链接,里面也有人遇到了和你类似的问题,再他设置好trim寄存器后,时钟就符合要求了。你可以参考一下:

    http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/257944/902972.aspx#902972


    希望这对你有帮助。


    谢谢

    ken

  • 你好!

           谢谢你的答复,我试了,把TRIM寄存器的数值更改为0X7FFF,有很大的好转,但是还是偏快,大概是25小时,偏快4-5秒。

           看规格书,我准备尝试其它数值看看 ,但是我有点担心:对于这个频率的补偿,是不是CORTEX-M4的每块IC都是一样?

            如果不是一样的,那么我以后生产,那不是很麻烦?

  • Hi Haolin,

     这个已经是MCU端内部RTC精度的解决方案了,暂时还没有看到其他的方法。

    现在这个精度应该算是很高了,它还是达不到你的需求吗?如果是的话,试试考虑选择一个PPM相对低的晶振试试。

    谢谢

    ken