STM32F103單片機(jī)RTC結(jié)合time.h使用
在使用stm32f103系列單片機(jī)的時(shí)候總是會(huì)碰到RTC計(jì)時(shí)的問題,103系列單片機(jī)的RTC使用的是秒計(jì)時(shí)
在經(jīng)過一段時(shí)間的研究,終于發(fā)現(xiàn)了一種比較簡單而且易于理解的使用方法,就是結(jié)合系統(tǒng)文件time.h的使用
首先要添加頭文件
#include
RTC的初始化和普通方式無區(qū)別
u8RTC_Init(void){//檢查是不是第一次配置時(shí)鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外設(shè)時(shí)鐘PWR_BackupAccessCmd(ENABLE);//使能后備寄存器訪問if(BKP_ReadBackupRegister(BKP_DR1)!=0x5AA5)//從指定的后備寄存器中讀出數(shù)據(jù):讀出了與寫入的指定數(shù)據(jù)不相乎{BKP_DeInit();//復(fù)位備份區(qū)域RCC_LSEConfig(RCC_LSE_ON);//設(shè)置外部低速晶振(LSE),使用外設(shè)低速晶振while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)//檢查指定的RCC標(biāo)志位設(shè)置與否,等待低速晶振就緒{}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//設(shè)置RTC時(shí)鐘(RTCCLK),選擇LSE作為RTC時(shí)鐘RCC_RTCCLKCmd(ENABLE);//使能RTC時(shí)鐘RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成RTC_WaitForSynchro();//等待RTC寄存器同步RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能RTC秒中斷RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成RTC_EnterConfigMode();//允許配置RTC_SetPrescaler(32767);//設(shè)置RTC預(yù)分頻的值RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成Clock_SetTime(2015,1,14,17,42,55);//設(shè)置時(shí)間RTC_ExitConfigMode();//退出配置模式BKP_WriteBackupRegister(BKP_DR1,0x5AA5);//向指定的后備寄存器中寫入用戶程序數(shù)據(jù)}else//如果已配置過則不再進(jìn)行配置{RTC_WaitForSynchro();//等待最近一次對RTC寄存器的寫操作完成RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能RTC秒中斷RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成}RTC_NVIC_Config();//RCT中斷分組設(shè)置Clock_Get();//更新時(shí)間return0;}1234567891011121314151617181920212223242526272829303132333435
設(shè)置時(shí)間和讀取時(shí)間采用結(jié)構(gòu)體的方式
首先需要定義一個(gè)時(shí)間結(jié)構(gòu)體
typedefstruct{vu8hour;vu8min;vu8sec;vu16w_year;vu8w_month;vu8w_date;}_calendar_obj;_calendar_objcalendar;//時(shí)鐘結(jié)構(gòu)體123456789101112
在設(shè)置時(shí)間時(shí)
oidClock_SetTime(u16syear,u8smon,u8sday,u8hour,u8min,u8sec){time_ttime_t_Set_Time;//定義time_t類型的設(shè)置時(shí)間結(jié)構(gòu)體structtmtm_Set_Time;//定義tm結(jié)構(gòu)的設(shè)置時(shí)間結(jié)構(gòu)體tm_Set_Time.tm_year=(u32)(syear-1900);//從2000年開始算起tm_Set_Time.tm_mon=(u32)(smon-1);//月tm_Set_Time.tm_mday=(u32)sday;//日tm_Set_Time.tm_hour=(u32)hour;//時(shí)tm_Set_Time.tm_min=(u32)min;//分tm_Set_Time.tm_sec=(u32)sec;//秒time_t_Set_Time=mktime(&tm_Set_Time);//得到計(jì)數(shù)初值if(time_t_Set_Time!=0xFFFFFFFF){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外設(shè)時(shí)鐘PWR_BackupAccessCmd(ENABLE);//使能RTC和后備寄存器訪問RTC_SetCounter(time_t_Set_Time);//設(shè)置RTC計(jì)數(shù)器的值RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成}}1234567891011121314151617181920212223
讀取時(shí)間
voidClock_Get(void){structtm*local;time_tRTCTime;RTCTime=RTC_GetCounter();//獲取當(dāng)前RTC高字節(jié)local=localtime(&RTCTime);//把從1970-1-1零點(diǎn)零分到當(dāng)前時(shí)間系統(tǒng)所偏移的秒數(shù)時(shí)間轉(zhuǎn)換為本地日歷時(shí)間calendar.w_year=(u16)(local->tm_year+1900);//從1900年起calendar.w_month=(u16)(local->tm_mon+1);//月calendar.w_date=(u16)local->tm_mday;//日calendar.hour=(u16)local->tm_hour;//時(shí)calendar.min=(u16)local->tm_min;//分calendar.sec=(u16)local->tm_sec;//秒}123456789101112131415