OpenEdv-开源电子网

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

RTC时钟没写怎么会变?

[复制链接]

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2016-9-13 09:55:47 | 显示全部楼层 |阅读模式
1金钱
碰到个问题烦请各位高人指点一下,在用STM32的RTC,也没有用写时间函数RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec),只是在程序中修改了时间值,比如说calendar.w_date = calendar.w_date + 1;再重新读取时间值
RTC_Get();//更新时间,那么日期就已经改了,很奇怪。

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

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-13 11:34:23 | 显示全部楼层
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-13 11:59:17 | 显示全部楼层
真奇怪,为什么只是修改了calendar.w_date的值,根本没有执行写入RTC的操作,为什么时间好像就被修改了一样呢?重新读就是新的日期。
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-13 13:34:07 | 显示全部楼层
时间并没有被修改,重新RESET后运行又读出原来的时间,只是不清楚为什么用RTC_Get();读出来的都是修改后的时间,不是实际的时间。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-9-13 22:30:40 | 显示全部楼层
你的RTC有没有正常跑先。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-14 06:44:16 | 显示全部楼层
RTC是在正常跑,平均2天差1秒,RTC_Get()函数用的是例程中的函数。
//得到当前的时间
//返回值: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 {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;
}
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-14 06:47:12 | 显示全部楼层
对了,奇怪的是日期修改了以后RTC就按照修改后的时间在跑,现象就象是修改了时间一样,但程序RESET重新运行后又是按照以前的时间跑。
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-14 07:07:56 | 显示全部楼层
正点原子 发表于 2016-9-13 22:30
你的RTC有没有正常跑先。。。

把RTC的实验例程稍作修改,取消RTC中断,用按键修改calendar.w_month,while循环中不停获取新的时间,是同样的现象,时间按照修改后的时间走,RESET后又恢复以前的时间。
        while(1)
        {                                                                    
                Key_Num = KEY_Scan(0);
               
                RTC_Get();//更新时间
               
                if(t!=calendar.sec)
                {
                        t=calendar.sec;
                        LCD_ShowNum(60,130,calendar.w_year,4,16);                                                                          
                        LCD_ShowNum(100,130,calendar.w_month,2,16);                                                                          
                        LCD_ShowNum(124,130,calendar.w_date,2,16);         
                        switch(calendar.week)
                        {
                                case 0:
                                        LCD_ShowString(60,148,200,16,16,"Sunday   ");
                                        break;
                                case 1:
                                        LCD_ShowString(60,148,200,16,16,"Monday   ");
                                        break;
                                case 2:
                                        LCD_ShowString(60,148,200,16,16,"Tuesday  ");
                                        break;
                                case 3:
                                        LCD_ShowString(60,148,200,16,16,"Wednesday");
                                        break;
                                case 4:
                                        LCD_ShowString(60,148,200,16,16,"Thursday ");
                                        break;
                                case 5:
                                        LCD_ShowString(60,148,200,16,16,"Friday   ");
                                        break;
                                case 6:
                                        LCD_ShowString(60,148,200,16,16,"Saturday ");
                                        break;  
                        }
                        LCD_ShowNum(60,162,calendar.hour,2,16);                                                                          
                        LCD_ShowNum(84,162,calendar.min,2,16);                                                                          
                        LCD_ShowNum(108,162,calendar.sec,2,16);
                        LED0=!LED0;
                }       
                delay_ms(10);

                switch(Key_Num)
                {
                        case 2: calendar.w_month = calendar.w_month-1;break;
                        case 4: calendar.w_month = calendar.w_month+1;break;
                }
        }  
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-14 17:40:20 | 显示全部楼层
有人试过吗?能不能指点一下,谢谢!
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-14 21:19:35 | 显示全部楼层
自己顶一下
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2016-9-15 09:07:04 | 显示全部楼层
有人能指导一下吗?
回复

使用道具 举报

1

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-5-11
在线时间
4 小时
发表于 2017-5-11 15:43:40 | 显示全部楼层
Mini STM32 的指针时钟?跪求!!!源代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 12:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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