<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32F4——RTC實(shí)時(shí)時(shí)鐘

STM32F4——RTC實(shí)時(shí)時(shí)鐘

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
一、簡(jiǎn)介:

對于STM32F的RTC實(shí)時(shí)時(shí)鐘提供了一個(gè)日歷時(shí)鐘,兩個(gè)可編程鬧鐘中斷和一個(gè)具有中斷功能的可編程喚醒標志。由于RTC的時(shí)鐘配置是在后備區域,因此在后備區域供電正常的情況下,即使是系統復位或者是從待機模式喚醒之后時(shí)間依然維持不變。下邊就以RTC模塊的框圖為引線(xiàn),對RTC的相關(guān)功能和操作做相關(guān)介紹。

本文引用地址:http://dyxdggzs.com/article/201611/317628.htm

二、框圖:

首先是時(shí)鐘的選擇,一般選擇LSE作為時(shí)鐘來(lái)源,頻率32768Hz,隨后經(jīng)過(guò)一個(gè)7位的異步預分頻(默認值為127+1)和一個(gè)15位的同步預分頻(255+1),得到1Hz的時(shí)鐘頻率,對于日歷的配置,寄存器RTC_TR用來(lái)配置時(shí)間(時(shí)分秒),寄存器RTC_DR用來(lái)配置日期(年月日和星期),由于寄存器RTC_SSR由第一次分頻得到的頻率來(lái)驅動(dòng),則寄存器RTC_SSR可以存放比秒還要小的單位壓秒(該寄存器不用來(lái)設置,可以讀?。?。鬧鐘A和鬧鐘B設定時(shí)間,來(lái)和當前時(shí)間比較,如果相等則會(huì )觸發(fā)相應的中斷。下邊是自動(dòng)喚醒功能,首先是預分頻器的分頻,得到相應時(shí)鐘,然后選擇相應的時(shí)鐘驅動(dòng)自動(dòng)重載寄存器(RTC_WUTR),自動(dòng)重載寄存器的值依次遞減至0,做相應的中斷操作。

三、相關(guān)配置過(guò)程及其相關(guān)庫函數:

基于上邊的認識,分析代碼及其配置過(guò)程。

RTC時(shí)間設置:

ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm){RTC_TimeTypeDef RTC_TimeTypeInitStructure;RTC_TimeTypeInitStructure.RTC_Hours=hour;    //小時(shí)RTC_TimeTypeInitStructure.RTC_Minutes=min;   //分鐘RTC_TimeTypeInitStructure.RTC_Seconds=sec;   //秒RTC_TimeTypeInitStructure.RTC_H12=ampm;      //時(shí)間格式return RTC_SetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);}

RTC日期設置:

ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week){RTC_DateTypeDef RTC_DateTypeInitStructure;RTC_DateTypeInitStructure.RTC_Date=date;         //日RTC_DateTypeInitStructure.RTC_Month=month;       //月RTC_DateTypeInitStructure.RTC_WeekDay=week;      //星期RTC_DateTypeInitStructure.RTC_Year=year;         //年return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);}

RTC初始化:

u8 My_RTC_Init(void){RTC_InitTypeDef RTC_InitStructure;u16 retry=0X1FFF; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR時(shí)鐘PWR_BackupAccessCmd(ENABLE);	//使能后備寄存器訪(fǎng)問(wèn) if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)		//是否第一次配置?{RCC_LSEConfig(RCC_LSE_ON);//LSE 開(kāi)啟    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//檢查指定的RCC標志位設置與否,等待低速晶振就緒{retry++;delay_ms(10);}if(retry==0)return 1;		//LSE 開(kāi)啟失敗. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//設置RTC時(shí)鐘(RTCCLK),選擇LSE作為RTC時(shí)鐘    RCC_RTCCLKCmd(ENABLE);	//使能RTC時(shí)鐘 RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC異步分頻系數(1~0X7F)RTC_InitStructure.RTC_SynchPrediv  = 0xFF;//RTC同步分頻系數(0~7FFF)RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;//RTC設置為,24小時(shí)格式RTC_Init(&RTC_InitStructure);RTC_Set_Time(20,59,56,RTC_H12_AM);	//設置時(shí)間RTC_Set_Date(15,8,13,1);		//設置日期RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);	//標記已經(jīng)初始化過(guò)了} return 0;}

設置鬧鐘時(shí)間:

void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec){ EXTI_InitTypeDef   EXTI_InitStructure;RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;RTC_TimeTypeDef RTC_TimeTypeInitStructure;RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//關(guān)閉鬧鐘A RTC_TimeTypeInitStructure.RTC_Hours=hour;//小時(shí)RTC_TimeTypeInitStructure.RTC_Minutes=min;//分鐘RTC_TimeTypeInitStructure.RTC_Seconds=sec;//秒RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=week;//星期RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//按星期鬧RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_None;//精確匹配星期,時(shí)分秒RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);RTC_ClearITPendingBit(RTC_IT_ALRA);//清除RTC鬧鐘A的標志EXTI_ClearITPendingBit(EXTI_Line17);//清除LINE17上的中斷標志位 RTC_ITConfig(RTC_IT_ALRA,ENABLE);//開(kāi)啟鬧鐘A中斷RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//開(kāi)啟鬧鐘A EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE17EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優(yōu)先級1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道NVIC_Init(&NVIC_InitStructure);//配置}

周期喚醒配置:

void RTC_Set_WakeUp(u32 wksel,u16 cnt){ EXTI_InitTypeDef   EXTI_InitStructure;RTC_WakeUpCmd(DISABLE);//關(guān)閉WAKE UPRTC_WakeUpClockConfig(wksel);//喚醒時(shí)鐘選擇RTC_SetWakeUpCounter(cnt);//設置WAKE UP自動(dòng)重裝載寄存器RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的標志EXTI_ClearITPendingBit(EXTI_Line22);//清除LINE22上的中斷標志位 RTC_ITConfig(RTC_IT_WUT,ENABLE);//開(kāi)啟WAKE UP 定時(shí)器中斷RTC_WakeUpCmd( ENABLE);//開(kāi)啟WAKE UP 定時(shí)器 EXTI_InitStructure.EXTI_Line = EXTI_Line22;//LINE22EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE22EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優(yōu)先級1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道NVIC_Init(&NVIC_InitStructure);//配置}

相關(guān)的中斷服務(wù)函數:

//RTC鬧鐘中斷服務(wù)函數void RTC_Alarm_IRQHandler(void){    if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A中斷{RTC_ClearFlag(RTC_FLAG_ALRAF);//清除中斷標志printf("ALARM A!rn");}   EXTI_ClearITPendingBit(EXTI_Line17);	//清除中斷線(xiàn)17的中斷標志 											 }//RTC WAKE UP中斷服務(wù)函數void RTC_WKUP_IRQHandler(void){    if(RTC_GetFlagStatus(RTC_FLAG_WUTF)==SET)//WK_UP中斷{ RTC_ClearFlag(RTC_FLAG_WUTF);	//清除中斷標志LED1=!LED1; }   EXTI_ClearITPendingBit(EXTI_Line22);//清除中斷線(xiàn)22的中斷標志 								}



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>