MCU微課堂
CKS32F107xx 備份寄存器
第五十一期 2025.02.18
鬧鐘實驗
本小節講解的是如何在萬年歷實驗的基礎上,利用RTC的鬧鐘功能實現一個鬧鐘,在每天的[XX小時-XX分鐘-XX秒]產生鬧鐘,然后通過閃爍LED模擬鬧鐘響效果。
程序設計要點
(1)初始化RTC外設,設置RTC初始時間;
(2)編程鬧鐘,設置鬧鐘時間;
(3)編寫鬧鐘中斷服務函數;
代碼分析
鬧鐘實驗是在萬年歷實驗的基礎上添加,相同部分的代碼不再講解,這里只講解鬧鐘相關的代碼,更加具體的請參考鬧鐘實驗的工程源碼。
(1)鬧鐘相關宏定義(與萬年歷實驗相同)
(2)初始化RTC
在本工程中,除了用RTC_ITConfig使能秒中斷外,還需要補充使鬧鐘中斷RTC_IT_ALR。
/*
* 函數名:RTC_Configuration
* 描述 :配置RTC
* 輸入 :無
* 輸出 :無
*/
void RTC_Configuration(void)
{
……
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);//使能 RTC 秒中斷和鬧鐘中斷
……
}
(3)設置默認鬧鐘時間結構體
系統默認的鬧鐘觸發時間是在斷電開機后的第8秒,因此系統默認時間和鬧鐘時間結構體設置如下。
/*時間結構體,默認時間2000-01-01 0000*/
struct rtc_time systmtime=
{
0,0,0,1,1,2000,0
};
/*時間結構體,鬧鐘時間2000-01-01 0008*/
struct rtc_time clocktime=
{
8,0,0,1,1,2000,0
};
(4)鬧鐘中斷服務函數
本實驗中的RTC中斷服務函數在萬年歷實驗的基礎上,增加了判斷鬧鐘中斷的分支,如果發生鬧鐘中斷,則將鬧鐘響標志TimeAlarm置1,然后通過翻轉LED指示燈模擬鬧鐘響的效果。
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒中斷
{
RTC_ClearITPendingBit(RTC_IT_SEC);//清中斷標志
TimeDisplay = 1;//置位秒顯示更新任務標志
RTC_WaitForLastTask();//等待RTC操作完成
}
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)//鬧鐘中斷
{
RTC_ClearITPendingBit(RTC_IT_ALR);//清中斷標志
TimeAlarm = 1 ;//鬧鐘響標志
}
if( TimeAlarm == 1)
{
GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN);//鬧鐘響翻轉LED
}
}
(5)main函數
main函數在萬年歷實驗基礎上,增加了LED初始化和鬧鐘設置的部分,其余部分相同。在初始化RTC結束之后,進行鬧鐘設置,把鬧鐘時間結構體通過mktimev函數轉換成UNIX時間戳,再減去北京時區的偏移,寫入鬧鐘寄存器。
int main()
{
……
LED_GPIO_Config();
……
clock_timestamp = mktimev(&clocktime) - TIME_ZOOM; //計算鬧鐘時間戳
RTC_SetAlarm(clock_timestamp);//寫入鬧鐘寄存器
……
while (1)
{
……
}
}
把編譯好的程序下載到開發板,當日歷時間到了鬧鐘時間時,開發板LED4會開始閃爍,但日歷會繼續運行。
-
寄存器
+關注
關注
31文章
5421瀏覽量
123290 -
鬧鐘
+關注
關注
0文章
78瀏覽量
27363 -
萬年歷
+關注
關注
3文章
189瀏覽量
24259 -
RTC
+關注
關注
2文章
607瀏覽量
68274
原文標題:MCU微課堂|CKS32F107xx 備份寄存器
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
CKS32F4xx系列產品串口DMA傳輸
CKS32F4xx系列RNG功能設置

CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內部硬件結構和工作模式

詳解CKS32F107xx系列的定時器同步功能

評論