新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2021-6-11
- 在线时间
- 2 小时
|
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;
}
|
|