MCU微课堂 | CKS32F107xx 备份寄存器

cathy的头像
cathy 发布于:周二, 02/18/2025 - 16:33 ,关键词:

闹钟实验

本小节讲解的是如何在万年历实验的基础上,利用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)。

围观 11