Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
HMI-Board
RTC
RA6M3 HMI Board 之RTC实践
发布于 2023-06-21 21:31:23 浏览:553
订阅该版
[tocm] __开发环境:__ RT\-Thread Studio:v2\.2\.6 开发板:RA6M3 HMI Board开发板 MCU:R7FA6M3AH3CFB # 1 RA6M3 RTC简介 R7FA6M3 的RTC\(Real Time Clock\)外设,实质是一个掉电后还继续运行的定时器。从定时器的角度来说,相对于GPT外设,要简单很多 ,只有计时和触发中断以及输入捕获的功能。RTC外设的特别之处并不在于它的定时功能,而在于它掉电还继续运行的特性。 ![1687354145569s3ufti9iih](//file1.elecfans.com/web2/M00/8A/7E/wKgZomSS-yKAe_U6AAMq2iCbKEg3.image) # 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](//file1.elecfans.com/web2/M00/89/F1/wKgZomSNGz-AbXCwAAAtX-Murhs6.image) ![16873541464403ffa5u9gew](//file1.elecfans.com/web2/M00/89/EF/wKgaomSNGz-AUYkPAAEpXcKCI3I5.image) - __FSP配置RTC__ 1\.添加 RTC 设备 ![1687354146762bi05cijzcm](//file1.elecfans.com/web2/M00/8A/7E/wKgZomSS-yOADm7dAAGnfmg11rI4.image) 2\.配置 RTC ![1687354147144rqac80kifa](//file1.elecfans.com/web2/M00/8A/7C/wKgaomSS-yOAYCAxAAEkPxzwzjk1.image) RT\-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是g\_rtc,不然编译会提示没有相应的设备,修改 Callback 为 rtc\_callback。 - __配置RTC和alarm组件__ 然后打开对应的通道 ![1687354147528bk0ae6r22e](//file1.elecfans.com/web2/M00/8A/7C/wKgaomSS-yOACLhRAADKQO9YRvc2.image) 同时打开alarm组件。 ![1687354147790iwqe13x0vj](//file1.elecfans.com/web2/M00/8A/7E/wKgZomSS-ySAWFocAAEAdQu2H_M2.image) # 4 RTC代码实现 首先设置了年月日时分秒信息,然后获取当前时间,接着设置一个alarm,值得注意的是,alarm是基于RTC的,因此需要先将RTC初始化,然后才能开启alarm事件。核心代码如下: ``` #include
#include
#include
#define DBG_LEVEL DBG_LOG #define DBG_SECTION_NAME "rtc" #include
#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](//file1.elecfans.com/web2/M00/8A/7E/wKgZomSS-ySAebNeAABZMn6wZMU1.image) 从以上打印信息可以看出,rtc已经使能,然后使用MSH命令‘alarm\_test’即可使能RTC线程,并且执行相应的事件。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BruceOu
这家伙很懒,什么也没写!
文章
27
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RTC驱动框架几点建议
2
求助:RTT在STM32F407上使用内置的RTC设置日期需重启生效,设置时间即时生效,有遇到同样问题的吗?
3
[新人试水] LPC1768 Nano3_9 添加RTC
4
STM32 关于RTC的问题
5
stm32f4xx-HAL BSP的RTC设置不对
6
关于STM32的RTC设置年份不正确的问题
7
RTT的RTC驱动调试
8
rtc驱动中的bkp模块起不到防止时间的重新设置
9
rtc时钟跑十几个小时后,比实际时间快几秒怎么解决
10
stm32如何断电之后开发板rtc时间继续往前跑
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部