STM32CubeMX系列 | RTC實時時鐘
RTC實時時鐘
1。 RTC實時時鐘簡介
STM32的實時時鐘RTC是一個獨立的定時器,RTC模組擁有一組連續計數的計數器,在相應軟體配置下,可提供時鐘日曆的功能,修改計數器的值可以重新設定系統當前的時間和日期 RTC模組和時鐘配置系統(RCC_BDCR暫存器)是在後背區域,即在系統復位或從待機模式喚醒後RTC的設定和事件維持不變。但是在系統復位後,會自動禁止訪問後備暫存器和RTC,以防止對後備區域(BKP)的意外操作。所以在要設定時間之前,要先取消備份區域防寫。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
PC0設定為GPIO推輓輸出模式、上拉、高速、預設輸出電平為高電平
USART1選擇為非同步通訊方式,波特率設定為115200Bits/s,傳輸資料長度為8Bit,無奇偶校驗,1位停止位
啟用時鐘源,啟用日曆,選擇No RTC Output,設定初始日期和時間
使能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實時時鐘