OpenEdv-开源电子网

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

STM32 RTC 用到的一个函数

[复制链接]

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
发表于 2015-3-25 16:27:09 | 显示全部楼层 |阅读模式
5金钱
哪位能够给分析下产生误差原因呢
//将时间转化为到1970年1月1日的总秒数
//Bugs:此函数秒数会多20左右,所以函数返回值做了校正,校正后没有问题

u32 Date_TO_Sec(u16 year,u8 month,u8 date,u8 hour,u8 minute, u8 second)
{
  u16 t;
  u32 sec;
 
  if(year >= 1970 && year<= 2106)                    //判断是否为合法年份,RTC的时间是从1970开始,只能由32位表示秒数,最大只能到2106年左右
  {
    for(t= 1970 ;t<year;t++)                         //所有年份秒数累加
    {
      if(Is_LeapYear(t))  sec += 31622400;           //判断是否为闰年
      else                sec += 31536000;       
    }  

    for(t=0;t<month-1;t++)                           //月份秒数累加
    {
      sec += (u32) Days_Table[t]*86400;          

      if(Is_LeapYear(year) && t== 1) sec += 86400;   //闰年加一天的秒钟数
    }

    sec += (u32)(date-1)*86400;                      //本月日期的秒数累加

    sec += (u32)(hour)*3600;

    sec += (u32)(minute)*60;

    sec += second;
  }
  return sec-20;                                      //校正20秒,原因不详
}

 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-25 22:35:49 | 显示全部楼层
你设置的时候就有问题吧?
我们例程用的和你差不多的方法,没存在20秒误差啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
 楼主| 发表于 2015-3-26 10:14:18 | 显示全部楼层
我用这个函数把GPS踩到的时间加了8个时区后用这个函数转换成秒,在设置成RTC时间,然后每分钟都读出校对下发现的这误差,RTC和系统用的是有源的32.768和8M晶振测量过很准的
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
 楼主| 发表于 2015-3-26 10:17:04 | 显示全部楼层
RTC时间是每100毫秒读取的一次

每一分钟运行一次时间修正函数:

 void Correct_Time(void)
{
  if ( GPS_RMC_Valid == 'A' )                 // GPS 定位有效
  { 
    if ( (RTC_Year != GPS_Year) || (RTC_Month  != GPS_Month ) || (RTC_Day    != GPS_Day)    || 
         (RTC_Hour != GPS_Hour) || (RTC_Minute != GPS_Minute) || (RTC_Second != GPS_Second) ) 
    { 
      Set_RTC_DateTime( GPS_Year, GPS_Month, GPS_Day, GPS_Hour, GPS_Minute, GPS_Second );
      
      BKP_WriteBackupRegister(BKP_DR1, BKP_DR1_FLAG);        // 写入RTC后备寄存器时间已经修正的标记

      printf( "RTC校时成功...%d-%d-%d %d:%d:%d\r\n", RTC_Year, RTC_Month, RTC_Day, RTC_Hour, RTC_Minute, RTC_Second); 
      printf( "GPS校时成功...%d-%d-%d %d:%d:%d\r\n\r\n", GPS_Year, GPS_Month, GPS_Day, GPS_Hour, GPS_Minute, GPS_Second); 
    }
    GPS_RMC_Valid = 'V';
  }  
}
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
 楼主| 发表于 2015-3-26 16:48:49 | 显示全部楼层
回复【4楼】6874577:
---------------------------------
哪位有GPS如果方便请测试下这个现象很奇怪了(起码认为GPS的时间是可以信赖的)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-26 23:03:52 | 显示全部楼层
回复【3楼】6874577:
---------------------------------
GPS输出的时间,直接就是0度经度的时间,很好计算啊.
哪里要这么处理的?
直接解析NMEA0183协议,然后小时+8即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
 楼主| 发表于 2015-3-27 10:09:20 | 显示全部楼层
GPS_Year, GPS_Month, GPS_Day, GPS_Hour, GPS_Minute, GPS_Second 这几个时间是从GPS解析出来的也加了东8区的时间差
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 15:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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