利用CKS32F107xx系列RTC的闹钟实验

描述

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会开始闪烁,但日历会继续运行。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分