【瑞萨RA_FSP】RTC——实时时钟

news2025/2/24 5:10:17

文章目录

  • 一、RTC简介
    • 1. RTC 特性
  • 二、RTC的结构框图
    • 1. RTC引脚
    • 2. 时钟分频
    • 3. 日历计数器/二进制计数器
    • 4. 闹钟功能
  • 三、实验:用RTC提供日历时间
    • 1. 硬件设计
    • 2. 文件结构
    • 3. FSP配置
    • 4. 宏定义
    • 5. 初始化RTC
    • 6. RTC中断回调函数
    • 7. hal_entry函数


一、RTC简介

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

以上所说的掉电,是指主电源VDD断开的情况,为了RTC外设掉电继续运行,必须通过VBAT引脚接上纽扣电池给RA6M5的RTC供电。 当主电源VDD有效时,由VDD给RTC外设供电; 而当VDD掉电后,由VBAT给RTC外设供电,继续日历计数器的计时,除此之外RTC的其他功能都无法使用。 若VDD和VBAT都掉电,日历计数器的计时会丢失。

RA6M5的实时时钟(RTC)有两种计数模式,日历计数模式和二进制计数模式,通过切换寄存器设置使用。 对于日历计数模式,RTC具有从2000年到2099年的100年日历,并自动调整闰年的日期。 对于二进制计数模式,RTC计数秒,并保留信息作为串行值。 二进制计数模式可用于公历(西历)以外的日历。

子时钟振荡器或LOCO可以选择作为时间计数器的计数源。RTC使用128Hz的时钟,通过将计数源除以预分频器的值获得: 年、月、日、星期、上午/下午。 (12/24 小时模式)、时、分、秒或32位二进制按1/128秒计数。

1. RTC 特性

计数模式: 日历计数模式和二进制计数模式。

时钟源: 子时钟或LOCO。

日历计数模式: 年,月,日,星期,小时,分钟,秒计数。

二进制计数模式: 32位计二进制计数。

闹钟中断: 在日历计数模式下,可以与年,月,日,星期,小时,分钟和秒进行比较。在二进制计数模式下则与32位2进制计数器进行对比。

周期性中断: 可以选择2秒,1秒,1/2秒,1/4秒,1/8秒,1/16秒,1/32秒,1/64秒、1/128秒或1/256秒作为中断周期。

进位中断: 当从64HZ计数器到二进制计数器的进位时和当改变64Hz计数器和R64同时读取CNT寄存器时进行中断。

输入捕获: 当检测到捕获时间输入引脚的电平发生跳变时(上升沿或者下降沿时),可以进行输入捕获。 该输入捕获可以用日历计数或者二进制计数。电平跳变时可以产生中断。与GPT相同的是,该输入捕获也能使用噪声滤波器。

事件关联: 周期性输出事件。

TrustZone过滤器: 可以设置安全属性。

二、RTC的结构框图

在这里插入图片描述

1. RTC引脚

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

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

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

2. 时钟分频

对时钟源Sub-Clock或者LOCO进行分频,输出128Hz的时钟脉冲,可在VBAT供电下使用。

3. 日历计数器/二进制计数器

这个计数器可以在VBAT供电下使用,由以下寄存器(同时也是计数器)构成:

  • R64CNT:R64CNT是一个8位的计数器,由128Hz的时钟脉冲驱动,实际只使用[6:0]位,故其计数27即128次, 也就是1秒,就会产生一次进位,并驱动RSECCNT/BCNT计数器+1。

  • RSECCNT:用于统计R64CNT每秒产生的进位信号,表示“秒”,设置范围为0-59,如果设置其他值,会导致RTC工作异常。

  • RMINCNT:用于统计RSECCNT每分钟产生的进位信号,表示“分”,设置范围为0-59,如果设置其他值,会导致RTC工作异常。

  • RHRCNT:用于统计RMINCNT每小时产生的进位信号,表示“时”,当RTC设置为24小时制,则设置范围时0-23。 当RTC设置为12小时制,则设置范围时0-11。如果设置其他值,会导致RTC工作异常。

  • RDAYCNT:用于统计RHRCNT的每天时产生进位信号,表示“日”,计数范围取决于月份以及这一年是否为闰年。设置范围为1-31,如果设置其他值,会导致RTC工作异常。

  • RWKCNT:用于统计RHRCNT的每天产生的进位信号,表示“星期”,计数范围为0-6,如果设置其他值,会导致RTC工作异常。

  • RMONCNT:用于统计RDAYCNT每个月产生的进位信号,表示“月”,计数范围为1-12,如果设置其他值,会导致RTC工作异常。

  • RYRCNT:用于统计RMONCNT每个月产生的进位信号,表示“年”,计数范围为0-99,如果设置其他值,会导致RTC工作异常。

在二进制模式下,RSECCNT、RMINCNT、RHRCNT、RWKCNT共同构成BCNT(Binary Counter),是一个32位,向上递增的计数器。通过统计R64CNT的进位次数进行计数。

4. 闹钟功能

在日历计数模式下,闹钟可以按年、月、日、周、时、分、秒或它们的任意组合。在闹钟设置涉及的寄存器的ENB位(都是最高位)写1, 并在低位设置闹钟时间。将0写入不涉及闹钟设置的寄存器的ENB位。例如,设置闹钟为每天的8点30分, 则在RMINAR的最高位写入1,同时低位为30。RHRAR最高位写入1,同时低位写8。其他寄存器则在最高位写0。

在二进制计数模式下,闹钟可以以32位任意组合,在BCNTnAER中,将需要使用的位写1,不需要使用的写0。并在BCNTnAR中设置闹钟时间 例如,设置当BCNTn的[3:0]为1010的时候产生闹钟中断,则在BCNTnAR的[3:0]写入1010,且在BCNTnAER的[3:0]都写入1, BCNTnART的其他位写0。

需要注意的是,在日历计数模式下,闹钟寄存器的比较值使用BCD码。

三、实验:用RTC提供日历时间

RTC最基础的功能便是日历计数,本次实验将使用RTC的日历计数并在周期中断中,将日历时钟按“年-月-日-时:分:秒”的格式打印出来。

1. 硬件设计

在这里插入图片描述
该开发板中提供了一个钮扣电池插槽,可以接入型号为CR1220的钮扣电池,提供3V供电。

2. 文件结构

RTC_Date
├─ ......
└─ src
   ├─ led
   │  ├─ bsp_led.c
   │  └─ bsp_led.h
   ├─ debug_uart
   │  ├─ bsp_debug_uart.c
   │  └─ bsp_debug_uart.h
   ├─ rtc
   │  ├─ bsp_rtc.c
   │  └─ bsp_rtc.h
   └─ hal_entry.c

3. FSP配置

双击 configuration.xml 打开配置界面:

然后点开“Pins”->“Peripherals”->“Timers:RTC”->“RTC0”来配置SCI模块: 将“Operation Mode”配置为“Enabled”

在这里插入图片描述
点击配置窗口底部的“Stack”,如图步骤加入RTC模块。

在这里插入图片描述
点击刚刚加入的窗口,在左下角的“属性”窗口中配置中断,时钟源,模块名字等属性。由于只有Sub-Clock能使用纽扣电池供电, 故时钟源建议选择Sub-Clock。
在这里插入图片描述
最后点右上角的“Generate Project Content”按钮,让软件自动生成配置代码。

在这里插入图片描述

4. 宏定义

/**********日期宏定义**********/
#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_HOUR_SET 0          //时
#define RTC_SEC_SET 0           //秒
#define RTC_MIN_SET 0           //分

这里的星期使用蔡勒公式进行计算,读者在设置日期的时候可以直接使用这个宏,只需修改自己想设置的日期即可。 若RTC的 “Parameter Cheacking” 为 “Enabled”,则星期会在函数 “R_RTC_CalendarTimeSet()” 中被自动设置,同样使用的是蔡勒公式。

5. 初始化RTC

void RTC_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); //设置当前时间

   /*设置周期中断的周期为1秒*/
   R_RTC_PeriodicIrqRateSet (rtc.p_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
}

6. RTC中断回调函数

void rtc_callback(rtc_callback_args_t *p_args)
{
      static rtc_time_t get_time;
      switch (p_args->event)
      {
         /*若是周期中断,则发送日期给串口并切换LED电平*/
         case RTC_EVENT_PERIODIC_IRQ:
            LED1_Toggle (); //反转LED

            /*获取当前时间*/
            R_RTC_CalendarTimeGet (rtc.p_ctrl, &get_time);

            /*打印当前时间*/
            printf ("\r\n%d-%d-%d-%d:%d:%d\r\n", 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);
            break;
         default:
            break;
      }
}

由于日历时间是在RTC的中断回调函数中打印的,而printf函数需要使用串口中断,故打印使用的串口的中断优先级必须要高于RTC, 这样串口在打印的时候才能抢占RTC中断,避免出现堵塞现象,导致程序无法正常运行。

7. hal_entry函数

void hal_entry(void)
{
   /* TODO: add your own code here */
   R_BSP_PinAccessEnable(); //启用对PFS寄存器的访问,因为后面写IO口都用BSP内联函数
   Debug_UART_Init(); //初始化调试串口
   RTC_Init();  //初始化RTC

   while(1){}
#if BSP_TZ_SECURE_BUILD
   /* Enter non-secure code */
   R_BSP_NonSecureEnter();
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚幻引擎(UE5)-大世界分区WorldPartition教程(一)

文章目录 WC与WP的区别一、如何开启WP1.默认创建WP2.手动创建WP3.转换创建WP 二、设置World Partition参数三、启动流送总结 提示:以下是本篇文章正文内容,下面案例可供参考 WC与WP的区别 WorldCompostion(WC) 是UE4中制作大世界…

【java实战】emoj表情导致mySQL存储错误,完美解决

MySQL表的编码格式为utf-8,现在表内数据量巨大,已不能新建表更改表的编码格式。 采用手动编码将有问题的数据转化为utf8进行存储 工具类 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util…

大数据Doris(五十):Export导出原理

文章目录 Export导出原理 一、原理 二、查询计划拆分 三、查询计划执行 Export导出原理 Doris Export、Select Into Outfile、MySQL dump三种方式数据导出。用户可以根据自己的需求导出数据。此外数据还可以以文件形式通过Borker备份到远端存储系统中,之后可以…

Gitlab升级报错一:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)

Gitlab-ce从V14.0.12升级到V14.3.6或V14.10.5时报错:如下图: 解决办法: 先停掉gitlab: gitlab-ctl stop 单独启动数据库,如果不单独启动数据库,就会报以上错误 sudo gitlab-ctl start postgresql 解决办法&#x…

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP)

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP) 在互联网中,IP数据报的传输很容易出现差错,当出现差错时,最简单的处理办法就是对该IP数据报进行丢弃。但是,并不是直接丢弃就…

android 如何分析应用的内存(九)——libc回调

android 如何分析应用的内存(九) 接上文,在前面文章中,介绍了bionic库提供的各种功能,其中包括: 自定义的mallocmalloc hookmalloc debug 接下来,介绍的是bionic库提供的libc回调功能&#x…

【Java】Java核心 77:Dom4j 解析 XML综合案例

文章目录 1、需求2、案例效果3、案例分析4、自定义JDBC框架-代码实现4.1、Configuration4.2、注解4.3、映射类:Mapper4.4、SqlSession类 5、自定义JDBC框架的使用5.1、数据表5.2、创建实体类5.3、UserMapper接口5.4、配置文件:config.xml5.5、测试类5.5、…

当金融风控遇上人工智能,众安金融的实时特征平台实践

导读:随着企业数字化转型升级,线上业务呈现多场景、多渠道、多元化的特征。数据要素价值的挖掘可谓分秒必争,业务也对数据的时效性和灵活性提出了更高的要求。在庞大分散、高并发的数据来源背景下,数据的实时处理能力成为企业提升…

vCenter崩了之后重新搭建处理办法

一、需要重新搭的情况下,vCenter虚拟机是无法使用分布式端口组的,而此时所有的物理网卡都在分布式交换机上,这样vCenter虚拟机的网络是无法访问的,所以需要先找到需要一台esxi。 二、此时可以看到两个分布式交换机 正常情况下分布…

高性能商品秒杀抢购系统

完整资料进入【数字空间】查看——baidu搜索"writebug" Goirisrabbbitmqmysql构建高性能商品秒杀抢购系统 一、项目介绍 1. 课程目标 应用GoWeb快速构建秒杀系统全流程应用开发及架构化设计思维梳理逐级优化,轻松应对“秒杀”及类似高并发场景 2. 知…

layui框架学习(30:树形模块)

Layui中的树形组件模块tree用于以树形形式显示上下级结构的数据&#xff0c;类似于winform中的tree控件。tree模块的基本用法及显示效果如下所示&#xff1a; <div id"test"></div><br /><script>layui.use([tree,layer], function(){var tr…

python安装pyelliptic-.5.7报错ImportError: No module named setuptools

1.背景&#xff1a; python安装pyelliptic-.5.7模块报错 2.环境及版本&#xff1a; linux&#xff1a;centos-7.7 python&#xff1a; 2.7.5 pyelliptic&#xff1a;5.7 注意&#xff1a;这里是纯内网环境所以pip不能使用&#xff0c;我这里配置了一个内部yum源 3.解决思路&…

Spring Boot 中的事务注解

在应用程序中&#xff0c;事务管理是一个非常重要的概念。事务是指一系列的操作&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。在Spring Boot中&#xff0c;可以使用事务注解来管理事务。在使用事务注解的时候&#xff0c;一个非常重要的概念就是事务传播行为。 …

js内存泄漏及排查详解

js内存泄漏及排查详解 常见内存泄漏及解决方案 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 隐式全局变量 在局部…

音频小说项目介绍

看小说、听音频&#xff0c;App,H5网站&#xff0c;小程序多端开发 一、主页 主页tabBar四个分类&#xff1a; 首页&#xff0c;分类&#xff0c;收藏&#xff0c;我的 最上方是搜索框 下方是轮播图&#xff0c;不但自动滚动&#xff0c;还有动画效果 下面分类有&#xf…

IDEA 或者SVN修改老项目的svn地址

公司svn地址修改了&#xff0c;ip修改了。本地还有代码没提交。这里介绍一下怎么在IDEA或svn修改为新地址&#xff0c;然后代码就可以直接提交了。网上也有文章介绍&#xff0c;但其中没注明一个关键点&#xff0c;导致很多人修改不成功。所以有了这篇文章。 IDEA下修改svn地址…

【Python】模块导入 ⑤ ( 主程序判断语句 | 模块中执行函数问题 | 制作自定义模块并执行函数 | 导入自定义模块会执行模块中的代码 )

文章目录 一、模块中执行函数问题1、制作自定义模块并执行函数2、导入自定义模块会执行模块中的代码3、主程序判断语句4、代码示例 - 主程序判断语句 一、模块中执行函数问题 1、制作自定义模块并执行函数 如果在自定义模块中 , 定义了函数 , 并且调用了该函数 ; 如下代码所示…

【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

目录 多播 多播的原理 多播的数据传输时的特点 TTL 的概念 TTL 和 多播组的配置方法 多播的编程与实现 发送者 接收者 多播 多播是一种介于单播和广播通信之间的技术方式&#xff0c;可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。 多播的原…

MySQL - 第11节 - MySQL事务管理

1.事务的概念 事务的概念&#xff1a; • 上层看起来比较简单的需求&#xff0c;可能对应的后端要做很多工作&#xff0c;后端这些工作组合起来才是一个完整的需求解决的方案。 • 事务由一条或多条SQL语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;共同完成一个…

聊聊transformers库; 微软推出ZeRO++技术:优化大型AI模型训练时间和成本

&#x1f989; AI新闻 &#x1f680; 微软推出ZeRO技术&#xff1a;优化大型AI模型训练时间和成本 摘要&#xff1a;据报道&#xff0c;微软研究人员最近发布了一项名为ZeRO的新技术&#xff0c;旨在优化训练大型AI模型时常遇到的数据传输成本和带宽限制问题&#xff0c;可大…