STM32F10x_RTC秒中斷


Ⅰ、概述

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

該文主要講述關於RTC的秒中斷功能,這個功能類似SysTick系統滴答的功能。RTC秒中斷功能其實是每計數一次就中斷一次。注意,這里所說的秒中斷並非一定是一秒的時間,它是由RTC時鍾源分頻值決定的“秒”的時間,當然也是可以做到1秒鍾中斷一次。

 

本文章提供的實例工程,其實驗效果是:

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

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

 

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

 

 

擴展部分的功能RTC計數:可以實現RTC鬧鍾,本文將提供實例工程源代碼供大家下載學習。

 

關於本文的更多詳情請往下看。

 

Ⅱ、實例工程下載

筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。

筆者提供的實例工程都是在板子上經過多次測試並沒有問題才上傳至360雲盤,歡迎下載測試、參照學習。

 

提供下載的軟件工程是STM32F103ZE的,但F1其他型號也適用(適用F1其他型號: 關注微信,回復“修改型號”)。

 

STM32F10x_RTC鬧鍾實例源代碼工程:

https://yunpan.cn/cBbpu3gIGK38a  訪問密碼 05da

 

STM32F10x_RTC秒中斷實例源代碼工程:

https://yunpan.cn/cBbpPnhYbXR9x  訪問密碼 561f

 

STM32F1資料:

https://yunpan.cn/crBUdUGdYKam2  訪問密碼 ca90

 

Ⅲ、原理描述

    以筆者個人學習經歷來說,想要掌握其真正原理,最好還是查看參考手冊(現在有很多都翻譯為中文了),里面模塊的框圖,從框圖中大概就可以看到該模塊有些什么功能及其工作的原理。

 

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秒(請自行修改實驗測試)。

 

 

Ⅳ、源代碼分析

筆者以F1標准外設庫(同時也建議初學者使用官方的標准外設庫)為基礎建立的工程,主要以庫的方式來講述(若您的F1芯片與提供工程不一樣,可微信回復“修改型號”)。

 

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

1.RCC時鍾源

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

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

 

重點注意:

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

 

B.匹配對應時鍾。

比如:RCC_APB2外設不要配置在RCC_APB1時鍾里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);這樣能編譯通過,但這是錯誤的代碼】

 

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

 

可以在源代碼中查看其參數,也是有3中可以選擇。

 

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

RTC有三類中斷:

RTC_IT_SEC秒中斷

RTC_IT_ALR鬧鍾中斷

RTC_IT_OW(計數)溢出中斷

 

我提供的拓展功能“RTC鬧鍾”就是使用鬧鍾中斷,可以下載實例工程查看源代碼。

 

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);

 

有的中斷標志位清除方法可能有幾種方法,比如USART接收中斷,只要讀取接收值就可以清除(請看USART1_IRQHandler函數)

 

可能有人覺得自己的程序老是字在中斷函數里面,原因可能就在於沒有清除中斷標志位。

 

Ⅴ、說明

這篇文章是結合前幾篇文章來講述的,可以在微信“歷史消息”中查看。

關於筆者提供的軟件工程實例,可關注微信,在會話框回復“關於工程”,有關於工程結構描述、型號修改等講述。

 

以上總結僅供參考,若有不對之處,敬請諒解。

 

、最后

更多精彩文章我講第一時間在微信公眾號里面分享。

本着免費分享的原則,方便大家手機學習知識,定期在微信平台分享技術知識。如果你覺得分享的內容對你有用,又想了解更多相關的文章,請用微信搜索“EmbeddDeveloper” 或者掃描下面二維碼、關注,將有更多精彩內容等着你。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM