硬汉嵌入式论坛

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

[客户分享] F4的RTC亚秒值获取

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
发表于 2019-6-24 09:17:13 | 显示全部楼层 |阅读模式
手册:
QQ截图20190624091230.jpg

公式:
1、3FF是前面RTC配置的分频值,即PREDIV_S
2、SS是亚秒值,即RTC_GetSubSecond()的返回值
   ( PREDIV_S - SS ) / ( PREDIV_S + 1 ) * 1000
= (3FF - SS)/( 3FF+ 1 ) * 1000
将3FF+1取值为3FF,就是下面
≈ 1000 - SS*1000/3FF


注:
PREDIV_S 的值来自这里:
QQ截图20190624091532.jpg


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2019-6-24 09:18:58 | 显示全部楼层
注意
ubSSecondfraction要定义成uint16_t及其以上的数据类型

QQ截图20190624091644.jpg
回复

使用道具 举报

9

主题

112

回帖

144

积分

初级会员

积分
144
发表于 2019-6-24 14:38:15 | 显示全部楼层
哈哈,上周用这个东西做了个秒表
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2020-7-3 14:25:57 | 显示全部楼层
挖个坟,亚秒是毫秒的意思吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2020-7-3 14:31:02 | 显示全部楼层
shh.yang 发表于 2020-7-3 14:25
挖个坟,亚秒是毫秒的意思吗?

对。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-7-27 10:40:51 | 显示全部楼层
SS值如何确认啊
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-7-27 10:59:18 | 显示全部楼层
SS[15:0]和PREDIV_S有什么区别?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2020-7-27 11:00:54 | 显示全部楼层
15871408292 发表于 2020-7-27 10:59
SS[15:0]和PREDIV_S有什么区别?

有api,调用下即可
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-7-27 11:03:01 | 显示全部楼层
eric2013 发表于 2020-7-27 11:00
有api,调用下即可

不懂?公式中这两个怎么取值呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2020-7-27 11:13:00 | 显示全部楼层
15871408292 发表于 2020-7-27 11:03
不懂?公式中这两个怎么取值呢


1、3FF是前面RTC配置的分频值,即PREDIV_S
2、SS是亚秒值,即RTC_GetSubSecond()的返回值
   ( PREDIV_S - SS ) / ( PREDIV_S + 1 ) * 1000
= (3FF - SS)/( 3FF+ 1 ) * 1000
将3FF+1取值为3FF,就是下面
≈ 1000 - SS*1000/3FF

回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-7-27 11:13:13 | 显示全部楼层
eric2013 发表于 2020-7-27 11:00
有api,调用下即可

比如PREDIV_S=3FF,SS【15:0】等于多少呢,怎么觉得这两个是一个值
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2020-7-27 11:21:15 | 显示全部楼层
15871408292 发表于 2020-7-27 11:13
比如PREDIV_S=3FF,SS【15:0】等于多少呢,怎么觉得这两个是一个值



1、3FF是前面RTC配置的分频值,即PREDIV_S
2、SS是亚秒值,即RTC_GetSubSecond()的返回值
   ( PREDIV_S - SS ) / ( PREDIV_S + 1 ) * 1000
= (3FF - SS)/( 3FF+ 1 ) * 1000
将3FF+1取值为3FF,就是下面
≈ 1000 - SS*1000/3FF
回复

使用道具 举报

4

主题

35

回帖

47

积分

新手上路

积分
47
发表于 2020-10-25 11:36:53 | 显示全部楼层
这个亚秒的问题,如果对精度没啥要求,直接调用 HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, Uint32_t Format)函数,其中的RTC_TimeTypeDef 结构体里面有SubSeconds成员,直接使用就行。
如果对精度有要求,也不会用RTC的亚秒功能。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2020-10-28 12:14:10 | 显示全部楼层
BUGvirus 发表于 2020-10-25 11:36
这个亚秒的问题,如果对精度没啥要求,直接调用 HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDe ...

这么理解可以的。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-12-30 15:55:05 | 显示全部楼层
本帖最后由 廷润 于 2020-12-30 16:28 编辑

感谢分享,脑子不够用,要不然压秒都不知如何靠谱的转换。
-------------实测换算结果有出入----------------------------
亚秒寄存器的值是 0-255.
转换公式要变一下。

我的换算结果

我的换算结果
Releasing your creativity
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-12-30 16:42:15 | 显示全部楼层
好事多磨,终于理解原产品代码实现 ms级别 SOE记录的设计思想。

在SysTick_Handler 傻傻的计算毫秒,递增赋值秒/分/时。这个方法是傻,但是相比调库函数节约了很多指令周期。

毕竟产品需要记录SOE的场合,太多实时检测/计算/判断/保护/记录的任务需要执行了。
Releasing your creativity
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
发表于 2021-7-21 09:41:16 | 显示全部楼层
可以 刚好要用              
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-4-25 10:41:39 | 显示全部楼层
如果要实现毫秒同步对时的话,怎么设置呀。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106840
QQ
 楼主| 发表于 2024-4-25 16:25:57 | 显示全部楼层
完大家 发表于 2024-4-25 10:41
如果要实现毫秒同步对时的话,怎么设置呀。

RTC有个脉冲输出功能,你试试精度怎么样。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 05:55 , Processed in 0.354318 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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