打印
[STM32]

RTC的问题

[复制链接]
1170|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
anazel|  楼主 | 2016-9-13 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2016-9-13 14:09 | 只看该作者
可能是有其它程序在监测这些值,在修改

使用特权

评论回复
板凳
NE5532| | 2016-9-13 14:59 | 只看该作者
看不懂楼主用到什么库,怎么想的,但是基本方法是读之前清一下变量再读。

使用特权

评论回复
地板
anazel|  楼主 | 2016-9-13 16:07 | 只看该作者
NE5532 发表于 2016-9-13 14:59
看不懂楼主用到什么库,怎么想的,但是基本方法是读之前清一下变量再读。 ...

就是用的stm32库函数写的程序,看似库函数里定义的calendar结构体的值不能随便动。

使用特权

评论回复
5
anazel|  楼主 | 2016-9-13 16:07 | 只看该作者
//得到当前的时间
//返回值: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;
}

使用特权

评论回复
6
anazel|  楼主 | 2016-9-13 16:11 | 只看该作者
看上面的读取时间程序好像跟修改calendar结构体里的值没什么关系,程序就是读出CNTH和CNTL的数值,然后经过运算得出日期,但我修改了calendar结构体中的变量值后读出的就是修改后的值,只有程序重新运行又能得到正确的日期。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

448

帖子

2

粉丝