硬汉嵌入式论坛

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

STM32F427ZGTx内部RTC秒及亚秒同步问题

[复制链接]

5

主题

17

回帖

32

积分

新手上路

积分
32
发表于 2026-1-20 15:46:02 | 显示全部楼层 |阅读模式
使用该MCU的亚秒寄存器进行亚秒计时,同步分频设置255,异步分频设置127。每100ms读取一次RTC计时数据。读取代码如下:

uint8_t rtc_repeat_cnt;
uint32_t rtc_ssr;
uint32_t rtc_sec,rtc_sec_chk;

dst->year = LL_RTC_DATE_GetYear(RTC); //年份
dst->month = LL_RTC_DATE_GetMonth(RTC); //月份
dst->day = LL_RTC_DATE_GetDay(RTC); //日期
dst->hour = LL_RTC_TIME_GetHour(RTC); //小时
dst->minute = LL_RTC_TIME_GetMinute(RTC); //分钟

//秒数和亚秒进行原子化读取
rtc_repeat_cnt = 0;
do
{
rtc_sec = LL_RTC_TIME_GetSecond(RTC);
rtc_ssr = LL_RTC_TIME_GetSubSecond(RTC);
rtc_sec_chk = LL_RTC_TIME_GetSecond(RTC);

rtc_repeat_cnt ++;

if(rtc_repeat_cnt >= 5) //读取5次都不能获取正确的秒和亚秒,则以最后读取到的值为准
{ break; }

}while(rtc_sec != rtc_sec_chk);

dst->second = rtc_sec ; //秒

//根据亚秒寄存器进行ms换算

if(rtc_ssr <= 255 {
dst->sub_second = (255- rtc_ssr) * 1000 / (255+ 1);
}
else {
dst->sub_second = 999;
}

实际应用中,发现亚秒已经溢出了,计算的sub_second从九百多变为个位数,但是读取的秒值未加1,一般再读取1-3次,秒值会加1。单独看亚秒值的变化,与100ms的读取周期是相符的,RTC的计时也很准确,感觉就是亚秒寄存器的重装载和秒值加1未同步。

有人知道这是什么原因么?
回复

使用道具 举报

5

主题

49

回帖

64

积分

初级会员

积分
64
发表于 2026-1-20 16:57:29 | 显示全部楼层
倒序读试试?先读单位小的
回复

使用道具 举报

5

主题

17

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2026-1-21 08:42:16 | 显示全部楼层
我有空试一下。这个咋还和倒序正序有关系么?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121126
QQ
发表于 2026-1-21 10:22:01 | 显示全部楼层
ST的RTC这些寄存器有读取顺序问题,修改下读取顺序试试
回复

使用道具 举报

7

主题

387

回帖

408

积分

高级会员

积分
408
发表于 2026-1-21 10:35:20 | 显示全部楼层
你看官方手册关于RTC这一块,有特别说明的,如果操作不对是有可能的,主要是RTC写和读处在了临界点上。
回复

使用道具 举报

5

主题

17

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2026-1-27 11:13:20 | 显示全部楼层
我先读亚秒,再读秒,然后分钟。。。这样倒过来确实好了。有人知道这是什么原因么?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121126
QQ
发表于 2026-1-27 11:19:30 | 显示全部楼层
mountfushan 发表于 2026-1-27 11:13
我先读亚秒,再读秒,然后分钟。。。这样倒过来确实好了。有人知道这是什么原因么?

此贴各个楼层,讨论了这个问题

使用STM32H7的RTC依然要先读时间,再读日期,这个老毛病在F4上就有
https://forum.anfulai.cn/forum.p ... 9912&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

17

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2026-1-30 08:58:04 | 显示全部楼层
eric2013 发表于 2026-1-27 11:19
此贴各个楼层,讨论了这个问题

使用STM32H7的RTC依然要先读时间,再读日期,这个老毛病在F4上就有

我先读亚秒,确实不再有这个进位的问题了。但是一天就要慢5秒左右,先读日期再读时间就不会慢。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121126
QQ
发表于 2026-2-2 17:35:42 | 显示全部楼层
mountfushan 发表于 2026-1-30 08:58
我先读亚秒,确实不再有这个进位的问题了。但是一天就要慢5秒左右,先读日期再读时间就不会慢。

冬天昼夜温差大,5秒差不多

因为晶振对温度敏感,下面是典型的温度对晶振影响:

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

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


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-24 15:02 , Processed in 0.049316 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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