硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2967|回复: 20
收起左侧

[RTC] 实测STM32的RTC,什么校准都不做,不断电,半年后快了13分钟

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2024-4-7 08:16:50 | 显示全部楼层 |阅读模式
【测试结果】
TOOL的RTC时钟一直都是通过上位机这里手动校准的,这次做了了实验,测试期间不做任何校准,看看半年后效果。

测试是从去年的9月29号开始



截至到今年的4月5号,快了13分钟



【误差原因】
因为晶振对温度敏感,下面是典型的温度对晶振影响:

STM32支持LSI内部低速时钟或者LSE外置低速时钟,使用外部就要接32768Hz的晶体。

一个月的典型误差50秒左右。




【校准】

以外置RTC  DS3231为例,精度是:
Accuracy ±2ppm from 0°C to +40°C        ---- 每个月30天算的最大误差是2*10^-6 * 24 * 60 *60 * 30 = 5.184秒
Accuracy ±3.5ppm from -40°C to +85°C  ---- 每个月30天算的最大误差是3.5*10^-6 * 24 * 60 *60  * 30 = 9.072秒

使用STM32内部RTC不行,白天温度不稳定的话,当天的误差差不多就有1-2秒。主要是晶振不是温补的。

ST提供了一些方案,但是不实用:

方法1:Smooth digital calibration

这种方法使用比较麻烦,当前提供的案例需要用户使用超高精度的信号时钟,精确到几个ppm,发送这个信号给板子做校准。然后示波器测量实际的输出效果来确实是否采用这个校准值。



方法2: RTC时钟同步

官方提供的例子没什么参考价值,倒腾了高精度的HSE来实现。

方法3: 使用50Hz/60Hz高精度参考时钟辅助



这个实用性也有点差。

3、当前推荐方案

(1)使用外置温补晶振,但价格略高,10块钱左右:

(2)使用自带温补的RTC芯片。

【RTC校准软件包】

https://www.st.com/en/embedded-software/x-cube-rtc.html
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2024-4-7 08:47:41 | 显示全部楼层
我记得复旦微的FM33系列MCU有提供内部RTC实现温度补偿的示例的,貌似还可以,但是需要硬件支持,不确定ST能不能参考类似的思路进行实现
回复

使用道具 举报

219

主题

1110

回帖

1777

积分

至尊会员

More we do, more we can do.

积分
1777
发表于 2024-4-7 09:43:42 | 显示全部楼层
(与我的研究课题相关),校准+温度补偿+广播对时,是仪器设备常用方案。方法1不算麻烦,标准设备也可以考虑自研,会用于批量生产。
回复

使用道具 举报

14

主题

260

回帖

302

积分

高级会员

积分
302
发表于 2024-4-7 09:44:25 | 显示全部楼层
我们好像用的是方法二,定时修正RTC
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2024-4-7 09:48:27 | 显示全部楼层
用了rx8025t
回复

使用道具 举报

4

主题

412

回帖

424

积分

高级会员

积分
424
发表于 2024-4-7 10:52:51 | 显示全部楼层

rx8025t +1024
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2024-4-7 11:39:09 | 显示全部楼层
如果项目要求时钟精度这么高的话,成本应该不是特别敏感,大佬推荐的两个方案都很合适
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2024-4-7 11:40:58 | 显示全部楼层
1315150719 发表于 2024-4-7 08:47
我记得复旦微的FM33系列MCU有提供内部RTC实现温度补偿的示例的,貌似还可以,但是需要硬件支持,不确定ST能 ...

谢谢分享,我找下。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2024-4-7 11:41:36 | 显示全部楼层
emwin 发表于 2024-4-7 09:43
(与我的研究课题相关),校准+温度补偿+广播对时,是仪器设备常用方案。方法1不算麻烦,标准设备也可以考虑 ...

你们做个温补是软件方案还是硬件方案。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2024-4-7 11:48:22 | 显示全部楼层
RX8025


127.jpg
回复

使用道具 举报

219

主题

1110

回帖

1777

积分

至尊会员

More we do, more we can do.

积分
1777
发表于 2024-4-7 13:36:19 | 显示全部楼层
eric2013 发表于 2024-4-7 11:41
你们做个温补是软件方案还是硬件方案。

运行时是软件补偿,低功耗是硬件补偿。
回复

使用道具 举报

4

主题

192

回帖

204

积分

高级会员

积分
204
发表于 2024-4-22 09:46:46 | 显示全部楼层
直接做个恒温晶振。
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-9 18:00:08 | 显示全部楼层
求助硬汉哥和各位大神,我的H750 RTC慢的非常多,1晚能慢10分钟,晶振和电容是拆NUCLEAR 板上的。代码很普通,选择了LSE。有朋友能指点下吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2024-7-10 08:20:23 | 显示全部楼层
szjdb 发表于 2024-7-9 18:00
求助硬汉哥和各位大神,我的H750 RTC慢的非常多,1晚能慢10分钟,晶振和电容是拆NUCLEAR 板上的。代码很普 ...

这种的有必要先校准下,看下你的32768晶振的实际频率是多少。
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-10 10:16:35 | 显示全部楼层
uint_8 RTC_Init(void)
{      
        hrtc.Instance=RTC;
    hrtc.Init.HourFormat=RTC_HOURFORMAT_24;//RTC设置为24小时格式
    hrtc.Init.AsynchPrediv=0X7F;           //RTC异步分频系数(1~0X7F)
    hrtc.Init.SynchPrediv=0XFF;            //RTC同步分频系数(0~7FFF)   
    hrtc.Init.OutPut=RTC_OUTPUT_DISABLE;     
    hrtc.Init.OutPutPolarity=RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType=RTC_OUTPUT_TYPE_OPENDRAIN;
    if(HAL_RTC_Init(&hrtc)!=HAL_OK) return 2;
      
    return 0;
}


void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
    RCC_OscInitTypeDef RCC_OscInitStruct;
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
    __HAL_RCC_RTC_CLK_ENABLE();     
          HAL_PWR_EnableBkUpAccess();     //取消备份区域写保护
   
    RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_LSE;//LSE配置
    RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE;
    RCC_OscInitStruct.LSEState=RCC_LSE_ON;                  //RTC使用LSE
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    PeriphClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_RTC;//外设为RTC
    PeriphClkInitStruct.RTCClockSelection=RCC_RTCCLKSOURCE_LSE;//RTC时钟源为LSE
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
        
    __HAL_RCC_RTC_ENABLE();//RTC时钟使能
}
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-10 10:22:21 | 显示全部楼层
这个晶振和电容是直接拆ST 原装L496板上的,理论上误差应该不大。 我直接用示波器在晶振两端测不到波形,可能幅度太小。更加奇怪的是用MCO功能输出LSE到PA8 ,两块板,一块能测到波形,一块不行,难道MCO功能坏掉了,或者RTC硬件有问题?但是RTC能正常走呀,只是慢一点。这个RTC折腾好长时间了,一直没有解决。硬汉哥能不能给个检查思路?非常感谢!!!
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-10 10:25:55 | 显示全部楼层
这是输出LSE代码,GPIOA时钟已经提前打开
static void MCO_init(void)
{

        GPIO_InitTypeDef  gpio_init_structure;
        /* Configure the GPIO_LED pin */
        gpio_init_structure.Pin = GPIO_PIN_8;
        gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
        gpio_init_structure.Pull = GPIO_PULLUP;
        gpio_init_structure.Speed = GPIO_SPEED_HIGH;
        gpio_init_structure.Alternate = GPIO_AF0_MCO;

        HAL_GPIO_Init(GPIOA, &gpio_init_structure);
       
        HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_LSE  , RCC_MCODIV_1);
}
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-10 17:53:30 | 显示全部楼层
能不能指点下,给个排查思路,多谢硬汉哥和众高手
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
 楼主| 发表于 2024-7-11 08:41:20 | 显示全部楼层
szjdb 发表于 2024-7-10 17:53
能不能指点下,给个排查思路,多谢硬汉哥和众高手

我记得ST有个通过定时器捕获LSE实际时钟的例子,在F4的软件包里面是一定有的,早期我还参考过。
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-11 10:09:50 | 显示全部楼层
多谢硬汉哥,我找找看
回复

使用道具 举报

11

主题

123

回帖

156

积分

初级会员

积分
156
发表于 2024-7-19 10:28:50 | 显示全部楼层
多谢硬汉哥,还在查,暂时没有找到原因,可能跟布线有关系,按理说应该没有大问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:49 , Processed in 0.053221 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表