在线时间8 小时
UID3965619
注册时间2024-6-19
NXP金币75
该用户从未签到
注册会员

- 积分
- 76
- 最后登录
- 2025-10-23
|
本帖最后由 eefocus_3965619 于 2025-10-16 15:44 编辑
1. 概述
在嵌入式系统中,精确的时间管理对于事件调度、数据采集和低功耗唤醒等功能至关重要。MCXN947 芯片的 RTC(Real-Time Clock)模块提供了一个 Subsecond Counter,用于在 1 秒粒度基础上实现更高精度的时间读取。
本文将介绍如何根据官方参考手册正确使能该功能,并结合实际测试结果进行说明。
硬件环境:
开发板:FRDM-MCXN947
软件环境:
IDE:MCUXpresso IDE v25.06.0
SDK:SDK Builder | MCUXpresso SDK Builder (nxp.com)
基础工程: frdmmcxn947_irtc_cm33_core0
2. Subsecond Counter 简介
根据 MCXN947 的参考手册第 56.3.2 节:
Subsecond Counter 是一个独立的计数器,用于在 1 秒 RTC 计数器的基础上提供更精细的时间分辨率。
它不会参与报警、唤醒或中断的生成。
在 RTC 被复位或 1Hz 主计数器被禁用时,Subsecond Counter 会被禁用。
必须在使能 RTC 后,手动写入 SUBSECOND_CTRL[SUB_SECOND_CNT_EN] = 1 来启用该计数器。
启用后,计数器会等待下一个 1 秒周期开始,然后以 lp_osc 时钟频率开始计数,并在每秒开始时回滚为 0。
3. 使能 Subsecond Counter 的关键步骤
3.1 使能 RTC 时钟输出:
- IRTC_GetDefaultConfig(&irtcConfig);
- irtcConfig.disableClockOutput = false;
复制代码 这一步确保 RTC 模块可以输出时钟信号。
3.2 配置 RTC 时钟输出频率:
- RTC->CTRL &= (uint16_t)(~RTC_CTRL_CLKOUT_MASK);
- RTC->CTRL |= RTC_CTRL_CLKOUT((uint16_t)kIRTC_ClkoutCoarse1Hz);
复制代码 根据数据手册, 选择粗略的 1Hz 时钟作为 RTC 的输出源。
3.3 使能 Subsecond Counter:
- IRTC_EnableSubsecondCounter(RTC, true);
复制代码 手动启用 Subsecond Counter 功能。
4. 完整代码示例及测试结果
以下是一个完整的代码示例,展示如何初始化 IRTC 并读取 Subsecond Counter 的值:
- int main(void)
- {
- irtc_config_t irtcConfig;
- BOARD_InitHardware(); // 初始化板级硬件
- IRTC_GetDefaultConfig(&irtcConfig); // 获取默认配置(lp_osc 默认频率为 16KHz)
- irtcConfig.disableClockOutput = false; // 使能 RTC 时钟输出
- if (IRTC_Init(RTC, &irtcConfig) == kStatus_Fail)
- {
- return 1;
- }
- PRINTF("RTC Example START:\r\n");
- <blockquote>RTC->CTRL &= (uint16_t)(~RTC_CTRL_CLKOUT_MASK);
复制代码
值得注意的是,当调用 IRTC_GetDefaultConfig(&irtcConfig); 时,默认情况下 lp_osc 的时钟频率为 16KHz,这意味着 Subsecond Counter 每秒可以提供最多 16834 个计数单位的时间分辨率。
每秒内 subSecond_cnt 的值从 0 开始递增,最大值接近 16834,与 lp_osc 的默认频率一致。每过一秒,计数器会自动回滚为 0,重新开始计数。
5. 结语
通过正确配置 RTC 时钟输出并手动启用 Subsecond Counter,MCXN947 的 IRTC 模块可以提供亚秒级的时间精度,非常适合用于低功耗唤醒、精确时间戳记录等应用场景。本文结合官方手册和实际测试结果,提供了完整的使能流程和代码参考,帮助开发者快速实现该功能。
|
|