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.
你好!
我现在在用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 = ¤t_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