STM32F103單片機(jī)RTC結(jié)合time.h使用
在使用stm32f103系列單片機(jī)的時候總是會碰到RTC計時的問題,103系列單片機(jī)的RTC使用的是秒計時
在經(jīng)過一段時間的研究,終于發(fā)現(xiàn)了一種比較簡單而且易于理解的使用方法,就是結(jié)合系統(tǒng)文件time.h的使用
首先要添加頭文件
#include
RTC的初始化和普通方式無區(qū)別
u8RTC_Init(void){//檢查是不是第一次配置時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外設(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時鐘(RTCCLK),選擇LSE作為RTC時鐘RCC_RTCCLKCmd(ENABLE);//使能RTC時鐘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è)置時間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();//更新時間return0;}1234567891011121314151617181920212223242526272829303132333435
設(shè)置時間和讀取時間采用結(jié)構(gòu)體的方式
首先需要定義一個時間結(jié)構(gòu)體
typedefstruct{vu8hour;vu8min;vu8sec;vu16w_year;vu8w_month;vu8w_date;}_calendar_obj;_calendar_objcalendar;//時鐘結(jié)構(gòu)體123456789101112
在設(shè)置時間時
oidClock_SetTime(u16syear,u8smon,u8sday,u8hour,u8min,u8sec){time_ttime_t_Set_Time;//定義time_t類型的設(shè)置時間結(jié)構(gòu)體structtmtm_Set_Time;//定義tm結(jié)構(gòu)的設(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;//時tm_Set_Time.tm_min=(u32)min;//分tm_Set_Time.tm_sec=(u32)sec;//秒time_t_Set_Time=mktime(&tm_Set_Time);//得到計數(shù)初值if(time_t_Set_Time!=0xFFFFFFFF){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外設(shè)時鐘PWR_BackupAccessCmd(ENABLE);//使能RTC和后備寄存器訪問RTC_SetCounter(time_t_Set_Time);//設(shè)置RTC計數(shù)器的值RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成}}1234567891011121314151617181920212223
讀取時間
voidClock_Get(void){structtm*local;time_tRTCTime;RTCTime=RTC_GetCounter();//獲取當(dāng)前RTC高字節(jié)local=localtime(&RTCTime);//把從1970-1-1零點(diǎn)零分到當(dāng)前時間系統(tǒng)所偏移的秒數(shù)時間轉(zhuǎn)換為本地日歷時間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;//時calendar.min=(u16)local->tm_min;//分calendar.sec=(u16)local->tm_sec;//秒}123456789101112131415