[STM32] 11-RTC-Second_Interrupt

Morgan Ting
閱益如美
Published in
11 min readMay 1, 2022
Photo by Kenny Eliason on Unsplash

RTC ( Real — Time Clock ) 實時 / 即時 時鐘,是一組獨立運作的計時器通常作為系統時鐘,提供系統當前時間查詢、時間標記、系統休眠喚醒…等。本文章將介紹 STM 32 F103C8T6 的 RTC second interrupt 秒中斷功能,並以 LED 燈呈現中斷效果。

文章內容

  1. RTC 簡介
  2. RTC second interrupt 秒中斷
  3. 實作
  4. 成果展示

工具與材料

  1. STM32CubeIDE
  2. Blue Pill ( STM32F103C8T6 ) 開發板
  3. ST-LINK v2
  4. LED 燈 *1
  5. 220 Ω 電阻 *1
  6. 麵包板與單芯線

RTC 簡介

RTC ( Real Time Clock ) 是一組獨立的計時裝置,在微處理器中有獨立的供電系統提供時間查詢以及休眠喚醒等功能,市面上也有獨立的時鐘 IC 例如 DS1307、DS1375 … 等系列。

RTC 在供電情況下就會一直計數為了避免系統斷電造成停止計時,在需要 RTC 的場合會加裝電池以因應系統斷電。

STM 32 F103C8T6 處理器內含的 RTC 具有以下特性

  1. 可設定分頻係數,最高為 2 的 20 次方 ( 1,048,576 )。
  2. 32 位元計數器提供較長時間計數範圍。
  3. 2 個獨立時脈來源,APB1 的 PCLK1 與 RTC 時鐘 ( RTC 時脈需小於 PCLK1 時脈 1/4 以上 )。

RTC 具有多種時脈來源:

  1. HSE 時脈除以 128。
  2. LSE 震盪器時脈。
  3. LSI 震盪器時脈。

RTC 兩個獨立重置類型:

  1. APB1 介面由系統重置。
  2. RTC 核心 ( 預分頻、鬧鐘、計數器、分頻 ) 由備份區重置。

RTC 三個中斷:

  1. Seconds Interrupt 秒中斷,可產生週期性中斷最長周期可達一秒鐘。
  2. Overflow 溢位中斷,計數器溢位回到 0 時產生中斷。
  3. Alarm Interrupt 鬧鐘中斷,產生一個可設定時間的鬧鐘中斷。
RTC 系統方塊圖

由 RTC 系統方塊圖可以了解整個 RTC 系統包含 3 個部分。

  1. APB1 介面與 APB1 匯流排連接,我們可以透過 APB1 介面對 RTC 進行讀寫。
  2. RTC 核心,由一個 20 位元分頻器 RTC_DIV 可以對 RTCCLK 進行分頻降低計數頻率,分頻後的時脈送入一個 32 位元計數器 RTC_CNT,如果我們設定成每秒計數一次那麼經過 2 的 32 次方 ( 4,294,967,296 ) 秒,約 138 年後才會溢位。
  3. RTC 中斷,由方塊圖可見到有三個中斷可以使用。RTC_Seconds 產生週期性中斷,也就是持續反覆的產生中斷,至於週期性時間不一定是每秒,而是因為設定成每秒中斷一次較符合時鐘的計數方式。RTC_Overflow 中斷則是當計數器發生溢位時會產生中斷。RTC_Alarm 鬧鐘中斷,顧名思義就是個鬧鐘,我們可以設定在某個時刻產生中斷。

RTC second interrupt 秒中斷

這一次的主題放在 RTC_Seconds 秒中斷上頭,藉由分頻將 RTC 計數週期設為 1 秒,並且啟動 RTC_Seconds 中斷後,中斷控制系統就會在每一秒產生一次中斷。

方塊圖中可以看到 RTC 核心為灰色,底下有 「powered in Standby」表示在休眠模式下 RTC 核心仍會運作,至於 RTC_CR 則為「not powered in Standby」表示休眠模式下不能運作, RTC_Seconds 、RTC_Overflow 與 RTC_Alarm 三個中斷只有 RTC_Alarm 鬧鐘中斷在休眠模式下可以運作用來喚醒微處理器,使用上的限制需要注意。

RTC second interrupt

實作

這一次 RTC_Seconds 秒中斷實作動作設計為利用秒中斷來點亮與熄滅位於 PA1 腳位的 LED 燈,藉由 STM32CubeIDE 與 Hardware Abstraction Layer, HAL 函式庫讓這一項工作變得很簡單。

一、開啟 STM32CubeIDE 開發環境,建立一個新的專案。

start new project

二、選擇微處理器型號,輸入F103C8 可以快速找到,選擇該型號後按下 「Finish」鍵。

target selection

三、輸入專案名稱後按下「Finish」鍵。

project name

四、來到 系統設定畫面,接下來進行一連串設定。

configuration

五、按順序首先設定 SYS ,由於我們是用 ST-Link V2 燒錄器將程式上傳到晶片,所以這邊的 Debug 選項選擇 「Serial Wire」。

六、RCC 時脈源,HSE 與 LSE 皆選擇 「Crystal / Ceramic Resonator」,其中 HSE 是連接開發板上的 8 MHz 震盪器提供系統使用,LSE 連接開發板的 32 Khz 震盪器作為 RTC 時脈源。

clock source

七、RTC 將 「Active Clock Source 」與 「RTC Global Interrupt 」打勾,啟用 RTC 時脈與中斷。

RTC setting

八、接下來設定 PA1 ,由於 PA1 連接 LED 因此把 PA1 設定成輸出模式,點擊 PA1 後選擇 「 GPIO_Output 」。

PA1 as output

由於 PA1 連接 LED 我們可以進一步將 PA1 腳位賦予名稱使得標示上具有意義,在 PA1 按滑鼠右鍵後選擇 「Enter User Label」後輸入 「LED」作為 PA1 的別名。

alias

腳位設定完成。

pin setting

九、Clock Configuration 設定時脈來源,上半部為 RTC 時脈來源設定,由於開發板有安裝一個 32 Khz 的震盪器,因此選擇 「LSE」將 RTC 時脈源設為 32 Khz。

中間是系統時脈來源,選擇「HSE」外接的 8 MHz 震盪器作為時脈來源。

clock setting

十、Project Manager 這裡通常不需要設定,看一下專案名稱、目錄等是否需要更改。

沒問題後,可以按下存檔按鈕,或是 「Project」=> 「Generate Code」產生預設的程式碼。

generate code

十一、進入程式碼編輯畫面後可以進行程式撰寫,首先我們要啟動秒中斷功能。找到 MX_RTC_Init() 函式,加入一行程式碼啟動秒中斷功能。:

__HAL_RTC_SECOND_ENABLE_IT(&hrtc , RTC_IT_SEC );
enable RTC interrupt

十二、因為我們設計成發生中斷時點亮或熄滅 LED 燈,因此必須將控制 LED 燈的程式敘述放在中斷服務函式裡,STM32 發生中斷會進入 IRQHandler 函式裡面並在離開時呼叫 Call Back 函式,我們要做的就是找出 Call Back 函式並且把控制 LED 的程式放在 Call Back 函式中。

首先,我們點開左邊 「Project Explore」當中的 「Core」=> 「Src」=> 「Stm32f1xx_it.c」

找到 「RTC_IRQHandler」,這便是中斷發生會執行的部分。

IRQ handler

接下來,從「RTC_IRQHandler」順藤摸瓜找到裏頭有個 「HAL_RTCEx_RTCIRQHandler(&hrtc);」,利用滑鼠長按選取該程式碼後按滑鼠右鍵,選擇

「Open Declaration」瞧個究竟。

此時會開啟一個檔案,往下可以找到

__weak void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)

這就是我們要的 Call Back 函式,將該函式從 void 開始複製一整行。

call back function

最後回到主程式 main.c 的編輯區內,往下找到 「/* USER CODE BEGIN 4 */」區塊後將 Call Back 函式貼在這裡,並且寫上控制 LED 的程式。

HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);

十三、程式碼撰寫完畢後可以進行編譯,準備將程式碼上傳到開發板上。按下綠色撥放鍵。

run code

接著會出現 edit configuration 相關設定,在 debugger 的部分將 SL-Link S/N 打勾並且按一下右方的 「Scan 」按鈕,此時燒錄器 ST-Link 的編號就會出現,沒問題後按底下的 「OK 」鈕。

debugger

此時就會編譯程式碼並上傳到開發板上,完成後可以按一下開發板的 Reset 按鈕,一切都順利的話就可以看到 LED 亮一秒後熄滅一秒如此反覆動作,這些動作都是由中斷程序所進行。

電路圖

成果展示

Toggle LED
Toggle LED

總結

本次 RTC Seconds Interrupt 秒中斷實作以 RTC 實時時鐘產生秒中斷,利用中斷的產生點亮與熄滅 LED 燈,透過 HAL 函式庫的輔助讓程式碼撰寫更為輕鬆。

總結如下:

  • RTC ( Real-Time Clock ) 可以提供系統時間日期資訊。
  • RTC 時脈可以使用外接震盪器或 HSE 時脈除以 128 以及內部 RC 震盪電路作為輸入時脈。
  • RTC 具有 3 種中斷模式,RTC_Seconds 中斷產生週期性中斷,最高週期為 1 秒鐘。RTC_Overflow 中斷當 RTC 的 32 位元計數器溢位時產生中斷,RTC_Alarm 中斷為鬧鐘中斷,可以設定某時刻發生中斷。其中只有 RTC_Alarm 模式可以在休眠時運作。

參考資料

  1. STM32F103 手冊 [ 連結 ]
  2. STM32F1 HAL and Low-layer drivers [ 連結 ]

感謝讀者

若文章有幫助到您可以拍手給我鼓勵,免費支持我。

相關文章

  • [STM32] 00-Install STM32CubeIDE [連結]
  • [STM32] 01-ST-LINK [連結]
  • [STM32] 02-STM32F103C8T6 [連結]
  • [STM32] 03-GPIO-Output [連結]
  • [STM32] 04-GPIO-Input [連結]
  • [STM32] 05-Ext-Interrupt [連結]
  • [STM32] 06-Timer-Basic [連結]
  • [STM32] 07-Timer-Interrupt [連結]
  • [STM32] 08-Timer-Output_Compare [連結]
  • [STM32] 09-Timer-PWM [連結]
  • [STM32] 10-Timer-Input_Capture [連結]
  • [STM32] 11-RTC-Second-Interrupt [連結]
  • [STM32] 12-RTC-Alarm_Interrupt [連結]
  • [STM32] 13-Independent_Watch_Dog [連結]
  • [STM32] 14-Windows_Watch_Dog [連結]
  • [STM32] 15-ADC_Conversion [連結]
  • [STM32] 16-ADC_Conversion_Temperature_Sensor [連結]
  • [STM32] 17-ADC_Convversion_DMA [連結]
  • [STM32] 18-SPI [連結]
  • [STM32] 19-UART [連結]
  • [STM32] 20-I2C [連結]

--

--

Morgan Ting
閱益如美

用好奇心探索世界。喜愛學習樂於分享。