OpenEdv-开源电子网

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

发现的原子哥rtc的bug。。

[复制链接]

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
发表于 2013-1-5 16:58:45 | 显示全部楼层 |阅读模式
原子哥的rtc的u8 RTC_Get(void)

        while(temp>=28)//超过了一个月
        {
            if(Is_Leap_Year(timer.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++; 
            timer.w_month=temp1+1;//得到月份
            timer.w_date=temp+1;  //得到日期
        }
这段代码更新月份和日期,但是满足》28天的时候才会更新,如果得到的时间不大于28就不更新时间
比如当前时间时2012-12-31 23:59:59 过1秒后每个字段都会更新,但是因为得到的剩余天数不足28
(是0)刚一年的第一个月。所以不会进入更新,那么得到月份和日期仍然是12-31,但是其实内部计数
器已经更新成2013-1-1 00:00:00了。。。。这个问题是我测试设备的时候过年发现的。。
改代码如下

    if(temp > 28)
    {
        while(temp>=28)//超过了一个月
        {
            if(Is_Leap_Year(timer.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++; 
            timer.w_month=temp1+1;//得到月份
            timer.w_date=temp+1;  //得到日期
        }
    }
    else{
         timer.w_month = 1;
        timer.w_date = temp;
    }
在不大于28的时候赋值为1月1日。。ok呵呵。。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-5 19:59:14 | 显示全部楼层
不是这里问题,是哪个temp++的问题,新版代码:
//得到当前的时间,结果保存在calendar结构体里面
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void)
{
static u16 daycnt=0;
u32 timecount=0; 
u32 temp=0;
u16 temp1=0;   
  timecount=RTC->CNTH;//得到计数器中的值(秒钟数)
timecount<<=16;
timecount+=RTC->CNTL;  

  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 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;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-5 19:59:32 | 显示全部楼层
if(Is_Leap_Year(temp1))//是闰年 

if(temp>=366)temp-=366;//闰年的秒钟数 
else break;   

这里原来有个temp++,去掉。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2013-1-5 20:07:26 | 显示全部楼层
好吧。。不过我按自己那样该也能用
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2013-1-5 20:09:20 | 显示全部楼层
回复【4楼】jiaduo:
---------------------------------
不对啊。。这样我觉得也不行。。和原来代码没啥区别啊。。只是换了个结构体名字
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;   //得到日期 

回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2013-1-5 20:10:18 | 显示全部楼层
如果temp<28就没有了对moonth 和 date的赋值了啊。原子哥
回复 支持 反对

使用道具 举报

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
 楼主| 发表于 2013-1-5 20:11:10 | 显示全部楼层
if(Is_Leap_Year(temp1))//是闰年 

if(temp>=366)temp-=366;//闰年的秒钟数 
else break;   

这里原来有个temp++,去掉。
这部分我代码本来就没temp++
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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