瑞萨RA系列FSP库开发实战指南之使用MCU芯片的RTC模拟闹钟功能实验

描述

34.4

RTC闹钟

闹钟也是RTC比较重要的一个功能,可以用于低功耗模式下的唤醒,本实验使用日历闹钟,在本实验中使用蜂鸣器作为声源,让开发板每隔1分钟发出一次声响来模拟闹钟功能。

34.4.1

硬件设计

与实验1相同基本,但是需要使用蜂鸣器,当P605引脚为高电平时,三极管导通,蜂鸣器便会响起。

蜂鸣器

点击可查看大图

34.4.2

软件设计

XCIN,XCOUT:连接到32.768kHz的晶振。

RTCOUT:输出1Hz或64Hz的方波,无法在待机模式下使用。

RTCICn(n=0,1,2):输入捕获引脚。

34.4.2

时钟分频

34.4.2.1

新建工程

对于e2studio开发环境:拷贝一份我们之前的e2s工程“39_RTC_Date”,然后将工程文件夹重命名为“39_RTC_Alarm”,最后再将它导入到我们的e2studio工作空间中。

对于Keil开发环境:拷贝一份我们之前的Keil工程“39_RTC_Date”,然后将工程文件夹重命名为“39_RTC_Alarm”,并进入该文件夹里面双击Keil工程文件,打开该工程。

34.4.2.2

FSP配置

在原有的基础上,配置Alarm Interrupt Priority不为Disabled且优先级低于串口中断即可。

蜂鸣器

点击可查看大图

34.4.2.3

闹钟初始化

列表6:代码清单39-5:闹钟初始化

左右滑动查看完整内容

 

/**
* @brief 初始化RTC 闹钟
* @param 无
* @retval 无
*/
voidRTC_Alarm_Init(void)
{
rtc_alarm_time_t alarm_time =
{
.time = {
.tm_sec = RTC_ALARM_SEC_SET, //秒
.tm_min = RTC_ALARM_MIN_SET, //分
.tm_hour = RTC_ALARM_HOUR_SET, //小时
.tm_mday = RTC_ALARM_MDAY_SET, //日(一个月中)
.tm_wday = RTC_ALARM_WDAY_SET, //星期
.tm_mon = RTC_ALARM_MON_SET, //月份
.tm_year = RTC_ALARM_YEAR_SET-1900, //年份
},
.dayofweek_match = RTC_ALARM_WDAY_ENABLE,
.hour_match = RTC_ALARM_HOUR_ENABLE,
.mday_match = RTC_ALARM_MDAY_ENABLE,
.min_match = RTC_ALARM_MIN_ENABLE,
.mon_match = RTC_ALARM_MON_ENABLE,
.sec_match = RTC_ALARM_SEC_ENABLE,
.year_match = RTC_ALARM_YEAR_ENABLE,
};
R_RTC_CalendarAlarmSet(rtc.p_ctrl, &alarm_time);
}

 

34.4.2.4

RTC初始化

列表7:代码清单39-6:RTC初始化

左右滑动查看完整内容

 

/**
* @brief 初始化RTC
* @retval 无
* @param 无
*/
voidRTC_Init(void)
{
//初始化时设定的时间
rtc_time_t set_time =
{
.tm_sec = RTC_SEC_SET, //秒
.tm_min = RTC_MIN_SET, //分
.tm_hour = RTC_HOUR_SET, //小时
.tm_mday = RTC_MDAY_SET, //日(一个月中)
.tm_wday = RTC_WDAY_SET, //星期
.tm_mon = RTC_MON_SET - 1, //月份,0~11 代表11~12 月
.tm_year = RTC_YEAR_SET-1900, //年份(如今年是2008,则这里输入2008-
,→1900=108)
};
/* 打开RTC 模块*/
R_RTC_Open (rtc.p_ctrl, rtc.p_cfg);
/* 时钟源设置,如果在FSP Configuration 设置"Set Source Clock in Open" 为
,→"enabled",那这一步可以被跳过*/
R_RTC_ClockSourceSet (rtc.p_ctrl);
/* 若RTC 时钟已经使用纽扣电池工作了一段时间,则可以使用这个函数获取当前日历并设置当
前时间*/
//R_RTC_CalendarTimeGet(rtc.p_ctrl,&set_time);
/* 这个函数至少调用一次以启动RTC*/
R_RTC_CalendarTimeSet (rtc.p_ctrl, &set_time); //设置当前时间
RTC_Alarm_Init(); //初始化闹钟中断
}

 

34.4.2.5

初始化使用的宏定义

列表8:代码清单39-7:初始化使用的宏定义

左右滑动查看完整内容

 

/**************RTC 设置时间宏定义**************/
/********** 日期宏定义**********/
#define RTC_YEAR_SET 2008 //年
#define RTC_MON_SET 8 //月
#define RTC_MDAY_SET 8 //日
/* 通过蔡勒公式计算星期,1~6 代表周一到周六,0 代表周日*/
#define RTC_WDAY_SET (RTC_YEAR_SET-2000 
+ ((RTC_YEAR_SET-2000)/4) 
- 35 + (26*(RTC_MON_SET+1))/10 
+ RTC_MDAY_SET -1 )%7
/********** 时间宏定义**********/
#define RTC_SEC_SET 0 //秒
#define RTC_MIN_SET 0 //分
#define RTC_HOUR_SET 0 //时
/************** 闹钟宏定义**************/
/********** 日期宏定义**********/
#define RTC_ALARM_YEAR_SET 2008 //年
#define RTC_ALARM_MON_SET 8 //月
#define RTC_ALARM_MDAY_SET 8 //日
/* 通过蔡勒公式计算星期*/
#define RTC_ALARM_WDAY_SET (RTC_YEAR_SET-2000 
+ ((RTC_YEAR_SET-2000)/4) 
- 35 + (26*(RTC_MON_SET+1))/10 
+ RTC_MDAY_SET -1 )%7
/********** 时间宏定义**********/
#define RTC_ALARM_SEC_SET 15 //秒
#define RTC_ALARM_MIN_SET 0 //分
#define RTC_ALARM_HOUR_SET 0 //时
/*** 使能闹钟比较***/
#define RTC_ALARM_YEAR_ENABLE 0 //年
#define RTC_ALARM_MON_ENABLE 0 //月
#define RTC_ALARM_MDAY_ENABLE 0 //日
#define RTC_ALARM_WDAY_ENABLE 0 //星期
#define RTC_ALARM_SEC_ENABLE 1 //秒
#define RTC_ALARM_MIN_ENABLE 0 //分
#define RTC_ALARM_HOUR_ENABLE 0 //时

 

通过宏定义将闹钟时间定为每分钟的第15秒,想要更改配置的时候只要修改相应的宏定义就可以了。

34.4.2.6

RTC中断回调函数

列表9:代码清单39-8:RTC中断回调函数

左右滑动查看完整内容

 

voidrtc_callback(rtc_callback_args_t *p_args)
{
staticrtc_time_t get_time;
switch (p_args->event)
{
case RTC_EVENT_PERIODIC_IRQ:
break;
/* 若是闹钟中断,则发送日期给串口并切换LED 电平并让蜂鸣器叫一声*/
case RTC_EVENT_ALARM_IRQ:
/* 获取当前时间*/
R_RTC_CalendarTimeGet (rtc.p_ctrl, &get_time);
/* 打印当前时间*/
printf ("
%d-%d-%d-%d:%d:%d
", get_time.tm_year + 1900,␣
,→get_time.tm_mon + 1, get_time.tm_mday,
get_time.tm_hour, get_time.tm_min, get_time.
,→tm_sec);
LED1_TOGGLE; //反转LED1
Buzzer_sout(); //蜂鸣器叫一声
break;
default:
break;
}
}

 

34.4.2.7

hal_entry函数

列表10:代码清单39-9:hal_entry函数

左右滑动查看完整内容

 

voidhal_entry(void)
{
/* TODO: add your own code here */
R_BSP_PinAccessEnable(); //启用对PFS 寄存器的访问, 因为后面写IO 口都用BSP
内联函数
Debug_UART4_Init(); //初始化调试串口
RTC_Init(); //初始化RTC
RTC_Alarm_Init(); //初始化闹钟
while(1){}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

 

34.4.3

下载验证

保证开发板相关硬件连接正确,用Type-C线连接开发板“USB TO UART”接口跟电脑。本次实验需要使用到串口调试助手,配置好串口参数并打开串口后,可以观察到开发板的LED灯每分钟变化一次亮灭状态,并且蜂鸣器会响一声,串口调试助手接收到闹钟响起时的RTC日历时间。

蜂鸣器

点击可查看大图

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

全部0条评论

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

×
20
完善资料,
赚取积分