您當前的位置:首頁 > 攝影

STM32CubeMX系列 | RTC實時時鐘

作者:由 安迪西 發表于 攝影時間:2021-02-23

RTC實時時鐘

1。 RTC實時時鐘簡介

STM32的實時時鐘RTC是一個獨立的定時器,RTC模組擁有一組連續計數的計數器,在相應軟體配置下,可提供時鐘日曆的功能,修改計數器的值可以重新設定系統當前的時間和日期 RTC模組和時鐘配置系統(RCC_BDCR暫存器)是在後背區域,即在系統復位或從待機模式喚醒後RTC的設定和事件維持不變。但是在系統復位後,會自動禁止訪問後備暫存器和RTC,以防止對後備區域(BKP)的意外操作。所以在要設定時間之前,要先取消備份區域防寫。RTC的簡化框圖如下所示:

STM32CubeMX系列 | RTC實時時鐘

RTC由兩個主要部分組成:第一部分(APB1介面)用來和APB1匯流排相連,此單元還包含一組16位暫存器,可透過APB1匯流排對其進行讀寫操作;另一部分(RTC核心)由一組可程式設計計數器組成,分為兩個主要模組,第一個模組是RTC的預分頻模組,可程式設計產生1秒的RTC時間基準TR_CLK。第二個模組是一個32位的可程式設計計數器(RTC_CNT),可被初始化為當前的系統時間,一個32位的時鐘計數器按秒鐘計算可以記錄4294967296秒,約136年左右,一般應用已經足夠 RTC還有一個鬧鐘暫存器RTC_ALR,用於產生鬧鐘。系統時間按TR_CLK週期累加並與儲存在RTC_ALR暫存器中的可程式設計時間相比較,如果RTC_CNT = RTC_ALR將產出一個鬧鐘中斷,從而實現鬧鐘功能

2。 硬體設計

本實驗透過RTC的秒中斷來持續輸出時間透過串列埠1打印出來,並透過設定鬧鐘中斷實現一個鬧鐘提醒,D1指示燈提示系統正常執行

D1指示燈

USART1串列埠

RTC

3。 軟體設計

3。1 STM32CubeMX設定

RCC設定中開啟外部高速晶振(HSE)以及外部低速晶振(LSE),時鐘樹中將RTC的頻率設定為32。768KHz

STM32CubeMX系列 | RTC實時時鐘

STM32CubeMX系列 | RTC實時時鐘

PC0設定為GPIO推輓輸出模式、上拉、高速、預設輸出電平為高電平

USART1選擇為非同步通訊方式,波特率設定為115200Bits/s,傳輸資料長度為8Bit,無奇偶校驗,1位停止位

啟用時鐘源,啟用日曆,選擇No RTC Output,設定初始日期和時間

STM32CubeMX系列 | RTC實時時鐘

使能RTC全域性中斷和鬧鐘中斷

STM32CubeMX系列 | RTC實時時鐘

輸入工程名,選擇工程路徑(不要有中文),選擇MDK-ARM V5;勾選Generated periphera initialization as a pair of ‘。c/。h’ files per IP ;點選GENERATE CODE,生成工程程式碼

3。2 MDK-ARM程式設計

在rtc。c檔案中編寫秒中斷處理回撥函式和鬧鐘中斷處理函式

extern

RTC_DateTypeDef

GetDate

extern

RTC_TimeTypeDef

GetTime

void

HAL_RTCEx_RTCEventCallback

RTC_HandleTypeDef

*

hrtc

){

HAL_RTC_GetTime

hrtc

&

GetTime

RTC_FORMAT_BIN

);

HAL_RTC_GetDate

hrtc

&

GetDate

RTC_FORMAT_BIN

);

printf

“Date:%02d-%02d-%02d

\r\n

2000

+

GetDate

Year

GetDate

Month

GetDate

Date

);

printf

“Time:%02d:%02d:%02d

\r\n

GetTime

Hours

GetTime

Minutes

GetTime

Seconds

);

printf

\r\n

);

}

void

HAL_RTC_AlarmAEventCallback

RTC_HandleTypeDef

*

hrtc

){

printf

“Alarm Active。。。!!!

\n

);

}

在main。c檔案中編寫鬧鐘設定相關程式碼並開啟相關中斷

/* USER CODE BEGIN PV */

RTC_DateTypeDef

GetDate

RTC_TimeTypeDef

GetTime

RTC_AlarmTypeDef

sAlarm

/* USER CODE END PV */

/* Private function prototypes ————————————————————————-*/

void

SystemClock_Config

void

);

int

main

void

){

HAL_Init

();

SystemClock_Config

();

/* Initialize all configured peripherals */

MX_GPIO_Init

();

MX_RTC_Init

();

MX_USART1_UART_Init

();

/* USER CODE BEGIN 2 */

__HAL_RTC_SECOND_ENABLE_IT

&

hrtc

RTC_IT_SEC

);

//開啟秒中斷

sAlarm

Alarm

=

RTC_ALARM_A

sAlarm

AlarmTime

Hours

=

16

sAlarm

AlarmTime

Minutes

=

20

sAlarm

AlarmTime

Seconds

=

30

HAL_RTC_SetAlarm_IT

&

hrtc

&

sAlarm

RTC_FORMAT_BIN

);

//設定鬧鐘並使能鬧鐘中斷

/* USER CODE END 2 */

while

1

){

HAL_Delay

1000

);

HAL_GPIO_TogglePin

GPIOC

GPIO_PIN_0

);

}

}

4。 下載驗證

編譯無誤後下載到開發板,可以看到D1指示燈每1s閃爍一次,串列埠助手每1s會打印出相應的日期和時間,鬧鐘設定的時間到後會打印出鬧鐘中斷函數里的相關語句

STM32CubeMX系列 | RTC實時時鐘

關注我的公眾號,在公眾號裡發如下訊息,即可獲取相應的工程原始碼:

玩轉STM32CubeMX | RTC實時時鐘

STM32CubeMX系列 | RTC實時時鐘

標簽: RTC  鬧鐘  HAL  中斷  設定