你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
jinli 提问时间:2026-1-20 15:43 / 已解决

使用该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未同步。

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

收藏 评论4 发布时间:2026-1-20 15:43

举报

4个回答
xmshao 最优答案 回答时间:2026-1-21 13:50:53

你读取时间的循序跟目前反过来,即从亚秒、秒、分、时、日期的顺序来进行,且都读到。

image.png

butterflyspring 回答时间:2026-1-20 17:46:35
看看读RTC 寄存器有没有判断 RSF 标志


stm32f407 rtc read.PNG
jinli 回答时间:2026-1-21 08:50:56

butterflyspring 发表于 2026-1-20 17:46
看看读RTC 寄存器有没有判断 RSF 标志

这确实是个新的思路。不过我是每间隔100ms读取一次RTC时钟的,这个周期已经远大于RTCCLK了。有时需要读取3次,秒值才会增加,按说跟这个没有关系。回头我先试试吧。

jinli 回答时间:2026-1-21 14:44:25

xmshao 发表于 2026-1-21 13:50
你读取时间的循序跟目前反过来,即从亚秒、秒、分、时、日期的顺序来进行,且都读到。</p>
<p>![image.png](d ...

我试过了,反过来读取,秒的进位和亚秒的溢出确实同步了。但是运行一天会慢5秒左右。改成从年份开始读取,就不会慢了。请问你有相关的经验么?

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版