Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
NXP 微控制器
RTC
NXP-MCXN947
【NXP MCXN947测评之RTC Alarm2】
发布于 2024-04-07 10:47:18 浏览:341
订阅该版
[tocm] # 1. 前言 本例程演示了如何使用RTC设备和GPIO引脚。它包含了硬件初始化、中断处理、时间设置和闹钟功能的实现。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/f21e276264f375ca56f32e95422685b9.png.webp) 视频地址:https://www.bilibili.com/video/BV12z421y7Yt/ ## 1.1 本章内容 本章通过env环境配置 FRDM-MCXN947的RTC设备以及Alarm闹钟 ,并对NXP MCXN947的使用进行详细配置并演示测试。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/2cbd5595f69a9a4a2e1c115479398948.png.webp) ## 1.2 模块介绍 实时时钟(RTC)是一个低功耗模块,提供时间保持和日历功能,还可以针对振荡器中由于晶体或温度引起的32kHz或16kHz时钟的变化来补偿1Hz时钟。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/f4098e5940657153191019c220cec862.png.webp) MCXN947 RTC包括以下功能: - 专为低功耗设计:时间和日期计数器交错排列,以防止同时切换 - 基本时钟功能:天、小时、分钟和秒的独立计数器,日历支持—独立的年、月和星期几计数器:使用用户定义的参数自动调整夏令时 自动调整月份和闰年,如果您选择提供外部补偿的1Hz时钟,则支持运行计数器的外部时钟 - 时区偏移量——RTC使用本地时间,该时间隐含地包含时区偏移量 - 带中断的可编程报警——如果MCU将其用作唤醒事件,则从RTC输出报警 周期性中断(采样定时器中断) - 硬件补偿——针对温度变化或晶体特性导致的振荡器时钟频率变化,补偿1 Hz时钟(到计数器)。 ## 1.3 软件开发 开发环境:MDK 5.38,env 1.5.0 环境搭建博客见: - [【恩智浦FRDM-MCX947开箱实践指南1】](https://vor2345.blog.csdn.net/article/details/137411166) - [Env 用户手册](https://www.rt-thread.org/document/site/#/development-tools/env/env) 在开启 RTC 设备框架以及 RTC 驱动之后,用户可以`#include
`用来引用标准的时间操作函数(例如 `time、ctime、stime、mktime`等)。在Unix系统或者Windows系统下怎么使用`
`里边的函数。 RTC 设备框架也提供了`set_date()`和`set_time()`函数,方便用户快速修改时间和日期。 |函数| 描述 |---|---| |set_date() |设置日期,年、月、日(当地时区) |set_time() |设置时间,时、分、秒(当地时区) # 2. RTC步骤说明 ## 2.1 新建工程 下拉代码`git clone https://github.com/RT-Thread/rt-thread.git rt-thread` 文件配置代码位置如下图分部,克隆的rt-thread文件在env环境大文件夹下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/19e199a266de3c418b127fa33ace2738.png.webp) 以管理员身份运行`env.exe`,启动正常如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/128684d19c8e897ed87e93c79c49749f.png) 切换到frdm-mcxn947工程目录`cd rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/a066902c4f30f09fb42055fe3323477f.png) 此时正确进入环境配置界面 ## 2.2 配置RTC env环境中输入`menuconfig`后按回车,弹出当前工程的配置界面 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/537f3ed816186e4cfbdeed020e322a79.png) 使能RTC模块`Hardware Drivers Config ---> On-chip Peripheral Drivers ---> Enable RTC` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/d693dc8925419cc68e127bbdab3b76b8.png) 输入`Y`激活`Enable RTC` save保存设置,回车 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/94774108c0b4e229456af6aca0c70415.png) 输入`scons --target=mdk5`后按回车重新生成工程 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/2ff30c892b61a603581711b31d38726a.png) # 3. 代码验证 ## 3.1 测试代码 编写`main`测试代码,首先初始化RTC设备,然后设置日期时间,延时3秒后获取时间并打印。 ```cpp /* * Copyright (c) 2006-2024, RT-Thread Development Team * Copyright (c) 2019-2020, Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2019-10-24 Magicoe first version * 2020-01-10 Kevin/Karl Add PS demo * 2020-09-21 supperthomas fix the main.c * */ #include
#include
#include "drv_pin.h" #define LEDB_PIN ((0*32)+10) #define BUTTON_PIN ((0*32)+23) static void sw_pin_cb(void *args); #define RTC_NAME "rtc" static int rtc_test(int argc, char *argv[]) { rt_err_t ret = RT_EOK; time_t now; rt_device_t device = RT_NULL; /*寻找设备*/ device = rt_device_find(RTC_NAME); if (!device) { return RT_ERROR; } /*初始化RTC设备*/ if(rt_device_open(device, 0) != RT_EOK) { return RT_ERROR; } /* 设置日期 */ ret = set_date(2024, 4, 6); if (ret != RT_EOK) { rt_kprintf("set RTC date failed\n"); return ret; } /* 设置时间 */ ret = set_time(15, 22, 30); if (ret != RT_EOK) { rt_kprintf("set RTC time failed\n"); return ret; } /* 延时3秒 */ rt_thread_mdelay(3000); /* 获取时间 */ now = time(RT_NULL); rt_kprintf("%s\n", ctime(&now)); return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(rtc_test, rtc test); int main(void) { #if defined(__CC_ARM) rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); #elif defined(__clang__) rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); #elif defined(__ICCARM__) rt_kprintf("using iccarm, version: %d\n", __VER__); #elif defined(__GNUC__) rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); #endif rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); rt_pin_irq_enable(BUTTON_PIN, 1); rt_kprintf("RTC Alarm2 for NXP MCXN947 Review\r\n"); #ifdef RT_USING_SDIO rt_thread_mdelay(2000); if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) { rt_kprintf("sd mounted to /\n"); } else { rt_kprintf("sd mount to / failed\n"); } #endif while (1) { rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ rt_thread_mdelay(500); /* Delay 500mS */ rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ rt_thread_mdelay(500); /* Delay 500mS */ } } static void sw_pin_cb(void *args) { rt_kprintf("sw pressed\r\n"); } // end file ``` 1. 中文乱码 许多刚刚接触单片机的小白,都很有可能遇到过使用 Keil 编写注释时出现中文变成问号或者乱码的情况。 > 解决步骤 首先打开 Keil,在菜单栏中点击` Edit `–>选择` Configuration `命令–>将`Encoding`选择为`Chinese GB2312(Simplified) `–>点击 OK 即可。 > ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/bdb3c76ce1d367402c47d20df3f6fa5f.png) 编译并下载 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/b467841d28f66f8b6a279fe0ee672de7.png.webp) 使用`rtc_test`和`date`测试代码 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/98b320359c6c35885410bbfb17f7f6af.png.webp) ## 3.2 打印输出 从以上打印信息可以看出,rtc已经使能,然后使用date命令确认时间已正常写入。 ```cpp 15:30:03.371 -> sram heap, begin: 0x0x20001994, end: 0x0x2005f600 15:30:03.375 -> 15:30:03.375 -> 15:30:03.375 -> 15:30:03.375 -> \ | / 15:30:03.376 -> - RT - Thread Operating System 15:30:03.378 -> 15:30:03.379 -> / | \ 5.1.0 build Apr 6 2024 15:29:15 15:30:03.383 -> 15:30:03.383 -> 2006 - 2024 Copyright by RT-Thread team 15:30:03.386 -> 15:30:03.386 -> using armclang, version: 6210000 15:30:03.390 -> RTC Alarm2 for NXP MCXN947 Review 15:30:03.393 -> 15:30:03.393 -> 15:30:03.393 -> msh >rtc_test 15:30:17.100 -> 15:30:20.099 -> Sat Apr 6 15:30:33 2024 15:30:20.101 -> 15:30:20.101 -> 15:30:20.101 -> 15:30:20.101 -> msh >date 15:30:33.387 -> 15:30:33.387 -> local time: Sat Apr 6 15:30:47 2024 15:30:33.390 -> 15:30:33.390 -> timestamps: 1712388647 15:30:33.392 -> timezone: UTC+08:00:00 15:30:33.394 -> 15:30:33.394 -> msh > ``` # 4. Alarm 简介 alarm 闹钟功能是基于 RTC 设备实现的,根据用户设定的闹钟时间,当时间到时触发 alarm 中断,执行闹钟事件,在硬件上 RTC 提供的 Alarm 是有限的,RT-Thread 将 Alarm 在软件层次上封装成了一个组件,原理上可以实现无限个闹钟,但每个闹钟只有最后一次设定有效. > 注意:要使用 Alarm 组件,需要使用 menuconfig 配置打开 Alarm 组件功能,由于alarm 是基于 RTC 设备,因此 RTC 也需要打开,且需要实现 RTC提供的 ops 接口中的`set_alarm` 和 `get_alarm` 接口,具体实现过程请[参考 RTC](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc)驱动开发文档 现在是基于上面RTC案例开发,alarm 组件开启位置 : `RT-Thread Components -> Device Drivers -> Using RTC alarm&Using software simulation RTC device` ```bash RT-Thread Components ---> Device Drivers ---> [*] Using RTC alarm [*] Using software simulation RTC device /* 使用软件模拟 RTC */ ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/86ca75b4c921b2892211002bc48d82fc.png) 输入`scons --target=mdk5`后按回车重新生成工程 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/44547ec317d6ec1e0f8983b9bc5ed438.png) ## 4.1 访问 Alarm 设备 应用程序通过使用 alarm 组件提供的接口使用 Alarm 功能,相关接口如下 : |函数 |描述 |--|--| rt_alarm_create() |创建闹钟 rt_alarm_start() |启动闹钟 rt_alarm_stop() |停止闹钟 rt_alarm_delete() |删除闹钟 rt_alarm_control() |控制 alarm 设备 rt_alarm_dump() |打印显示设置的闹钟信息 ## 4.2 Alarm 使用示例 alarm 设备使用可以参考以下示例代码: ```cpp /* * Copyright (c) 2006-2024, RT-Thread Development Team * Copyright (c) 2019-2020, Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2019-10-24 Magicoe first version * 2020-01-10 Kevin/Karl Add PS demo * 2020-09-21 supperthomas fix the main.c * */ #include
#include
#include "drv_pin.h" #define LEDB_PIN ((0*32)+10) #define BUTTON_PIN ((0*32)+23) static void sw_pin_cb(void *args); int i; /* ** 程序清单:这是一个 RTC 设备使用例程 ** 例程导出了 alarm_sample 命令到控制终端 ** 命令调用格式:alarm_sample ** 程序功能:设置RTC时间,创建闹钟,模式:每秒触发,启动闹钟 **/ void user_alarm_callback(rt_alarm_t alarm, time_t timestamp) { rt_kprintf("user alarm callback function.\n"); rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 1 */ rt_thread_mdelay(500); /* Delay 500mS */ rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 0 */ rt_thread_mdelay(500); /* Delay 500mS */ i = i +1; if(i >= 2){ rt_alarm_stop(alarm); } } void alarm_sample(void) { rt_device_t dev = rt_device_find("rtc"); struct rt_alarm_setup setup; struct rt_alarm * alarm = RT_NULL; static time_t now; struct tm p_tm; i= 0; if (alarm != RT_NULL) return; /* 获取当前时间戳,并把下一秒时间设置为闹钟时间 */ now = time(NULL) + 1; 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_sample,alarm sample); #define RTC_NAME "rtc" static int rtc_test(int argc, char *argv[]) { rt_err_t ret = RT_EOK; time_t now; rt_device_t device = RT_NULL; /*寻找设备*/ device = rt_device_find(RTC_NAME); if (!device) { return RT_ERROR; } /*初始化RTC设备*/ if(rt_device_open(device, 0) != RT_EOK) { return RT_ERROR; } /* 设置日期 */ ret = set_date(2024, 4, 6); if (ret != RT_EOK) { rt_kprintf("set RTC date failed\n"); return ret; } /* 设置时间 */ ret = set_time(20, 31, 30); if (ret != RT_EOK) { rt_kprintf("set RTC time failed\n"); return ret; } /* 延时3秒 */ rt_thread_mdelay(3000); /* 获取时间 */ now = time(RT_NULL); rt_kprintf("%s\n", ctime(&now)); return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(rtc_test, rtc test); int main(void) { #if defined(__CC_ARM) rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); #elif defined(__clang__) rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); #elif defined(__ICCARM__) rt_kprintf("using iccarm, version: %d\n", __VER__); #elif defined(__GNUC__) rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); #endif rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); rt_pin_irq_enable(BUTTON_PIN, 1); rt_kprintf("RTC Alarm2 for NXP MCXN947 Review\r\n"); #ifdef RT_USING_SDIO rt_thread_mdelay(2000); if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) { rt_kprintf("sd mounted to /\n"); } else { rt_kprintf("sd mount to / failed\n"); } #endif while (1) { // rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ // rt_thread_mdelay(500); /* Delay 500mS */ // rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ rt_thread_mdelay(500); /* Delay 500mS */ } } static void sw_pin_cb(void *args) { rt_kprintf("sw pressed\r\n"); } #include "fsl_device_registers.h" // Device header // end file ``` ## 4.3 源码解析 在原来的RTC例程上添加了闹钟示例函数: `void alarm_sample(void)`:设置了RTC设备的时间,并创建了一个每秒触发一次的闹钟并且闪烁红色LED灯。 编译上传后,调试结果如下 : ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240407/122c40e708b959b90803797161c10602.png.webp) 可以正常设置时间,并且唤醒闹钟设置,闹钟响起后交替LED闪烁提醒。 # 5. 总结 🥳🥳🥳现在,我们在本教程中,您学习了NXP MCXN947测评之RTC Alarm。🛹🛹🛹演示了如何使用RTC设备和GPIO引脚。它包含了硬件初始化、中断处理、时间设置和闹钟功能的实现。🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣 如果你有任何问题,可以通过下面的二维码加入鹏鹏小分队,期待与你思维的碰撞😘😘😘 gitee代码地址:[https://gitee.com/vor2345/frdm-mcxn947_rtc/tree/master](https://gitee.com/vor2345/frdm-mcxn947_rtc/tree/master ) 参考链接: - [NXP MCXN947测评之 rtc](https://club.rt-thread.org/ask/article/3aeee7adc35eb5a9.html) - [Env 用户手册](https://www.rt-thread.org/document/site/#/development-tools/env/env) - [【恩智浦FRDM-MCX947开箱实践指南1】](https://club.rt-thread.org/ask/article/d4ff640897ebdc75.html )
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
2345vor
每天都满怀期待i😀
文章
20
回答
2
被采纳
0
关注TA
发私信
相关文章
1
试贴-消灭0主题
2
LPC M4的一些资料
3
LPC4088的临时分支
4
lpc1788 ad 不稳定
5
1788 LCD控制器缓冲区字节问题
6
一起来学习LPC4088吧
7
上传LPC4088的realtouch主工程
8
RealBoard 4088预定帖 [第一批板子不多,预定提前结束]
9
晒RealBoard LPC4088开箱照啦,速带小板凳前来围观
10
4088主程序需要的SD卡资源
推荐文章
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部