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会开始闪烁,但日历会继续运行。
全部0条评论
快来发表一下你的评论吧 !