Stm32 中RTC秒中斷的使用方法及例子

RTC(Real Time Clock)是實時時鐘的意思,它其實和TIM有點類似,也是利用計數的原理,選擇RTC時鐘源,再進行分頻,到達計數的目的。

RTC的秒中斷功能類似SysTick系統滴答的功能。RTC秒中斷功能其實是每計數一次就中斷一次。注意,秒中斷並非一定是一秒的時間,它是由RTC時鐘源和分頻值決定的“秒”的時間,當然也是可以做到1秒鐘中斷一次。

例:

主函數間隔0.5秒LED變化一次;

秒中斷一次打印數據"RTC Sec...";

也就是LED變化一次,串口打印一次數據"RTC Sec..."

擴展部分的功能RTC計數:可以實現RTC鬧鐘

原理描述

    從框圖中大概就可以看到該模塊有些什麼功能及其工作的原理。

 

RTC框圖:

從上面系統框圖來分析“RTC秒中斷”的原理:

1、RTC時鐘源,總共有三類:可任意選擇,並配置成任意秒數爲週期

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文實例代碼是:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

使用“RCC_RTCCLKSource_HSE_Div128”作爲時鐘源(高速時鐘源),也就是外部高速時鐘的128分頻,也就是每秒8M/128(62500)個脈衝;

當然,我們也可以選擇另外兩個時鐘源,也就是使用低速時鐘源,一般應用在RTC鬧鐘可RTC日曆等都使用低速時鐘源。

2、RTC分頻:

本文實例代碼是:RTC_SetPrescaler(62500);

這個值是和上面對應的,因爲我們這裏是實現真正的1秒鐘中斷一次。

3、RTC中斷:

RTC中斷有三種:

RTC_IT_SEC秒中斷(一個週期中斷一次,自己進行配置)

RTC_IT_ALR鬧鐘中斷

RTC_IT_OW(計數)溢出中斷

 

本文實例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);

使能RTC_IT_SEC秒中斷。

 

再次強調:

這裏的“秒中斷”是概念上的秒中斷,它的中斷間隔時間是根據你選擇的時鐘源和分頻值決定的,並非真正的1秒鐘中斷一次。

我們可以試着將源代碼中的分頻值該62500的一半31250,可以看得出來,秒中斷的間隔時間爲0.5秒(請自行修改實驗測試)。

下面將講述關於“RTC秒中斷”重要的、容易弄錯的幾點:

1.RCC時鐘源

該函數位於bsp.c文件下面;

RCC是很多初學者,甚至已經工作的朋友容易遺漏的地方,有很多朋友覺得它使用的外設不正常,很大部分是沒有配置RCC導致的。

重點注意:

A.外設RCC時鐘的配置要在其外設初始化的前面;

B.匹配對應時鐘。

比如:RCC_APB2外設不要配置在RCC_APB1時鐘裏面

2. RTC秒中斷配置

該函數位於rtc.c文件下面;

該函數請結合參考手冊(框圖和寄存器)理解。

注意4點:

A.使能後備區域:PWR_BackupAccessCmd(ENABLE);

從系統框圖可以看見RTC有陰影部分,其實這部分就是後備區域。因此,需要使能,這也是爲什麼上面需要配置RCC時鐘的原因。

B.選擇RTC時鐘源:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

在原理描述中說了,RTC時鐘源有三種:任意選擇

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

C.使能RTC秒中斷:RTC_ITConfig(RTC_IT_SEC,ENABLE);

RTC有三類中斷:

RTC_IT_SEC秒中斷

RTC_IT_ALR鬧鐘中斷

RTC_IT_OW(計數)溢出中斷

D.RTC分頻:RTC_SetPrescaler(62500);

我們是爲了得到真正的1秒鐘中斷一次,所以這裏的值是62500 = 8M/128,這樣才能剛好1秒中斷一次。

3. NVIC配置

該函數位於bsp.c文件下面;

我們要中斷,就需要配置NVIC(中斷控制器),爲其分配優先級。

很多人覺得自己的配置沒問題,但程序就是不進入中斷,原因可能就在這裏。因此,NVIC這裏也是容易忽略的地方。

4. RTC中斷

該函數位於stm32f10x_it.c文件下面;

這裏需要注意,RTC有三類中斷,但入口都是這個函數,因此,需要在函數體裏面分辨是哪一個中斷進入了該函數。

注意1點:

清除中斷標誌位:RTC_ClearITPendingBit(RTC_IT_SEC);

這是通過RTC_GetCounter();函數獲取計數值,然後把這個計數值分別用小時、分鐘、秒來表示的過程。代碼如下

RTCCount=RTC_GetCounter();//獲得計數值並計算當前時鐘

THH=RTCCount/3600;//小時

TMM=(RTCCount%3600)/60;//分鐘

TSS=(RTCCount%3600)%60;//秒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章