日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]在使用stm32f103系列單片機(jī)的時候總是會碰到RTC計時的問題,103系列單片機(jī)的RTC使用的是秒計時在經(jīng)過一段時間的研究,終于發(fā)現(xiàn)了一種比較簡單而且易于理解的使用方法,就是結(jié)合系統(tǒng)文件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零點零分到當(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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉