0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RA6M3 HMI Board 之RTC实践

嵌入式大杂烩 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2023-06-21 21:31 次阅读

开发环境:

RT-Thread Studio:v2.2.6

开发板:RA6M3 HMI Board开发板

MCU:R7FA6M3AH3CFB

1 RA6M3 RTC简介

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

1687354145569s3ufti9iih

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官方手册:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc

3 RA6M3 RTC配置

接下来配置RTC,只需要简单配置就可使用。双击工程中的 RA Smart Configurator 图标,第一次打开需要配置正确的 FSP 安装路径。

16873541462029xkwqaqxyz

16873541464403ffa5u9gew

  • FSP配置RTC

1.添加 RTC 设备

1687354146762bi05cijzcm

2.配置 RTC

1687354147144rqac80kifa

RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是g_rtc,不然编译会提示没有相应的设备,修改 Callback 为 rtc_callback。

  • 配置RTC和alarm组件

然后打开对应的通道

1687354147528bk0ae6r22e

同时打开alarm组件。

1687354147790iwqe13x0vj

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(2023, 06, 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);

static time_t now;

void user_alarm_callback(rt_alarm_t alarm, time_t timestamp)
{
    now = time(RT_NULL);
    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 测试验证

编译下载,调试信息如下:

1687354148106fiqkq027nj

从以上打印信息可以看出,rtc已经使能,然后使用MSH命令‘alarm_test’即可使能RTC线程,并且执行相应的事件。

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

    关注

    23

    文章

    3195

    浏览量

    113032
  • RTC
    RTC
    +关注

    关注

    2

    文章

    496

    浏览量

    65715
  • GPT
    GPT
    +关注

    关注

    0

    文章

    341

    浏览量

    15115
  • RA6M3
    +关注

    关注

    0

    文章

    52

    浏览量

    40
收藏 人收藏

    评论

    相关推荐

    RA6M3 HMI BoardSDHI测评实践步骤

    首先对SDHI和SDIO本质上的区别进行说明,然后使用RT-Studio新建工程进行开发,通过RASC对RA6M3的底层硬件配置,然后使用SDHI接口实现SD的识别,搭配文件系统对SD卡进行读写操作,同时记录开发遇到的问题。
    的头像 发表于 08-07 15:54 949次阅读
    <b class='flag-5'>RA6M3</b> <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b><b class='flag-5'>之</b>SDHI测评<b class='flag-5'>实践</b>步骤

    如何利用rt-thread和HMI Board RA6M3开发一套物联网工控机?

    近年来,随着新一轮的科技发展以及工业产业升级,工业经济慢慢的由数字化向网络化和智能化发展。基于这一理念,本人利用rt-thread和HMI Board RA6M3开发了一套物联网工控机。
    的头像 发表于 09-15 15:27 1146次阅读
    如何利用rt-thread和<b class='flag-5'>HMI</b> <b class='flag-5'>Board</b> <b class='flag-5'>RA6M3</b>开发一套物联网工控机?

    RA6M3 HMI Board评测挑战】-瑞萨RA6M3上的CAN实践

    RA6M3 HMI Board 评测大挑战】-瑞萨RA6M3上的CAN实践
    的头像 发表于 10-17 14:55 1349次阅读
    【<b class='flag-5'>RA6M3</b> <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b>评测挑战】-瑞萨<b class='flag-5'>RA6M3</b>上的CAN<b class='flag-5'>实践</b>

    RA6M3数据手册(英)

    RA6M3数据手册(英)
    发表于 11-07 19:49 0次下载
    <b class='flag-5'>RA6M3</b>数据手册(英)

    RA6M3硬件用户手册(英)

    RA6M3硬件用户手册(英)
    发表于 11-07 19:49 0次下载
    <b class='flag-5'>RA6M3</b>硬件用户手册(英)

    RA6M3数据手册(中英)

    RA6M3数据手册(中英)
    发表于 11-07 19:49 0次下载
    <b class='flag-5'>RA6M3</b>数据手册(中英)

    RA6M3硬件用户手册(中英)

    RA6M3硬件用户手册(中英)
    发表于 11-07 19:49 0次下载
    <b class='flag-5'>RA6M3</b>硬件用户手册(中英)

    RA6M3 组数据表

    RA6M3 组数据表
    发表于 05-12 19:25 0次下载
    <b class='flag-5'>RA6M3</b> 组数据表

    RA6M3 HMI Board SDHI实践

    进行说明,然后使用RT-Studio新建工程进行开发,通过RASC对RA6M3的底层硬件配置,然后使用SDHI接口实现SD的识别,搭配文件系统对SD卡进行读写操作,同时记录开发遇到的问题。 1.2
    的头像 发表于 06-19 18:15 749次阅读
    <b class='flag-5'>RA6M3</b> <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b> <b class='flag-5'>之</b>SDHI<b class='flag-5'>实践</b>

    RA6M3 组用户手册:硬件

    RA6M3 组用户手册:硬件
    发表于 06-29 19:17 0次下载
    <b class='flag-5'>RA6M3</b> 组用户手册:硬件

    RA6M3 组数据表

    RA6M3 组数据表
    发表于 06-29 19:17 0次下载
    <b class='flag-5'>RA6M3</b> 组数据表

    【线下培训】上海临港: RT-Thread × 瑞萨 工业监视器 RA6M3 HMI Board解决方案

    RT-Thread 与瑞萨将于10月14日在上海临港举行一场线下培训。 本次培训将为开发者们带来期待已久的热门技术主题, RT-Thread × 瑞萨 工业监视器 RA6M3 HMI Board
    的头像 发表于 09-07 17:40 594次阅读
    【线下培训】上海临港: RT-Thread × 瑞萨 工业监视器 <b class='flag-5'>RA6M3</b> <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b>解决方案

    瑞萨RA6M3 HMI-Board Video Demo 上手指南

    高性能芯片 RA6M3 及 RT-Thread 和 LVGL 软件生态,HMI Board 不仅硬件性能强劲,同时软件生态丰富,助力开发者快速开发出 GUI 智能硬件产品。 本示例开源链接: https
    的头像 发表于 09-15 18:25 1196次阅读
    瑞萨<b class='flag-5'>RA6M3</b> <b class='flag-5'>HMI-Board</b> Video Demo 上手指南

    瑞萨 RA6M3 开发实践指南-UART实践

    RT-Thread即将发布一系列RA6M3外设驱动的实践指南,我们将使用瑞萨RA6M3 HMI-Board 开发板,带领大家上手RT-Thread设备驱动。  【硬件介绍】 1.  开
    的头像 发表于 09-23 12:15 974次阅读

    RA6M3 RT-Thread* LVGL HMI Board开发实践指南-GPIO实践

    RT-Thread即将发布一系列RA6M3外设驱动的实践指南,我们将使用瑞萨RA6M3 HMI-Board 开发板,带领大家上手RT-Thread设备驱动, 本篇文章将介绍GPIO外设
    的头像 发表于 11-30 19:05 786次阅读
    <b class='flag-5'>RA6M3</b> RT-Thread* LVGL <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b>开发<b class='flag-5'>实践</b>指南-GPIO<b class='flag-5'>实践</b>