RTC(Real Time Clock)是實(shí)時(shí)時(shí)鐘的意思,它其實(shí)和TIM有點(diǎn)類(lèi)似,也是利用計(jì)數(shù)的原理,選擇RTC時(shí)鐘源,再進(jìn)行分頻,到達(dá)計(jì)數(shù)的目的。
該文主要講述關(guān)于RTC的秒中斷功能,這個(gè)功能類(lèi)似SysTick系統(tǒng)滴答的功能。RTC秒中斷功能其實(shí)是每計(jì)數(shù)一次就中斷一次。注意,這里所說(shuō)的秒中斷并非一定是一秒的時(shí)間,它是由RTC時(shí)鐘源和分頻值決定的“秒”的時(shí)間,當(dāng)然也是可以做到1秒鐘中斷一次。
本文章提供的實(shí)例工程,其實(shí)驗(yàn)效果是:
主函數(shù)間隔0.5秒LED變化一次;
秒中斷一次打印數(shù)據(jù)“RTC Sec.。.”;
也就是LED變化一次,串口打印一次數(shù)據(jù)“RTC Sec.。.”
擴(kuò)展部分的功能RTC計(jì)數(shù):可以實(shí)現(xiàn)RTC鬧鐘,本文將提供實(shí)例工程源代碼供大家下載學(xué)習(xí)。
Ⅱ、實(shí)例工程下載
筆者針對(duì)于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡(jiǎn)了官方的代碼,對(duì)初學(xué)者一看就明白,以簡(jiǎn)單明了的工程供大家學(xué)習(xí)。
筆者提供的實(shí)例工程都是在板子上經(jīng)過(guò)多次測(cè)試并沒(méi)有問(wèn)題才上傳至360云盤(pán),歡迎下載測(cè)試、參照學(xué)習(xí)。
提供下載的軟件工程是STM32F103ZE的,但F1其他型號(hào)也適用(適用F1其他型號(hào): 關(guān)注微信,回復(fù)“修改型號(hào)”)。
STM32F10x_RTC鬧鐘實(shí)例源代碼工程:
https://yunpan.cn/cBbpu3gIGK38a 訪問(wèn)密碼 05da
STM32F10x_RTC秒中斷實(shí)例源代碼工程:
https://yunpan.cn/cBbpPnhYbXR9x訪問(wèn)密碼 561f
STM32F1資料:
https://yunpan.cn/crBUdUGdYKam2 訪問(wèn)密碼 ca90
Ⅲ、原理描述
以筆者個(gè)人學(xué)習(xí)經(jīng)歷來(lái)說(shuō),想要掌握其真正原理,最好還是查看參考手冊(cè)(現(xiàn)在有很多都翻譯為中文了),里面模塊的框圖,從框圖中大概就可以看到該模塊有些什么功能及其工作的原理。
RTC框圖:
從上面系統(tǒng)框圖來(lái)分析“RTC秒中斷”的原理:
1、RTC時(shí)鐘源,總共有三類(lèi):
RCC_RTCCLKSource_LSE
RCC_RTCCLKSource_LSI
RCC_RTCCLKSource_HSE_Div128
本文實(shí)例代碼是:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
使用“RCC_RTCCLKSource_HSE_Div128”作為時(shí)鐘源(高速時(shí)鐘源),也就是外部高速時(shí)鐘的128分頻,也就是每秒8M/128(62500)個(gè)脈沖;
當(dāng)然,我們也可以選擇另外兩個(gè)時(shí)鐘源,也就是使用低速時(shí)鐘源,一般應(yīng)用在RTC鬧鐘可RTC日歷等都使用低速時(shí)鐘源。
2、RTC分頻:
本文實(shí)例代碼是:RTC_SetPrescaler(62500);
這個(gè)值是和上面對(duì)應(yīng)的,因?yàn)槲覀冞@里是實(shí)現(xiàn)真正的1秒鐘中斷一次。
3、RTC中斷:
RTC中斷有三種:
RTC_IT_SEC秒中斷
RTC_IT_ALR鬧鐘中斷
RTC_IT_OW(計(jì)數(shù))溢出中斷
本文實(shí)例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);
使能RTC_IT_SEC秒中斷。
再次強(qiáng)調(diào):
這里的“秒中斷”是概念上的秒中斷,它的中斷間隔時(shí)間是根據(jù)你選擇的時(shí)鐘源和分頻值決定的,并非真正的1秒鐘中斷一次。
我們可以試著將源代碼中的分頻值該62500的一半31250,可以看得出來(lái),秒中斷的間隔時(shí)間為0.5秒(請(qǐng)自行修改實(shí)驗(yàn)測(cè)試)。
Ⅳ、源代碼分析
筆者以F1標(biāo)準(zhǔn)外設(shè)庫(kù)(同時(shí)也建議初學(xué)者使用官方的標(biāo)準(zhǔn)外設(shè)庫(kù))為基礎(chǔ)建立的工程,主要以庫(kù)的方式來(lái)講述(若您的F1芯片與提供工程不一樣,可微信回復(fù)“修改型號(hào)”)。
下面將講述關(guān)于“RTC秒中斷”重要的、容易弄錯(cuò)的幾點(diǎn):
1.RCC時(shí)鐘源
該函數(shù)位于bsp.c文件下面;
RCC是很多初學(xué)者,甚至已經(jīng)工作的朋友容易遺漏的地方,有很多朋友覺(jué)得它使用的外設(shè)不正常,很大部分是沒(méi)有配置RCC導(dǎo)致的。
重點(diǎn)注意:
A.外設(shè)RCC時(shí)鐘的配置要在其外設(shè)初始化的前面;
B.匹配對(duì)應(yīng)時(shí)鐘。
比如:RCC_APB2外設(shè)不要配置在RCC_APB1時(shí)鐘里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);這樣能編譯通過(guò),但這是錯(cuò)誤的代碼】
2. RTC秒中斷配置
該函數(shù)位于rtc.c文件下面;
該函數(shù)請(qǐng)結(jié)合參考手冊(cè)(框圖和寄存器)理解。
注意4點(diǎn):
A.使能后備區(qū)域:PWR_BackupAccessCmd(ENABLE);
從系統(tǒng)框圖可以看見(jiàn)RTC有陰影部分,其實(shí)這部分就是后備區(qū)域。因此,需要使能,這也是為什么上面需要配置RCC時(shí)鐘的原因。
B.選擇RTC時(shí)鐘源:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
在原理描述中說(shuō)了,RTC時(shí)鐘源有三種:
RCC_RTCCLKSource_LSE
RCC_RTCCLKSource_LSI
RCC_RTCCLKSource_HSE_Div128
可以在源代碼中查看其參數(shù),也是有3中可以選擇。
C.使能RTC鬧鐘中斷:RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC有三類(lèi)中斷:
RTC_IT_SEC秒中斷
RTC_IT_ALR鬧鐘中斷
RTC_IT_OW(計(jì)數(shù))溢出中斷
我提供的拓展功能“RTC鬧鐘”就是使用鬧鐘中斷,可以下載實(shí)例工程查看源代碼。
D.RTC分頻:RTC_SetPrescaler(62500);
我們是為了得到真正的1秒鐘中斷一次,所以這里的值是62500 = 8M/128,這樣才能剛好1秒中斷一次。
3. NVIC配置
該函數(shù)位于bsp.c文件下面;
我們要中斷,就需要配置NVIC(中斷控制器),為其分配優(yōu)先級(jí)。
很多人覺(jué)得自己的配置沒(méi)問(wèn)題,但程序就是不進(jìn)入中斷,原因可能就在這里。因此,NVIC這里也是容易忽略的地方。
4. RTC中斷
該函數(shù)位于stm32f10x_it.c文件下面;
這里需要注意,RTC有三類(lèi)中斷,但入口都是這個(gè)函數(shù),因此,需要在函數(shù)體里面分辨是哪一個(gè)中斷進(jìn)入了該函數(shù)。
注意1點(diǎn):
清除中斷標(biāo)志位:RTC_ClearITPendingBit(RTC_IT_SEC);
有的中斷標(biāo)志位清除方法可能有幾種方法,比如USART接收中斷,只要讀取接收值就可以清除(請(qǐng)看USART1_IRQHandler函數(shù))
可能有人覺(jué)得自己的程序老是字在中斷函數(shù)里面,原因可能就在于沒(méi)有清除中斷標(biāo)志位。
評(píng)論
查看更多