
闹钟实验
本小节讲解的是如何在万年历实验的基础上,利用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 00:00:00*/
struct rtc_time systmtime=
{
0,0,0,1,1,2000,0
};
/*时间结构体,闹钟时间2000-01-01 00:00:08*/
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会开始闪烁,但日历会继续运行。
来源:中科芯MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。