打印
[其他ST产品]

STM32在程序运行中如何校准RTC

[复制链接]
193|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-1-26 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近开发的一个案子需要使用实时时钟RTC,因为成本原因,就用STM32自带的RTC;芯片型号 STM32F030C6T8  ,4KB SRAM  32KB  Flash;
程序运行后发现STM32的实时时钟误差比较大,实测运行28小时相差2秒;查看STM32的规格书,规格书说明RTC可以平滑数字校准,我的理解是在上电初始化时,通过写RTC_CALR寄存器来校准晶振的偏差,但是这个必须是在知道当前晶振的偏差的情况下才会有效。但是当大批量生产的时候,每个晶振的偏差都不会一样,那么在初始化RTC的时候配置RTC_CALR寄存器的方法就不可靠了,必须要在程序运行过程中测量实际晶振的误差,根据测量的误差值来配置RTC_CALR寄存器,达到修正RTC的目的。可是程序运行中如何测量得出当前实际的晶振频率呢?下面是我的RTC配置代码:
    void                   RTC_Init_config(void)
{
                                  RTC_InitTypeDef    RTC_InitStruct;
                                  RTC_timeTypeDef    RTC_TimeStruct;
                                  RTC_DateTypeDef     RTC_DateStruct;
                                  //定义相关结构体
                                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                                  //使能电源时钟。
                                 PWR_BackupAccessCmd(ENABLE);
                                  //启用允许访问备份域寄存器。
                                 RCC_BackupResetCmd(ENABLE);
                            RCC_BackupResetCmd(DISABLE);
                                  //RCC_LSEDriveConfig(RCC_LSEDrive_MediumLow);
                                  RCC_LSEConfig(RCC_LSE_ON);
                                  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
                                  #ifdef        USART_Printf
                                  USART2_String("LSE is  okn");
                                  #endif
                            //等待外部低速时钟准备好。
                                 RTC_RefClockCmd(ENABLE);
                                  //使能参考时钟检测。
                                 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
                                  RCC_RTCCLKCmd(ENABLE);
                                  //使能RTC相关时钟源、
                                 RTC_InitStruct.RTC_HourFormat  =  RTC_HourFormat_24;
                                  RTC_InitStruct.RTC_AsynchPrediv  =  (uint32_t)(0x7F);
                                  RTC_InitStruct.RTC_SynchPrediv  =  (uint32_t)(0xFF);
                                  RTC_Init(&RTC_InitStruct);
                                                                                                          #ifdef        USART_Printf
                                  USART2_String("RTC  Initn");
                                  #endif
                                  //初始化RTC
                                  RTC_TimeStruct.RTC_Hours  =  0x12;
                                  RTC_TimeStruct.RTC_Minutes  =  0x00;
                                  RTC_TimeStruct.RTC_Seconds  =  0x00;
                                  RTC_TimeStruct.RTC_H12  =  RTC_H12_AM;
                                  RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);
                                                                                                           #ifdef        USART_Printf
                                  USART2_String("RTC_Time  Initn");
                                  #endif
                                   //初始化时钟
                                 RTC_DateStruct.RTC_WeekDay  =  RTC_Weekday_Monday;
                                                                                                          RTC_DateStruct.RTC_Month  =  RTC_Month_August;
                                                                                                          RTC_DateStruct.RTC_Date  =  0x03;
                                                                                                          RTC_DateStruct.RTC_Year  =  0x15;
                                                                                                          RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);
                                              #ifdef        USART_Printf
                                  USART2_String("RTC_Date  Initn");
                                  #endif
                                                                                                          //初始化日期。
}

          该如何校准RTC的频率呢?有哪位大侠能指点一二,不胜感激!!!!

使用特权

评论回复
沙发
jcky001| | 2024-1-27 12:18 | 只看该作者
STM32的数据手册

使用特权

评论回复
板凳
故意相遇| | 2024-2-20 22:10 | 只看该作者
Real-Time Clock (RTC) 可以通过软件进行校准

使用特权

评论回复
地板
白马过平川| | 2024-2-21 01:00 | 只看该作者
您可以使用外部时钟源(例如晶体振荡器)来提供准确的时间基准。通过使用外部时钟源,可以确保RTC的准确性,并且可以在程序运行时校准RTC

使用特权

评论回复
5
风凉| | 2024-2-21 03:00 | 只看该作者
在程序运行时,您可以通过软件来校准RTC。这通常涉及使用外部时间源(例如网络时间协议(NTP)服务器)获取准确的时间,并将其与RTC的当前时间进行比较。然后,您可以计算出RTC的偏差,并相应地调整RTC的计数器来校准时间

使用特权

评论回复
6
西洲| | 2024-2-21 05:00 | 只看该作者
我觉得这种校准都不如软件校准来的快哦

使用特权

评论回复
7
捧一束彼岸花| | 2024-2-21 07:00 | 只看该作者
其实校准的话不行,一般都没有个准的源,校准也没啥用啊

使用特权

评论回复
8
在曼谷的春| | 2024-2-21 09:00 | 只看该作者
建议直接配置个4G,这种就简单了,可以获取服务器时间

使用特权

评论回复
9
月亮一键变蓝| | 2024-2-21 11:00 | 只看该作者
你这用自带RTC的话,会容易出现跑偏情况

使用特权

评论回复
10
她已醉| | 2024-2-21 13:00 | 只看该作者
这种校准没啥意义,还是需要获取服务器时间才行

使用特权

评论回复
11
春日负喧| | 2024-2-21 17:00 | 只看该作者
想要精度的话,还是需要用外部晶振才行的哦

使用特权

评论回复
12
一只眠羊| | 2024-2-21 22:00 | 只看该作者
平滑校准第一次听说,但是建议还是外部软件/服务器校准比较好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

376

主题

1418

帖子

1

粉丝