您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > STM32-RTC时钟程序源码
#includertc.h_calendar_objcalendar;//时钟结构体externSTR_DATATIMEstr_dt;u8RTC_Init(void){u8temp=0;if(BKP_ReadBackupRegister(BKP_DR1)!=0x5050){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);BKP_DeInit();RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET){temp++;//delay_ms(10);Delayms(10);if(temp=250)return1;}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForLastTask();RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC,ENABLE);RTC_WaitForLastTask();RTC_EnterConfigMode();RTC_SetPrescaler(32767);RTC_WaitForLastTask();RTC_Set(2013,04,6,22,24,55);RTC_ExitConfigMode();BKP_WriteBackupRegister(BKP_DR1,0X5050);}else//系统继续计时{RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC,ENABLE);RTC_WaitForLastTask();}RTC_Get();//更新时间return0;//ok}u8Is_Leap_Year(u16year){if(year%4==0)//必须能被4整除{if(year%100==0){if(year%400==0)return1;//如果以00结尾,还要能被400整除elsereturn0;}elsereturn1;}elsereturn0;}u8consttable_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};//月修正数据表//平年的月份日期表constu8mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};u8RTC_Set(u16syear,u8smon,u8sday,u8hour,u8min,u8sec){u16t;u32seccount=0;if(syear1970||syear2099)return1;for(t=1970;tsyear;t++)//把所有年份的秒钟相加{if(Is_Leap_Year(t))seccount+=31622400;elseseccount+=31536000;}smon-=1;for(t=0;tsmon;t++){seccount+=(u32)mon_table[t]*86400;if(Is_Leap_Year(syear)&&t==1)seccount+=86400;}seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加seccount+=(u32)hour*3600;//小时秒钟数seccount+=(u32)min*60;//分钟秒钟数seccount+=sec;//最后的秒钟加上去RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_SetCounter(seccount);RTC_WaitForLastTask();return0;}u8RTC_Get(void){staticu16daycnt=0;u32timecount=0;u32temp=0;u16temp1=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;}}elsetemp-=365;//平年temp1++;}calendar.w_year=temp1;//得到年份//calendar.w_year=0x000d;temp1=0;while(temp=28)//超过了一个月{if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2月份{if(temp=29)temp-=29;//闰年的秒钟数elsebreak;}else{if(temp=mon_table[temp1])temp-=mon_table[temp1];//平年elsebreak;}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;//秒钟//ZLP-2013-5-814:01:54-ADDstr_dt.sec=calendar.sec;str_dt.min=calendar.min;str_dt.hour=calendar.hour;str_dt.day=calendar.w_date;str_dt.month=calendar.w_month;str_dt.year=calendar.w_year%100;//ZLP-2013-5-814:02:12-ENDcalendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//获取星期return0;}u8RTC_Get_Week(u16year,u8month,u8day){u16temp2;u8yearH,yearL;yearH=year/100;yearL=year%100;//如果为21世纪,年份数加100if(yearH19)yearL+=100;//所过闰年数只算1900年之后的temp2=yearL+yearL/4;temp2=temp2%7;temp2=temp2+day+table_week[month-1];if(yearL%4==0&&month3)temp2--;return(temp2%7);}
本文标题:STM32-RTC时钟程序源码
链接地址:https://www.777doc.com/doc-6689711 .html