OpenEdv-开源电子网

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

STM32F1系列RTC程序,设置的日期与读出来的日期差13天是怎么回事,设置过其它日期都是差13天,不多不少

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-6-11
在线时间
2 小时
发表于 2021-6-11 16:38:33 | 显示全部楼层 |阅读模式
1金钱
设置时间的函数
const uint8_t mon_number[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份
uint8_t RTC_Set_Time(uint16_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec)
{
        uint32_t secCount=0;
        uint16_t i=0;
        if(year<1970||year>2099)
                return 1;
       
        for(i=1970;i<year;i++)//把所有年的秒数加到一起
        {
                if(Leap_year(year))
                        secCount+=31622400;//闰年的所有秒数
                else
                        secCount+=31536000;//平年的所有秒数
        }
       
        month-=1;
        for(i=0;i<month;i++)//把所有月的秒数加到一起
        {
                secCount+=(uint32_t)mon_number[i]*86400;//月份秒钟数相加  每天86400秒
                if(Leap_year(year)&&(i==1))//判断二月份是否为闰年,闰年加一天的秒数
                        secCount+=86400;
        }
       
        secCount+=(uint32_t)(day-1)*86400;//把所有日的秒数加到一起   不累加当天的秒数所以减1
       
        secCount+=(uint32_t)hour*3600;//把所有时的秒数加到一起   一小时3600秒
       
        secCount+=(uint32_t)min*60;//把所有分钟的秒数加到一起   一分钟60秒
       
        secCount+=sec;//最后把秒数加一起
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //使能PWR和BKP外设时钟  
        PWR_BackupAccessCmd(ENABLE);        //使能RTC和后备寄存器访问
       
        RTC_SetCounter(secCount);        //设置RTC计数器的值

        RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成  
//        RTC_Get_Time();//更新时间
        return 0;            
}



读取时间的函数
uint8_t RTC_Get_Time(void)
{
        static uint16_t flag=0;
        uint32_t TimeCount=0;
        uint32_t Count=0;
        uint16_t tmp=0;
       
        TimeCount=RTC_GetCounter();

        Count=TimeCount/86400;//计算出天数
        ThisData.G_week=(4+Count)%7;
       
        if(Count!=flag)//大于一天
        {
                flag=Count;
                tmp=1970;//从1970年开始
                while(Count>=365)
                {
                        if(Leap_year(tmp))//是闰年
                        {
                                if(Count>=366)
                                        Count-=366;
                                else
                                {
                                        break;
                                }
                        }
                        else
                                Count-=365;//平年
                        tmp++;
                }
                ThisData.G_year=tmp;
                tmp=0;
                while(Count>=28)//超过了一个月
                {
                        if(Leap_year(ThisData.G_year)&&(tmp==1))//闰年
                        {
                                if(Count>=29)
                                        Count-=29;
                                else
                                        break;
                        }
                        else //平年
                        {
                                if(Count>=mon_number[tmp])
                                        Count-=mon_number[tmp];
                                else
                                        break;
                        }
                        tmp++;  
                }
                ThisData.G_month=(tmp+1); //得到月份
                ThisData.G_day=(Count+1);        //得到日期
        }
        Count=TimeCount%86400;//得到剩余秒钟数
        ThisData.G_hour=Count/3600;
        ThisData.G_min=(Count%3600)/60;
        ThisData.G_sec=(Count%3600)%60;
       
        return 0;
}

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

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4891
金钱
4891
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-6-15 11:00:00 | 显示全部楼层
你先对比一下秒对不对,百度UTC可以直接算出来当前秒数,对比一下看看是硬件的问题还是程序的问题
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2021-6-16 16:34:13 | 显示全部楼层
肯定计算错误了呗
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-6-11
在线时间
2 小时
 楼主| 发表于 2021-6-20 22:11:37 | 显示全部楼层
找到问题了,写入的数值有误,少加入了1970年到2021年之间闰年多的那一天
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 01:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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