RTC

下面的程序根據(jù)固件庫(kù)進(jìn)行修改蚊夫,變成自己想要的程序,包含RTC秒中斷以及鬧鐘中斷懦尝,由于嵌入式競(jìng)賽板沒有外加晶振知纷,所以使用內(nèi)部低速時(shí)鐘LSI

下面的程序不能進(jìn)行年月計(jì)時(shí),只能在一天之內(nèi)進(jìn)行計(jì)時(shí)陵霉,如果要進(jìn)行長(zhǎng)時(shí)間計(jì)時(shí)琅轧,那么就得考慮閏年,還要考慮一月是31,30還是29或28天踊挠。應(yīng)對(duì)比賽來說就夠了

(2018/1/22加)今天添加一點(diǎn)小竅門乍桂,利用數(shù)組對(duì)時(shí)間的時(shí)、分、秒進(jìn)行
存儲(chǔ)睹酌,這樣就不用定義三個(gè)變量了权谁,鬧鐘時(shí)間使用相同的方式比較好,這樣寫程序會(huì)更快;

配置步驟(原子教程)

1) 使能電源時(shí)鐘和備份區(qū)域時(shí)鐘憋沿。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//PWR是電池時(shí)鐘
2) 取消備份區(qū)寫保護(hù)旺芽。//原子點(diǎn)的視頻有斷電恢復(fù)斷電時(shí)間的功能
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后備寄存器訪問
3) 復(fù)位備份區(qū)域,開啟外部低速振蕩器辐啄。

BKP_DeInit();//復(fù)位備份區(qū)域
RCC_LSEConfig(RCC_LSE_ON);// 開啟外部低速振蕩器

4) 選擇 RTC 時(shí)鐘采章,并使能。

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇 LSE 作為 RTC 時(shí)鐘,
RCC_RTCCLKSource_LSI//選擇的是低速時(shí)鐘
RCC_RTCCLKSource_HSE_Div128// HSE 的 128 分頻

5) 設(shè)置 RTC 的分頻则披,以及配置 RTC 時(shí)鐘共缕。

在進(jìn)行 RTC 配置之前首先要打開允許配置位(CNF)洗出,庫(kù)函數(shù)是:
RTC_EnterConfigMode();/// 允許配置
在配置完成之后士复,千萬別忘記更新配置同時(shí)退出配置模式,函數(shù)是:
RTC_ExitConfigMode();//退出配置模式翩活, 更新配置
設(shè)置 RTC 時(shí)鐘分頻數(shù)阱洪, 庫(kù)函數(shù)是:
void RTC_SetPrescaler(uint32_t PrescalerValue);
這個(gè)函數(shù)只有一個(gè)入口參數(shù),就是 RTC 時(shí)鐘的分頻數(shù)菠镇,很好理解冗荸。
然后是設(shè)置秒中斷允許, RTC 使能中斷的函數(shù)是:
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState)利耍;
這個(gè)函數(shù)的第一個(gè)參數(shù)是設(shè)置秒中斷類型蚌本,這些通過宏定義定義的。 對(duì)于使能秒中斷方法是:
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中斷

6) 更新配置隘梨,設(shè)置 RTC 中斷分組程癌。

在設(shè)置完時(shí)鐘之后,我們將配置更新同時(shí)退出配置模式轴猎,這里還是通過 RTC_CRH 的 CNF
來實(shí)現(xiàn)嵌莉。 庫(kù)函數(shù)的方法是:
RTC_ExitConfigMode();//退出配置模式,更新配置
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)捻脖;//寫入后備寄存器

7) 編寫中斷服務(wù)函數(shù)

void RTC_IRQHandler(void)
{
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒中斷
    {
        RTC_ClearITPendingBit(RTC_IT_SEC);//清除中斷標(biāo)志位
    }
    if(RTC_GetITStatus(RTC_IT_ALR)!=RESET)//鬧鐘中斷
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);
        AlarmFlag = 1;
    }
}

第六屆省賽代碼“電壓測(cè)量監(jiān)控設(shè)備

#include "include.h"
#include "rtc.h"
#include "lcd.h"

#define HH 23  //時(shí)
#define MM 59  //分
#define SS 55  //秒

u32 THH = 0, TMM = 0, TSS = 0;

_Bool TimeDisplay = 0;
_Bool AlarmFlag = 0;//鬧鐘中斷
/**
  * @說明     配置RTC
  * @參數(shù)     None
  * @返回值   None
  */
void RTC_Configuration(void)
{
    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    PWR_BackupAccessCmd(ENABLE);
    BKP_DeInit();
    RCC_LSICmd(ENABLE);
    /* Wait till LSE is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
    
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    RCC_RTCCLKCmd(ENABLE);

    RTC_WaitForSynchro();
    RTC_WaitForLastTask();
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC, ENABLE); //秒中斷
    RTC_WaitForLastTask();

    RTC_ITConfig(RTC_IT_ALR, ENABLE); //鬧鐘中斷
    RTC_WaitForLastTask();
    /* Set RTC prescaler: set RTC period to 1sec */
    RTC_SetPrescaler(39999); /* RTC period = RTCCLK/RTC_PR = (40 KHz)/(39999+1) */
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
    
    RTC_SetCounter(HH*3600+MM*60+SS);//設(shè)置初始時(shí)間
    RTC_WaitForLastTask();
    RTC_SetAlarm(0); //設(shè)置鬧鐘時(shí)間
    RTC_WaitForLastTask();
    NVIC_Configuration();//中斷優(yōu)先級(jí)
}

/**
  * @說明     顯示當(dāng)前時(shí)間
  * @參數(shù)     TimeVar:RTC Counter值
  * @返回值   None
  */

uint8_t text[20];
void Time_Display(u32 TimeVar)
{
    
          /* 23:59:59 */
    if (RTC_GetCounter() == 23*3600+59*60+59)
    {
        RTC_SetCounter(0x0);
        RTC_WaitForLastTask();
    }
    /* Compute  hours */
    THH = TimeVar / 3600;
    /* Compute minutes */
    TMM = (TimeVar % 3600) / 60;
    /* Compute seconds */
    TSS = (TimeVar % 3600) % 60;

    sprintf(text,"   T: %0.2d:%0.2d:%0.2d",THH, TMM, TSS);
    LCD_DisplayStringLine(Line5,text);
}

/**
  * @說明     配置中斷向量控制器
  * @參數(shù)     None
  * @返回值   None
  */
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    /* Enable the RTC Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
void RTC_IRQHandler(void)
{
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒中斷
    {
        RTC_ClearITPendingBit(RTC_IT_SEC);
        TimeDisplay = 1;  //時(shí)間更新標(biāo)志置位
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
        
    }
    if(RTC_GetITStatus(RTC_IT_ALR)!=RESET)//鬧鐘中斷發(fā)生
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);
        AlarmFlag = 1;//送出標(biāo)志位
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锐峭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子可婶,更是在濱河造成了極大的恐慌沿癞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矛渴,死亡現(xiàn)場(chǎng)離奇詭異抛寝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門盗舰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晶府,“玉大人,你說我怎么就攤上這事钻趋〈剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蛮位,是天一觀的道長(zhǎng)较沪。 經(jīng)常有香客問我,道長(zhǎng)失仁,這世上最難降的妖魔是什么尸曼? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮萄焦,結(jié)果婚禮上控轿,老公的妹妹穿的比我還像新娘。我一直安慰自己拂封,他們只是感情好茬射,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冒签,像睡著了一般在抛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萧恕,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天刚梭,我揣著相機(jī)與錄音,去河邊找鬼票唆。 笑死朴读,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惰说。 我是一名探鬼主播磨德,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吆视!你這毒婦竟也來了典挑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤啦吧,失蹤者是張志新(化名)和其女友劉穎您觉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體授滓,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳水,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肆糕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在孝。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诚啃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出私沮,到底是詐尸還是另有隱情始赎,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布仔燕,位于F島的核電站造垛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晰搀。R本人自食惡果不足惜五辽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望外恕。 院中可真熱鬧杆逗,春花似錦、人聲如沸吁讨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽建丧。三九已至,卻和暖如春波势,著一層夾襖步出監(jiān)牢的瞬間翎朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工尺铣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴曲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓凛忿,卻偏偏與公主長(zhǎng)得像澈灼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子店溢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355