RA4M2_MINI开发.15--配置RTC时钟及显示时间

  • 概述
  • 视频教学
  • 样品申请
  • 硬件准备
  • 参考程序
  • 源码下载
  • 新建工程
  • 工程模板
  • 保存工程路径
  • 芯片配置
  • 工程模板选择
  • 时钟设置
  • SWD调试口设置
  • UART配置
  • UART属性配置
  • 设置e2studio堆栈
  • e2studio的重定向printf设置
  • R_SCI_UART_Open()函数原型
  • 回调函数user_uart_callback ()
  • printf输出重定向到串口
  • RTC配置
  • RTC属性配置
  • 设定时间
  • 设定周期性中断
  • 设定日历闹钟时间
  • 回调函数
  • R_RTC_Open函数
  • 演示效果

概述

本文将详细讲解如何借助e2studio来对瑞萨微控制器进行实时时钟(RTC)的设置和配置,以便实现日历功能和一秒钟产生的中断,从而通过串口输出实时数据。
实时时钟(RTC)模块是一种时间管理外设,主要用于记录和控制日期和时间。与常见的微控制器(MCU)中的定时器不同,RTC时钟提供了两种计时方式:日期模式和计时模式。RTC时钟的常用功能包括设置时间、设定闹钟、配置周期性中断以及启动或停止操作。
通过使用e2studio工具,我们可以轻松地对瑞萨微控制器进行RTC配置,从而实现高精度的时间和日期管理。在本文中,我们将重点讨论如何设置RTC时钟日历和产生一秒钟的中断,使得串口能够实时打印数据。

最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1Xeh3zmEat/

RA4M2

样品申请

https://www.wjx.top/vm/rCrkUrz.aspx

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL

在这里插入图片描述

参考程序

https://github.com/CoreMaker-lab/RA4M2_MINI

https://gitee.com/CoreMaker/RA4M2_MINI

源码下载

新建工程

在这里插入图片描述

工程模板

在这里插入图片描述

保存工程路径

在这里插入图片描述

芯片配置

本文中使用R7FA4M2AD3CFL#AA0来进行演示。

在这里插入图片描述

工程模板选择

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

时钟设置

开发板上的外部高速晶振为12M.

在这里插入图片描述

需要修改XTAL为12M。

在这里插入图片描述

SWD调试口设置

在这里插入图片描述

UART配置

在这里插入图片描述

点击Stacks->New Stack->Connectivity -> UART(r_sci_uart)。

在这里插入图片描述

UART属性配置

在这里插入图片描述

设置e2studio堆栈

printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。

在这里插入图片描述

e2studio的重定向printf设置

在这里插入图片描述

在嵌入式系统的开发中,尤其是在使用GNU编译器集合(GCC)时,–specs 参数用于指定链接时使用的系统规格(specs)文件。这些规格文件控制了编译器和链接器的行为,尤其是关于系统库和启动代码的链接。–specs=rdimon.specs 和 --specs=nosys.specs 是两种常见的规格文件,它们用于不同的场景。
–specs=rdimon.specs
用途: 这个选项用于链接“Redlib”库,这是为裸机(bare-metal)和半主机(semihosting)环境设计的C库的一个变体。半主机环境是一种特殊的运行模式,允许嵌入式程序通过宿主机(如开发PC)的调试器进行输入输出操作。
应用场景: 当你需要在没有完整操作系统的环境中运行程序,但同时需要使用调试器来处理输入输出(例如打印到宿主机的终端),这个选项非常有用。
特点: 它提供了一些基本的系统调用,通过调试接口与宿主机通信。
–specs=nosys.specs
用途: 这个选项链接了一个非常基本的系统库,这个库不提供任何系统服务的实现。
应用场景: 适用于完全的裸机程序,其中程序不执行任何操作系统调用,比如不进行文件操作或者系统级输入输出。
特点: 这是一个更“裸”的环境,没有任何操作系统支持。使用这个规格文件,程序不期望有操作系统层面的任何支持。
如果你的程序需要与宿主机进行交互(如在开发期间的调试),并且通过调试器进行基本的输入输出操作,则使用 --specs=rdimon.specs。
如果你的程序是完全独立的,不需要任何形式的操作系统服务,包括不进行任何系统级的输入输出,则使用 --specs=nosys.specs。

在这里插入图片描述

R_SCI_UART_Open()函数原型

在这里插入图片描述

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

    /* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);

在这里插入图片描述

回调函数user_uart_callback ()

当数据发送的时候,可以查看UART_EVENT_TX_COMPLETE来判断是否发送完毕。

在这里插入图片描述

在这里插入图片描述

可以检查检查 “p_args” 结构体中的 “event” 字段的值是否等于 “UART_EVENT_TX_COMPLETE”。如果条件为真,那么 if 语句后面的代码块将会执行。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}

在这里插入图片描述

printf输出重定向到串口

打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>

#ifdef __GNUC__                                 //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}

在这里插入图片描述

RTC配置

点击Stacks->New Stack->Timers -> Realtime Clock(r_rtc_c)。

在这里插入图片描述

RTC属性配置

在这里插入图片描述

其中LOCO为内部低速时钟,需要准确定时还是需要外部低速晶振Sub-clock。

在这里插入图片描述

在这里插入图片描述

内部低速晶振的偏差过大,不如外置低速晶振。

在这里插入图片描述

设定时间

在启动RTC后,需要为其设定当前时间。您可以使用R_RTC_CalendarTimeSet(&g_rtc0_ctrl, &set_time);函数来实现这一目标。具体的时间参数可以通过修改set_time变量来调整。

在这里插入图片描述

//RTC变量
/* rtc_time_t is an alias for the C Standard time.h struct 'tm' */
rtc_time_t set_time =
{.tm_sec  = 50,      /* 秒,范围从 0 到 59 */.tm_min  = 59,      /* 分,范围从 0 到 59 */.tm_hour = 23,      /* 小时,范围从 0 到 23*/.tm_mday = 28,      /* 一月中的第几天,范围从 1 到 31*/.tm_mon  = 1,       /* 月份,范围从 0 到 11*/.tm_year = 125,     /* 自 1900 起的年数,2025为125*/.tm_wday = 5,       /* 一周中的第几天,范围从 0 到 6*/
//    .tm_yday=0,       /* 一年中的第几天,范围从 0 到 365*/
//    .tm_isdst=0;      /* 夏令时*/
};

在这里插入图片描述

设定周期性中断

如果您想要使用RTC实现固定延迟中断,可以通过R_RTC_PeriodicIrqRateSet函数来实现。例如,要设置1秒的周期性中断,您可以使用如下代码:
R_RTC_PeriodicIrqRateSet(&g_rtc0_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
每次周期性中断产生时,系统将触发回调函数的事件RTC_EVENT_PERIODIC_IRQ。

在这里插入图片描述

设定日历闹钟时间

在启动RTC后,您可以设置日历闹钟时间。通过使用R_RTC_CalendarAlarmSet(&g_rtc0_ctrl, &set_alarm_time);函数,可以设定闹钟时间。具体的时间参数可以通过修改set_alarm_time变量来调整。具体设置方法如下。
在这个示例中,我们仅设置了0点0分进行闹钟触发,而且只在周三触发。

//RTC闹钟变量
rtc_alarm_time_t set_alarm_time=
{.time.tm_sec  = 10,      /* 秒,范围从 0 到 59 */.time.tm_min  = 30,      /* 分,范围从 0 到 59 */.time.tm_hour = 12,      /* 小时,范围从 0 到 23*/.time.tm_mday = 1,       /* 一月中的第几天,范围从 1 到 31*/.time.tm_mon  = 2,       /* 月份,范围从 0 到 11*/.time.tm_year = 125,     /* 自 1900 起的年数,2025为125*/.time.tm_wday = 6,       /* 一周中的第几天,范围从 0 到 6*/.sec_match        =  1,.min_match        =  0,.hour_match       =  0,.mday_match       =  0,.mon_match        =  0,.year_match       =  0,.dayofweek_match  =  0,};

在这里插入图片描述
在这里插入图片描述

回调函数

可以触发进入回调函数的事件如下所示,RTC_EVENT_PERIODIC_IRQ为设置的实时性事件,例如1s一次,RTC_EVENT_ALARM_IRQ为闹钟事件。

在这里插入图片描述

//RTC回调函数
volatile bool rtc_flag = 0;//RTC延时1s标志位
volatile bool rtc_alarm_flag = 0;//RTC闹钟
/* Callback function */
void rtc_callback(rtc_callback_args_t *p_args)
{/* TODO: add your own code here */if(p_args->event == RTC_EVENT_PERIODIC_IRQ)rtc_flag=1;else if(p_args->event == RTC_EVENT_ALARM_IRQ)rtc_alarm_flag=1;
}

在这里插入图片描述

R_RTC_Open函数

R_RTC_Open函数可以开启RTC。

在这里插入图片描述

同时在主程序中开启RTC已经设置时间和闹钟。

    /**********************RTC开启***************************************//* Initialize the RTC module*/err = R_RTC_Open(&g_rtc0_ctrl, &g_rtc0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Set the RTC clock source. Can be skipped if "Set Source Clock in Open" property is enabled. */R_RTC_ClockSourceSet(&g_rtc0_ctrl);/* R_RTC_CalendarTimeSet must be called at least once to start the RTC */R_RTC_CalendarTimeSet(&g_rtc0_ctrl, &set_time);/* Set the periodic interrupt rate to 1 second */R_RTC_PeriodicIrqRateSet(&g_rtc0_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);R_RTC_CalendarAlarmSet(&g_rtc0_ctrl, &set_alarm_time);uint8_t rtc_second= 0;      //秒uint8_t rtc_minute =0;      //分uint8_t rtc_hour =0;         //时uint8_t rtc_day =0;          //日uint8_t rtc_month =0;      //月uint16_t rtc_year =0;        //年uint8_t rtc_week =0;        //周rtc_time_t get_time;

在这里插入图片描述

同时在主函数的while循环中添加打印和中断处理,以及当前时间显示。

    while(1){if(rtc_flag){R_RTC_CalendarTimeGet(&g_rtc0_ctrl, &get_time);//获取RTC计数时间rtc_flag=0;rtc_second=get_time.tm_sec;//秒rtc_minute=get_time.tm_min;//分rtc_hour=get_time.tm_hour;//时rtc_day=get_time.tm_mday;//日rtc_month=get_time.tm_mon;//月rtc_year=get_time.tm_year; //年rtc_week=get_time.tm_wday;//周printf(" %d y %d m %d d %d h %d m %d s %d w\n",rtc_year+1900,rtc_month+1,rtc_day,rtc_hour,rtc_minute,rtc_second,rtc_week);}if(rtc_alarm_flag){rtc_alarm_flag=0;printf("/************************Alarm Clock********************************/\n");}R_BSP_SoftwareDelay(10U, BSP_DELAY_UNITS_MILLISECONDS);}

在这里插入图片描述

演示效果

设置2月28日,当过了凌晨0点后自动切换为3月1号显示。

在这里插入图片描述

设置每过1s打印一次当前时间,设置过1分钟,在10s时候闹铃。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Prometheus + Grafana + node_exporter实现Linux服务器性能监控

监控与告警系统部署&#xff1a;项目示例: "使用Prometheus Grafana node_exporter实现Linux服务器性能监控"描述: 在目标服务器部署node_exporter采集系统指标(CPU, 内存, 磁盘, 网络)。部署配置Prometheus Server&#xff0c;抓取node_exporter数据。部署配置Gra…

IP防护等级及检验方法说明

IP防护等级说明&#xff1a; IP (Ingress Protection) 防护等级系统是由 IEC 60529 标准定义的&#xff0c;用于衡量电气设备外壳对固体异物和液体进入的防护能力。IP代码通常由两位数字组成&#xff1a;第一位数字表示防固体异物等级(0-6)&#xff0c;第二位数字表示防水等级(…

最近看到的提示词相关内容汇总

看看能不能总结出来一些提示词最佳实践 一定要动手实践。 目前已经知道的提示词好习惯 角色扮演 操作步骤 质量要求 结构化输出 案例 Anthropic 视频中提到,实际上作为一门科学,我们可以通过以下手段尝试它。 最初的提示词,不断的尝试,直到最终的提示词。 优质提示词结…

github代理

自己整理的github代理 代理网址 https://g.cachecdn.ggff.net/ https://gitcode.com/ https://git.mxg.pub/ https://xiake.pro/ https://github.akams.cn/ 手动更新 hosts 方法 适合临时使用&#xff0c;Github 的ip经常变 Linux / MacOS hosts 路径&#xff1a;/etc/host…

交换机100G模块远距离连接踩坑记录

一、业务需求场景 两个办公场地之间相距较远,大约有几百米。网络系统规划两个办公场地的局域网之间通过100G 网络连接,几百米的距离使用多模光纤是不能满足需求的,因此选择使用单模光纤连接,交换机的模块选择使用华为QSFP28-100G-PSM4 模块,这个模块使用的是MPO接口。 两个…

精通Python异步编程:深入理解Async/Await在LLM应用中的实践

简介 在现代高性能应用开发中,特别是在处理大型语言模型(LLM)时,高效处理I/O密集型操作至关重要。Python的async和await关键字通过异步编程提供了优雅的解决方案。本综合指南将探讨如何利用这些特性构建响应迅速、高效的LLM驱动应用。 目录 理解同步与异步执行 Async/Await…

嵌入式第二十三课 !!!树结构与排序(时间复杂度)

二叉树树概念 树是 n(n > 0) 个结点的有限集合。若 n0 &#xff0c;为空树。在任意一个非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的根结点&#xff1b;&#xff08;2&#xff09;当 n>1 时&#xff0c;其余结点可分为 m 个互不相交的有…

【MySQL】初识索引

目录索引是什么优点和缺点B树和B树红黑树和哈希表存储数据的局限B树B树MySQL中的页页是什么为什么要使用页页的结构三层树高的B树可以存放多少条记录索引的分类主键索引普通索引唯⼀索引全⽂索引聚集索引和非聚集索引(重要)索引覆盖创建索引自动创建手动创建创建复合索引查看索…

重生之我在暑假学习微服务第九天《后端拆分部分完结篇》

个人主页&#xff1a;VON文章所属专栏&#xff1a;微服务 微服务系列文章 重生之我在暑假学习微服务第一天《MybatisPlus-上篇》重生之我在暑假学习微服务第二天《MybatisPlus-下篇》重生之我在暑假学习微服务第三天《Docker-上篇》重生之我在暑假学习微服务第四天《Docker-下篇…

如何实现一个简单的基于Spring Boot的用户权限管理系统?

全文目录&#xff1a;开篇语前言系统设计概述步骤一&#xff1a;创建Spring Boot项目步骤二&#xff1a;配置数据库步骤三&#xff1a;定义实体类1. 用户实体类 User2. 角色实体类 Role3. 权限实体类 Permission步骤四&#xff1a;创建JPA Repository步骤五&#xff1a;配置Spr…

机器学习及其KNN算法

一、机器学习概述机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能的核心分支&#xff0c;旨在通过算法让计算机从数据中自动学习规律并优化性能&#xff0c;而无需显式编程。这一技术领域起源于20世纪50年代&#xff0c;随着计算能力的提升和大数据时代的到来…

Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!

讲解代码分为3个步骤&#xff1a;有什么用&#xff0c;为什么需要他&#xff0c;如何使用保证大家耐心看完一定大有裨益&#xff01;如果有懂的可以跳过&#xff0c;不过建议可以看完&#xff0c;查漏补缺嘛。现在开始吧&#xff01;项目目标我们的目标是根据泰坦尼克号乘客的个…

双目标定中旋转矩阵参数应用及旋转角度计算(聚焦坐标系平行)

一、引言 在双目视觉系统开发中&#xff0c;若需实现右相机坐标系与左相机坐标系平行&#xff0c;核心在于通过双目标定获取的旋转矩阵RRR&#xff0c;消除两相机间的相对旋转。本报告聚焦旋转矩阵的物理意义与工程应用&#xff0c;详细说明如何通过旋转矩阵计算相对旋转角度&a…

GraphRAG 入门教程:从原理到实战

GraphRAG 入门教程&#xff1a;从原理到实战 1. 什么是 GraphRAG&#xff1f; GraphRAG 是一种结构化的、分层的检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;方法 和传统的 RAG 不同&#xff0c;GraphRAG 不仅仅依赖文本相似度搜索…

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇 一、规划成本管理&#xff1a;为成本管控定方向 规划成本管理是项目成本管理的起点&#xff0c;其核心是明确“如何管”的规则&#xff0c;为整个项目的成本管理提供统一框架。…

Xiphos Q8 SDR DOCK子板 AD9361 宽带收发器的 SDR 模块。

Q8 混合处理器卡的子板&#xff0c;包含基于 ADI 公司流行的 AD9361 宽带收发器的 SDR 模块。与基于 AD9361 的 SDR 模块接口PPS、CAN总线、串行、UART&#xff08;LVDS&#xff09;、USB接口电源接口&#xff08;5V、12V&#xff09; Q8 处理器卡的子板&#xff0c;集成了基于…

DPU(数据处理单元)架构中,SoC(系统级芯片)与FPGA(现场可编程门阵列)之间的数据交互

在DPU&#xff08;数据处理单元&#xff09;架构中&#xff0c;SoC&#xff08;系统级芯片&#xff09;与FPGA&#xff08;现场可编程门阵列&#xff09;之间的数据交互是实现高效异构计算的关键。根据通信目标和硬件特性&#xff0c;其交互数据类型可分为以下四类&#xff1a;…

图论(邻接表)DFS

竞赛中心 - 蓝桥云课 #include<bits/stdc.h> using namespace std; #define int long long const int A1e51; typedef pair<int,int>p; map<p,int>st; vector<p>edge[A]; int a[A]; int result0; bool dfs(int s,int u,int father,int v,int sum) {i…

深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南

引言&#xff1a;VideoToolbox框架概述 VideoToolbox是Apple提供的底层框架&#xff0c;首次在WWDC2014上推出&#xff0c;为iOS和macOS开发者提供直接访问硬件编码器和解码器的能力。作为Core Media框架的重要组成部分&#xff0c;VideoToolbox专注于视频压缩、解压缩以及Cor…

Python基础语法练习

本文涵盖了 Python 基础编程中的多个重要概念&#xff0c;从简单的输出语句到运算符、字符串操作、变量赋值等都有涉及。这些例子非常适合初学者学习和理解 Python 的基本语法。1. Hello World# 输出Hello Worldprint("Hello, World!")2. 变量赋值# 创建变量并赋值na…