OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3245|回复: 3

F4RTC实时时钟时间如何实现以毫秒为单位?

[复制链接]

17

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2020-7-16
在线时间
34 小时
发表于 2020-7-29 21:44:14 | 显示全部楼层 |阅读模式
在F1中可以通过[backcolor=rgba(255, 255, 255, 0.5)]RTC预分频器余数寄存器(RTC_DIVH、RTC_DIVL),[backcolor=rgba(255, 255, 255, 0.5)]这两个寄存器的作用就是用来获得比秒钟更为准确的时钟。 该寄存器的值自减的,用于保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。这两个寄存器和 RTC 预分频装载寄存器位数是一样的。也就是说,如果预分频装载寄存器的值为32767,那么余数寄存器就会在每一次秒更新时由硬件重新装载为32767,然后向下计数,计数到0表示一秒,也即1000ms。目前F1这个也没尝试,应该是可以的!

转自:https://www.cnblogs.com/WhiteTears/p/8726340.html#_label4

[backcolor=rgba(255, 255, 255, 0.5)]

[backcolor=rgba(255, 255, 255, 0.5)]但是在F4中这两个寄存器没有了,那我如何得到ms单位的值呢?比如说我要给上位机发送当前的时间单位位毫秒,目前发送只能是以秒为单位。苦恼 企业微信截图_15960299572737.png 企业微信截图_15960298727739.png

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2020-7-16
在线时间
34 小时
 楼主| 发表于 2020-7-29 21:45:26 | 显示全部楼层
忽略两个[backcolor=rgba(255, 255, 255, 0.5)],不知道咋来的!!
回复 支持 反对

使用道具 举报

17

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2020-7-16
在线时间
34 小时
 楼主| 发表于 2020-7-30 17:01:37 | 显示全部楼层
u8 RTC_Init(void)
{      

        RTC_Handler.Instance=RTC;
    RTC_Handler.Init.HourFormat=RTC_HOURFORMAT_24;//RTC设置为24小时格式
    RTC_Handler.Init.AsynchPrediv=0X01;           //RTC异步分频系数(1~0X7F)
    RTC_Handler.Init.SynchPrediv=0X4000;            //RTC同步分频系数(0~7FFF)   
    RTC_Handler.Init.OutPut=RTC_OUTPUT_DISABLE;     
    RTC_Handler.Init.OutPutPolarity=RTC_OUTPUT_POLARITY_HIGH;
    RTC_Handler.Init.OutPutType=RTC_OUTPUT_TYPE_OPENDRAIN;
    if(HAL_RTC_Init(&RTC_Handler)!=HAL_OK) return 2;
      
    if(HAL_RTCEx_BKUPRead(&RTC_Handler,RTC_BKP_DR0)!=0X5051)//是否第一次配置
    {
    RTC_Set_Time(14,58,0,RTC_HOURFORMAT12_PM);                //设置时间 ,根据实际时间修改
                RTC_Set_Date(20,7,30,4);                                    //设置日期
    HAL_RTCEx_BKUPWrite(&RTC_Handler,RTC_BKP_DR0,0X5051);//标记已经初始化过了
    }
    return 0;
}
我这样分频的话,是1秒吗?
然后我再这样去算他的毫秒数  0x4000=16384(D)
            RTC_ms=(float)(16384-RTC->SSR);
                  RTC_ms=RTC_ms/16384*1000;
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2019-10-28
在线时间
9 小时
发表于 2020-7-30 17:27:37 | 显示全部楼层
看了一下链接中实现的原理,其实算出来的值精度是比ms级要小的(1*1000/32768豪秒的精度)。再来看F4的,如果要实现的话其实就是去设置同步预分频器(RTC_PRER寄存器的PREDIV_S[14:0])的值,因为亚秒寄存器的计数频率与同步预分频器的频率有关。其精度是1/(PREDIV_S+1)秒。一般我们设置同步预分频器的值是255,即1/256秒的精度,大概是3.90625毫秒。这样的话不足以满足毫秒的需求。那种情况的话我觉得可以通过提高同步预分频器的值去实现。比如外部低速晶振是32.768kHZ,异步预分频寄存器为31,同步预分频的值为1023,这样算出来的时钟频率依然是1HZ(32768/(31+1)/(1023+1))。但是此时亚秒寄存器的精度是1*1000/1024毫秒。应该是能满足需求的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 19:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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