OpenEdv-开源电子网

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

第十八章 RTC实时时钟实验的疑惑

[复制链接]

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
发表于 2019-4-4 15:55:24 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 JUSTDY 于 2019-4-4 16:23 编辑

//得到当前的时间
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void)

感觉上面的函数有点问题:[mw_shl_code=c,true]u8 RTC_Get(void)
{
        static u16 daycnt=0;
        u32 timecount=0;
        u32 temp=0;
        u16 temp1=0;         
    timecount=RTC_GetCounter();         
         temp=timecount/86400;   //得到天数(秒钟数对应的)
        if(daycnt!=temp)//超过一天了
        {         
                daycnt=temp;
                temp1=1970;        //从1970年开始

/*************看这里***********/
                while(temp>=365)
                {                                 
                        if(Is_Leap_Year(temp1))//是闰年
                        {
                                if(temp>=366)temp-=366;//闰年的天数
                                else {temp1++;break;}  
                        }
                        else temp-=365;          //平年
                        temp1++;  
                }
/*************看这里***********/   
calendar.w_year=temp1;//得到年份
                temp1=0;
                while(temp>=28)//超过了一个月
                {
                        if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2月份
                        {
                                if(temp>=29)temp-=29;//闰年的秒钟数
                                else break;
                        }
                        else
                        {
                                if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
                                else break;
                        }
                        temp1++;  
                }
                calendar.w_month=temp1+1;        //得到月份
                calendar.w_date=temp+1;          //得到日期
        }
        temp=timecount%86400;                     //得到秒钟数              
        calendar.hour=temp/3600;             //小时
        calendar.min=(temp%3600)/60;         //分钟        
        calendar.sec=(temp%3600)%60;         //秒钟
        calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//获取星期   
        return 0;
}         [/mw_shl_code]

疑惑点:

[mw_shl_code=c,true]                while(temp>=365)
                {                                 
                        if(Is_Leap_Year(temp1))//是闰年
                        {
                                if(temp>=366)temp-=366;//闰年的天数
                                else {temp1++;break;}  
                        }
                        else temp-=365;          //平年
                        temp1++;  
                } [/mw_shl_code]
假如我现在  temp=365,temp1=2000.
运行完上面的程序后  temp1竟然是2001了,正常不是应该2000吗,因为2000年是闰年吗,有366天。
个人感觉这样才对:
[mw_shl_code=c,true]while(temp>=365)
{        
if(Is_Leap_Year(temp1))//是闰年
{
if(temp>=366)temp-=366;//闰年的天数
else {break;}     //去掉temp1++;
else temp-=365;        //平年
temp1++;
}[/mw_shl_code]


有点疑惑,求助。原子哥。
顺便做了个实验,效果为:
RTC_Set(2000,12,31,15,18,0);  //设置时间       
3fa2e032127b4e43e3806c5ac2d0649.jpg
有小BUG呢






最佳答案

查看完整内容[请看2#楼]

请看新版本代码,已经改正过来了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-4-4 15:55:25 | 显示全部楼层
请看新版本代码,已经改正过来了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2019-4-4 16:25:26 | 显示全部楼层
实验成功,在while循环里面去掉   temp1++;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 23:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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