214|0

34

帖子

0

TA的资源

一粒金砂(中级)

【瑞萨RA8D1开发板,基于M85内核的图形MCU测评】RT-Thread RTC实践 [复制链接]

 
开发环境:
IDE:MKD 5.38a
开发板:CPKCOR-RA8D1B开发板
MCU:R7FA8D1BHEC332AS00

1 RA8D1 RTC简介

RA8D1的RTC(Real Time Clock)外设,实质是一个掉电后还继续运行的定时器。从定时器的角度来说,相对于GPT外设,要简单很多 ,只有计时和触发中断以及输入捕获的功能。RTC外设的特别之处并不在于它的定时功能,而在于它掉电还继续运行的特性。
222904bi17fggffpyf4730.png

2 RT-Thread 的RTC简介

RTC (Real-Time Clock)实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时还可以工作,会外加电池供电,使时间信息一直保持有效。
在开启 RTC 设备框架以及 RTC 驱动之后,应用程序通过 RT-Thread 提供的 RTC设备管理接口来访问 RTC 硬件,相关接口如下所示:
函数 描述
rt_device_find() 根据 RTC 设备名称查找设备获取设备句柄
set_date() 设置日期,年、月、日(当地时区)
set_time() 设置时间,时、分、秒(当地时区)
另外,alarm 闹钟功能是基于 RTC 设备实现的,根据用户设定的闹钟时间,当时间到时触发 alarm 中断,执行闹钟事件。
alarm 组件提供的接口如下所示:
函数 描述
rt_alarm_create() 创建闹钟
rt_alarm_start() 启动闹钟
rt_alarm_stop() 停止闹钟
rt_alarm_delete() 删除闹钟
rt_alarm_control() 控制 alarm 设备
rt_alarm_dump() 打印显示设置的闹钟信息
关于RTC的更多资料请参看RT-Thread官方手册:

3 RA8D1 RTC配置

接下来配置RTC,只需要简单配置就可使用。双击工程中的 RA Smart Configurator 图标,第一次打开需要配置正确的 FSP 安装路径。
222904gr8r33otrn6myxei.png
222904h9966mg79av6ga46.png
  • FSP配置RTC
    1.添加 RTC 设备
    222904nlj8rbbrjb8rl8d9.png
    2.配置 RTC
    222904kk0l9p0dvpypkgex.png
    RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是g_rtc,不然编译会提示没有相应的设备,修改 Callback 为 rtc_callback。
  • 配置RTCalarm组件
打开RTC硬件。
222904y0jcjwnua6v0wcan.png
同时打开alarm组件。
222904t4m4stmzl0lywjpt.png

4 RTC代码实现

首先设置了年月日时分秒信息,然后获取当前时间,接着设置一个alarm,值得注意的是,alarm是基于RTC的,因此需要先将RTC初始化,然后才能开启alarm事件。核心代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <time.h>
#define DBG_LEVEL DBG_LOG
#define DBG_SECTION_NAME "rtc"
#include <rtdbg.h>
#define RTC_NAME "rtc"
rt_sem_t rtc_init_sem = RT_NULL;
static int uesr_rtc_init(void)
{
rt_err_t ret = RT_EOK;
time_t now;
rt_device_t device = RT_NULL;
/*创建初始化完成信号量*/
rtc_init_sem = rt_sem_create("rtc init flag", 0, 0);
if(rtc_init_sem == RT_NULL)
{
rt_kprintf("rtc sem init failed!");
return RT_ERROR;
}
/*寻找设备*/
device = rt_device_find(RTC_NAME);
if (!device)
{
rt_kprintf("find %s failed!", RTC_NAME);
return RT_ERROR;
}
/*初始化RTC设备*/
if(rt_device_open(device, 0) != RT_EOK)
{
rt_kprintf("open %s failed!", RTC_NAME);
return RT_ERROR;
}
/* 设置日期 */
ret = set_date(2024, 05, 21);
if (ret != RT_EOK)
{
rt_kprintf("set RTC date failed\n");
return ret;
}
/* 设置时间 */
ret = set_time(20, 57, 50);
if (ret != RT_EOK)
{
rt_kprintf("set RTC time failed\n");
return ret;
}
rt_sem_release(rtc_init_sem);
/* 获取时间 */
now = time(RT_NULL);
rt_kprintf("RTC device init success,now time is %s\n", ctime(&now));
return ret;
}
/*作为用户APP初始化*/
INIT_APP_EXPORT(uesr_rtc_init);
void user_alarm_callback(rt_alarm_t alarm, time_t timestamp)
{
time_t now = timestamp;
rt_kprintf("The alarm clock rings, now time is %s\n", ctime(&now));
rt_alarm_stop(alarm);
}
void alarm_test(void)
{
if(rt_sem_trytake(rtc_init_sem) != RT_EOK)
{
rt_kprintf("please init rtc first");
return ;
}
struct rt_alarm_setup setup;
struct rt_alarm * alarm = RT_NULL;
static time_t now;
struct tm p_tm;
if (alarm != RT_NULL)
return;
/*获取当前时间戳,并把下一秒时间设置为闹钟时间 */
now = time(NULL) + 5;
gmtime_r(&now,&p_tm);
setup.flag = RT_ALARM_SECOND;
setup.wktime.tm_year = p_tm.tm_year;
setup.wktime.tm_mon = p_tm.tm_mon;
setup.wktime.tm_mday = p_tm.tm_mday;
setup.wktime.tm_wday = p_tm.tm_wday;
setup.wktime.tm_hour = p_tm.tm_hour;
setup.wktime.tm_min = p_tm.tm_min;
setup.wktime.tm_sec = p_tm.tm_sec;
alarm = rt_alarm_create(user_alarm_callback, &setup);
if(RT_NULL != alarm)
{
rt_alarm_start(alarm);
}
}
/*export msh cmd*/
MSH_CMD_EXPORT(alarm_test,a alarm test);

5 测试验证

编译下载,调试信息如下:
222904y1q44j1bbzcbcbqq.png
从以上打印信息可以看出,rtc已经使能,然后使用MSH命令‘alarm_test’即可使能RTC线程,并且执行相应的事件。

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表