概 述
在嵌入式系統(tǒng)設(shè)計(jì)中,時(shí)間管理是一個(gè)基礎(chǔ)卻至關(guān)重要的環(huán)節(jié)。無(wú)論是任務(wù)調(diào)度、數(shù)據(jù)采集,還是低功耗場(chǎng)景下的精準(zhǔn)喚醒,對(duì)時(shí)間精度的要求都在不斷提升。
MCXN947芯片內(nèi)置的RTC(Real-Time Clock)模塊,除了提供標(biāo)準(zhǔn)的秒級(jí)計(jì)時(shí)功能外,還支持Subsecond Counter(亞秒計(jì)數(shù)器),使系統(tǒng)能夠在1秒粒度基礎(chǔ)上進(jìn)一步提升時(shí)間分辨率,實(shí)現(xiàn)更精細(xì)的時(shí)間控制。
本文將基于官方參考手冊(cè),詳細(xì)介紹如何正確啟用該功能,并結(jié)合實(shí)際測(cè)試結(jié)果,梳理完整的配置流程與關(guān)鍵注意點(diǎn),幫助開(kāi)發(fā)者快速上手并穩(wěn)定應(yīng)用這一特性。
硬件環(huán)境:
開(kāi)發(fā)板:FRDM-MCXN947
軟件環(huán)境:
IDE:MCUXpresso IDE v25.06.0
SDK:SDK Builder | MCUXpresso SDK Builder (nxp.com)
基礎(chǔ)工程: frdmmcxn947_irtc_cm33_core0
一、Subsecond Counter簡(jiǎn)介
根據(jù)MCXN947的參考手冊(cè)第56.3.2節(jié):
Subsecond Counter是一個(gè)獨(dú)立的計(jì)數(shù)器,用于在1秒RTC計(jì)數(shù)器的基礎(chǔ)上提供更精細(xì)的時(shí)間分辨率。
它不會(huì)參與報(bào)警、喚醒或中斷的生成。
在RTC被復(fù)位或1Hz主計(jì)數(shù)器被禁用時(shí),Subsecond Counter會(huì)被禁用。
必須在使能RTC后,手動(dòng)寫入SUBSECOND_CTRL[SUB_SECOND_CNT_EN]=1來(lái)啟用該計(jì)數(shù)器。
啟用后,計(jì)數(shù)器會(huì)等待下一個(gè)1秒周期開(kāi)始,然后以lp_osc時(shí)鐘頻率開(kāi)始計(jì)數(shù),并在每秒開(kāi)始時(shí)回滾為0。
值得注意的是,當(dāng)調(diào)用IRTC_GetDefaultConfig(&irtcConfig);時(shí),默認(rèn)情況下lp_osc的時(shí)鐘頻率為16KHz,這意味著Subsecond Counter每秒可以提供最多16834個(gè)計(jì)數(shù)單位的時(shí)間分辨率。
二、使能關(guān)鍵步驟
2.1使能RTC時(shí)鐘輸出:
irtcConfig.disableClockOutput=false;
這一步確保RTC模塊可以輸出1Hz時(shí)鐘信號(hào)。
2.2配置RTC時(shí)鐘輸出頻率
RTC->CTRL &= (uint16_t)(~RTC_CTRL_CLKOUT_MASK); RTC->CTRL |= RTC_CTRL_CLKOUT((uint16_t)kIRTC_ClkoutCoarse1Hz);
選擇粗略的1Hz時(shí)鐘作為RTC的輸出源。
2.3使能Subsecond Counter
IRTC_EnableSubsecondCounter(RTC, true);
手動(dòng)啟用Subsecond Counter功能。
三、完整代碼示例
以下是一個(gè)完整的代碼示例,展示如何初始化IRTC并讀取Subsecond Counter的值:
intmain(void)
{
irtc_config_tirtcConfig;
//初始化板級(jí)硬件
BOARD_InitHardware();
//獲取默認(rèn)配置(lp_osc 默認(rèn)頻率為16KHz)
IRTC_GetDefaultConfig(&irtcConfig);
//使能RTC時(shí)鐘輸出
irtcConfig.disableClockOutput =false;
if(IRTC_Init(RTC, &irtcConfig) == kStatus_Fail)
{
return1;
}
PRINTF("RTC Example START:
");
//配置 1Hz時(shí)鐘輸出
IRTC_ConfigClockOut(RTC, kIRTC_ClkoutCoarse1Hz);
//啟用 Subsecond Counter
IRTC_EnableSubsecondCounter(RTC,true);
//等待計(jì)數(shù)器啟動(dòng)
SDK_DelayAtLeastUs(1000000,CLOCK_GetFreq(kCLOCK_CoreSysClk));
while(1)
{
//讀取計(jì)數(shù)器值
uint32_tsubSecond_cnt =IRTC_GetSubsecondCount(RTC);
PRINTF("subSecond Counter is %u.
", subSecond_cnt);
//延時(shí)
SDK_DelayAtLeastUs(100000,150000000);
100ms
}
}
四、測(cè)試結(jié)果
在實(shí)際運(yùn)行中,每秒內(nèi)subSecond_cnt的值從0開(kāi)始遞增,最大值接近16000,與lp_osc的默認(rèn)頻率一致。每過(guò)一秒,計(jì)數(shù)器會(huì)自動(dòng)回滾為0,重新開(kāi)始計(jì)數(shù)。以下是部分輸出示例:

這驗(yàn)證了Subsecond Counter的工作機(jī)制和精度,適用于需要亞秒級(jí)時(shí)間戳的應(yīng)用場(chǎng)景。
五、結(jié) 語(yǔ)
通過(guò)合理配置RTC時(shí)鐘輸出,并手動(dòng)啟用Subsecond Counter,MCXN947的IRTC模塊即可提供穩(wěn)定可靠的亞秒級(jí)時(shí)間精度。這一能力在低功耗喚醒、精確時(shí)間戳記錄以及高精度事件控制等場(chǎng)景中具有非常實(shí)際的應(yīng)用價(jià)值。
本文結(jié)合官方資料與實(shí)測(cè)驗(yàn)證,總結(jié)了一套清晰可復(fù)用的配置方法及代碼思路,希望能夠幫助開(kāi)發(fā)者在項(xiàng)目中高效實(shí)現(xiàn)高精度時(shí)間管理。如在實(shí)際應(yīng)用中有更多拓展或優(yōu)化空間,也歡迎進(jìn)一步交流與探討。
TIC: Harry Zhang
-
模塊
+關(guān)注
關(guān)注
7文章
2862瀏覽量
53641 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3846瀏覽量
134233 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2325瀏覽量
98809
原文標(biāo)題:不止1秒!教你開(kāi)啟MCXN947 RTC亞秒計(jì)數(shù),實(shí)現(xiàn)高精度時(shí)間管理
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何在MCXN947板的FlexSPI接口接HyperRAM
如何在MCXN947微控制器上配置安全啟動(dòng)和生命周期
MCXN947使用ADC并編寫代碼,總是報(bào)警告是怎么回事?
MCXN947如何配置和外擴(kuò)PSRAM?
MCXN947怎么驅(qū)動(dòng)FRDM-STBI-A8974三軸陀螺儀?
MCXN547如何開(kāi)啟iRTC subSecond功能?
MCXN947 EVK 無(wú)法初始化 PHY是怎么回事?如何處理?
如何使用MCXN947板上的攝像頭同時(shí)實(shí)現(xiàn)以太網(wǎng)連接傳輸和圖像采集
MCXN947如何使用 1MB 交換的多核應(yīng)用程序
具有帶32位亞秒喚醒計(jì)數(shù)器的RTC的超低MCU有哪些
恩智浦MCX系列MCU的新品MCXN947
《恩智浦FRDM-MCXN947開(kāi)發(fā)實(shí)踐指南》上線啦
使用VSCode調(diào)試FRDM MCXN947開(kāi)發(fā)板
MCXN947系列高性能微控制器產(chǎn)品介紹
如何正確啟用恩智浦MCXN947芯片中RTC模塊的亞秒計(jì)數(shù)器功能
評(píng)論