0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MM32L0130 RTC日歷和鬧鐘

靈動MM32MCU ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2022-10-28 10:37 ? 次閱讀

1MM32L0130 RTC簡介

RTC 模塊是用于提供時間(時、分、秒、亞秒)和日期(年、月、日)功能的定時計數(shù)器,日歷以 BCD碼的格式顯示。內(nèi)部包含周期性的喚醒單元,用于喚醒低功耗模式。支持夏令時補償,支持?jǐn)?shù)字校準(zhǔn)補償晶振精度的偏差。靈動微電子推出的MM32L0130系列MCU片上RTC外設(shè)具有以下特征:

編程的日歷功能,包括時、分、秒、小時(12/24 小時制)、日期、星期、月份、年份

軟件可編程的夏令時補償

可編程鬧鐘,任意日歷字段的組合觸發(fā)鬧鐘

周期性自動喚醒單元,喚醒時間可配置

數(shù)字校準(zhǔn),精度為 0.95ppm

通過移位功能調(diào)整亞秒時間

支持可配置的時間戳功能,用于記錄事件的入侵時間

支持可配置的入侵檢測

5 個 32 位寬的備份數(shù)據(jù)寄存器,當(dāng)發(fā)生入侵事件時會復(fù)位備份數(shù)據(jù)寄存器

可屏蔽中斷源

?鬧鐘

?喚醒單元

?時間戳事件

?入侵事件

2RTC功能描述

2.1 RTC模塊系統(tǒng)框圖

f2cb075c-55ee-11ed-a3b6-dac502259ad0.png

RTC中斷請求:

f30dbf16-55ee-11ed-a3b6-dac502259ad0.png

注:

當(dāng)使用了 PC13 的時間戳或入侵的功能時,如果需要使用 PC13 用做復(fù)用功能或者輸出時,需要關(guān)閉時間戳或入侵對應(yīng)的寄存器的使能位釋放 PC13。

RTC_ALARM 為鬧鐘或喚醒標(biāo)志輸出, RTC_CALB 代表校準(zhǔn)時鐘輸出,最終會輸出到 PAD,具體的復(fù)用關(guān)系參考芯片數(shù)據(jù)手冊與 RTC_OR 輸出控制寄存器。

TAMP_IN 代表外部入侵管腳, TIM_TS 代表時間戳管腳,具體的對應(yīng)關(guān)系參考芯片數(shù)據(jù)手冊部分。

2.2 時鐘和預(yù)分頻

RTC 時鐘包含3個獨立可配置的時鐘源:分別是 LSE、 LSI、 HSE 時鐘的 128 分頻。RTC 內(nèi)部包含2個預(yù)分頻器用于提供日歷或其它功能的時鐘,分別是一個 7 位的異步預(yù)分頻器與15位的同步預(yù)分頻器,為了降低功耗,建議將異步預(yù)分頻的值設(shè)置到可能的最大值。

異步分頻器輸出時鐘為fck_apre;同步預(yù)分頻器輸出時鐘為fck_spre。

計算公式如下:

f32fb94a-55ee-11ed-a3b6-dac502259ad0.png

fck_apre時鐘用于為二進(jìn)制格式的 RTC_SSR 亞秒遞減計數(shù)器提供時鐘。當(dāng)該遞減計數(shù)器計數(shù)到 0 時,會使用 PREDIV_S 的內(nèi)容重載 RTC_SSR, fck_spre用于為日歷計數(shù)單元提供時鐘。

注:

針對 32.768KHZ 的 LSE 時鐘,異步分頻部分默認(rèn)設(shè)置為 128,同步分頻部分設(shè)置為 256,產(chǎn)生1HZ(fck_spre)的時鐘用于日歷計數(shù)。

2.3 實時時鐘和日歷

RTC 時間和日期寄存器對應(yīng)如下:

RTC_SSR 對應(yīng)于亞秒

RTC_TR 對應(yīng)于時間

RTC_DR 對應(yīng)于日期

通過 APB 總線訪問日歷時間與日期寄存器時,由 RTC_CR 寄存器中的 BYPSHAD 位決定訪問實時的日歷寄存器還是影子寄存器,默認(rèn)情況下訪問的是影子寄存器。

每隔 2 個 RTC 時鐘周期,會將實時的日歷寄存器復(fù)制到影子寄存器,并將 RTC_ISR 寄存器的 RSF位置 1,在停機(jī)和待機(jī)模式下不會執(zhí)行復(fù)制操作。退出這兩種模式時,影子寄存器會在最長 2 個 RTC 時鐘周期后進(jìn)行更新。影子寄存器可以通過系統(tǒng)復(fù)位復(fù)位。

2.4 可編程鬧鐘

RTC 鬧鐘單元被劃分為多個位 ,并且每個位支持獨立的使能或屏蔽。具體可以通過配置RTC_ALRMAR 寄存器 MSKx 位以及 RTC_ALRMASSR 寄存器的 MASKSSx 位。

配置 RTC_CR 寄存器中的 ALRAE 位使能可編程鬧鐘功能。當(dāng)該位為 1,并且配置的 RTC_ALRMAR寄存器的值同當(dāng)前日歷一致時, RTC_ISR 寄存器中的 ALRAF 位會置 1。同時配置 RTC_CR 寄存器中的ALRAIE 位等于 1 時,會產(chǎn)生鬧鐘中斷輸出。

配置 RTC_CR 寄存器中的位 OSEL[1:0]等于 1, ALRAF 連接到 RTC_ALARM 輸出,配置 RTC_CR寄存器的 POL 位選擇 RTC_ALARM 輸出極性。

MM32L0130的RTC外設(shè)還有周期喚醒單元、日歷讀取、復(fù)位RTC、RTC數(shù)字校準(zhǔn)、RTC移位、時間戳、入侵檢測、RTC低功耗喚醒等功能, 在用戶手冊RTC章節(jié)有進(jìn)行詳細(xì)描述,大家可以參考查閱,此處不再進(jìn)行贅述,實驗涉及到再進(jìn)行說明。

3實驗

3.1 實驗原理

RTC 鬧鐘單元被劃分為多個位,包括日期、星期、小時、分鐘、秒,并且每個位支持獨立的使能或屏蔽。當(dāng)配置的鬧鐘A寄存器的值與當(dāng)前日歷(時間/日期)寄存器的值一致時,鬧鐘發(fā)生,相應(yīng)標(biāo)志置位。如果使能了鬧鐘中斷,則會產(chǎn)生鬧鐘中斷輸出。

配置時間寄存器、日期寄存器的值來初始化日歷,配置鬧鐘A寄存器的值,并使能鬧鐘中斷,每次鬧鐘A寄存器的值與當(dāng)前時間/日期寄存器的值一致時,鬧鐘發(fā)生,產(chǎn)生鬧鐘中斷。讀取日歷,如果查詢到鬧鐘發(fā)生,串口打印鬧鐘發(fā)生次數(shù)與當(dāng)前日歷數(shù)據(jù)。

在日歷的基礎(chǔ)上實現(xiàn)鬧鐘功能,為便于觀察和驗證,實驗中配置鬧鐘發(fā)生的時間盡可能短,匹配到秒而將其余位屏蔽以使鬧鐘發(fā)生。

3.2 程序設(shè)計

3.21 RTCCAL_Initialize() 函數(shù)

函數(shù)實現(xiàn)日歷初始化配置,按如下步驟初始化日歷時間與日期寄存器:

1配置 RTC_ISR 寄存器中的 INIT 位為 1 以進(jìn)入初始化模式

2等待 RTC_ISR 寄存器中的 INITF 位被硬件置 1

3編程 RTC_PRER 寄存器,配置同步與異步預(yù)分頻系數(shù)

4配置影子寄存器(RTC_TR 和 RTC_DR),加載日歷初值,配置 RTC_CR 寄存器中的 FMT 位選擇 12 或 24 小時制

5清除 RTC_ISR 寄存器中的 INIT 位退出初始化模式

注:

約 4 個 RTC 時鐘周期后,影子寄存器配置值加載到內(nèi)部實時計數(shù)器。初始化影子寄存器后,等待 RTC_ISR 寄存器的 RSF 位置 1,才能讀取日歷。

voidRTCCAL_Initialize(void)
{
//Checkiftheclockisconfiguredforthefirsttime
RTCCAL_InitTypeDefinit_struct;
RTCCAL_TimeTypeDefsetTimeStruct;
RTCCAL_DateTypeDefsetDateStruct;
u16temp=0;

RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR,ENABLE);//(1)
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP,ENABLE);//(2)
PWR_BackupAccessCmd(ENABLE);//(3)
RCC_LSEConfig(RCC_LSE_ON);
delay_x_cycle(2000);
//CheckwhetherthespecifiedRCCmarkerissetornot,andwaitforthe
//low-speedcrystaloscillatortobeready
while(1){
if(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=RESET){//(4)
break;
}
temp++;
if(temp>=LSE_READY_TIMEOUT){
while(1){
__NOP();
}
}
delay_x_cycle(10);
}
RCC_APB1PeriphClockCmd(RCC_APB1ENR_RTC,ENABLE);
//SettingRTCClock
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTCCAL_EnterInitMode();//(5)
RTCCAL_WaitForSynchro();

RTCCAL_StructInit(&init_struct);
init_struct.RTCCAL_AsynchPrediv=0x7F;//(6)
init_struct.RTCCAL_SynchPrediv=0xFF;
init_struct.RTCCAL_HourFormat=RTCCAL_HourFormat_24;
RTCCAL_Init(&init_struct);

RTCCAL_TimeStructInit(&setTimeStruct);
setTimeStruct.RTCCAL_H12=RTCCAL_H12_AM;//(7)
setTimeStruct.RTCCAL_Hours=15;
setTimeStruct.RTCCAL_Minutes=34;
setTimeStruct.RTCCAL_Seconds=0;
RTCCAL_SetTime(RTCCAL_Format_BCD,&setTimeStruct);

RTCCAL_DateStructInit(&setDateStruct);
setDateStruct.RTCCAL_Year=0x16;//(8)
setDateStruct.RTCCAL_Month=0x0A;
setDateStruct.RTCCAL_Date=0x1A;
setDateStruct.RTCCAL_WeekDay=0x01;
RTCCAL_SetDate(RTCCAL_Format_BCD,&setDateStruct);

RTCCAL_WaitForSynchro();
RTCCAL_ExitInitMode();//(9)
}

(1)、(2)配置 RTC 需要使能 PWR 和 BKP 的時鐘

(3)RTC 寄存器寫保護(hù),取消備份域的寫保護(hù)

(4)等待 LSE 時鐘穩(wěn)定,選擇 LSE 作為 RTC 時鐘源

(5)確認(rèn) RTC 進(jìn)入初始化模式

(6)配置 RTC 預(yù)分頻寄存器,時鐘頻率為 1HZ

(7)配置 PTC_TR時間寄存器,更新時間

(8)配置 PTC_DR日期寄存器,更新日期

(9)RTC 退出初始化模式

3.22 RTCCAL_AlarmConfig() 函數(shù)

函數(shù)實現(xiàn)鬧鐘初始化配置,按如下步驟編程鬧鐘:

1配置 RTC_CR 中的 ALRAE 位等于 0 禁止鬧鐘 A

2等待 RTC_ISR 寄存器中的 ALRAWF 位等于 1

3設(shè)置鬧鐘寄存器(RTC_ALRMASSR/RTC_ALRMAR)

4配置 RTC_CR 寄存器中的 ALRAE 位等于 1 使能鬧鐘 A

注:

對 RTC_CR 寄存器執(zhí)行的寫操作。約 2 個 RTC 時鐘周期同步后生效。

voidRTCCAL_AlarmConfig(void)
{
RTCCAL_AlarmTypeDefRTCCAL_AlarmStructure;
RTCCAL_NVIC_Config();//(1)
//SetthealarmAMasks
RTCCAL_AlarmStructure.RTCCAL_AlarmMask=(RTCCAL_ALRMAR_MSK4|RTCCAL_ALRMAR_MSK3|RTCCAL_ALRMAR_MSK2);//(2)
RTCCAL_AlarmStructure.RTCCAL_AlarmDateWeekDaySel=RTCCAL_AlarmDateWeekDaySel_Date;
RTCCAL_AlarmStructure.RTCCAL_AlarmDateWeekDay=RTCCAL_Weekday_Monday;
RTCCAL_AlarmStructure.RTCCAL_AlarmTime.RTCCAL_Hours=0;
RTCCAL_AlarmStructure.RTCCAL_AlarmTime.RTCCAL_Minutes=0;
RTCCAL_AlarmStructure.RTCCAL_AlarmTime.RTCCAL_Seconds=9;
if(ERROR==RTCCAL_AlarmCmd(RTCCAL_Alarm_A,DISABLE)){
while(1){};
}
RTCCAL_SetAlarm(RTCCAL_Format_BCD,RTCCAL_Alarm_A,&RTCCAL_AlarmStructure);

RTCCAL_AlarmSubSecondConfig(RTCCAL_Alarm_A,0xFF,RTCCAL_AlarmSubSecondMask_SS14_5);//(3)
//EnablealarmAinterrupt
RTCCAL_ITConfig(RTCCAL_IT_ALRA,ENABLE);//(4)
if(ERROR==RTCCAL_AlarmCmd(RTCCAL_Alarm_A,ENABLE)){
while(1){};
}
}

(1)配置RTC鬧鐘中斷,RTC&BKP全局中斷連接到 EXTI17

(2)配置鬧鐘A寄存器,屏蔽日期/星期、時、分,僅匹配秒

(3)配置鬧鐘A亞秒寄存器

(4)使能鬧鐘A中斷

3.23 RTC_BKP_IRQHandler() 函數(shù)

RTC鬧鐘中斷服務(wù)子程序,記錄鬧鐘中斷次數(shù),置位標(biāo)志位。

voidRTC_BKP_IRQHandler(void)
{
if(RTCCAL_GetITStatus(RTCCAL_IT_ALRA)!=RESET){
RTCCAL_ClearITPendingBit(RTCCAL_IT_ALRA);
Flag_ALARM=1;
if(AlarmCount>500){
RCC_RTCCLKCmd(DISABLE);
AlarmCount=0;
}
else{
AlarmCount++;
}
EXTI_ClearITPendingBit(EXTI_Line17);
}
}

3.24 main() 函數(shù)

函數(shù)實現(xiàn)各模塊初始化,在循環(huán)中獲取當(dāng)前日期、時間,查詢到鬧鐘發(fā)生,打印當(dāng)前日期、時間。

s32main(void)
{
RTCCAL_DateTypeDefRTCCAL_tempDate;
RTCCAL_TimeTypeDefRTCCAL_tempTime;
DELAY_Init();
CONSOLE_Init(115200);
RTCCAL_LSE_DemoInit();
while(1){
if(Flag_ALARM==1){
Flag_ALARM=0;
printf("Alarmclockwastriggered%dtimes!
",AlarmCount);
printf("20");
printf("%02d-",RTCCAL_tempDate.RTCCAL_Year);
printf("%02d-",RTCCAL_tempDate.RTCCAL_Month);
printf("%02d	",RTCCAL_tempDate.RTCCAL_Date);
printf("%02d:",RTCCAL_tempTime.RTCCAL_Hours);
printf("%02d:",RTCCAL_tempTime.RTCCAL_Minutes);
printf("%02d
",RTCCAL_tempTime.RTCCAL_Seconds);
printf("
");
}
}
}

3.3 實驗演示

下載程序運行,觀察串口調(diào)試助手:

f3412a0e-55ee-11ed-a3b6-dac502259ad0.png

串口調(diào)試助手間隔打印數(shù)據(jù),比較前后兩次數(shù)據(jù)的日期和時間,相差1分鐘,在每分鐘的第9秒鬧鐘發(fā)生,和鬧鐘寄存器配置一致,運行情況和預(yù)期設(shè)計相符。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349914
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    522

    瀏覽量

    66227
  • 靈動微電子
    +關(guān)注

    關(guān)注

    7

    文章

    118

    瀏覽量

    19613
  • MM32
    +關(guān)注

    關(guān)注

    1

    文章

    106

    瀏覽量

    735

原文標(biāo)題:靈動微課堂 (第233講) | MM32L0130 RTC 日歷和鬧鐘

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用MM32L0130 IRM實現(xiàn)紅外發(fā)碼

    1、使用MM32L0130 IRM實現(xiàn)紅外發(fā)碼  紅外遙控是一種無線、非接觸控制技術(shù),具有抗干擾能力強(qiáng),信息傳輸可靠,功耗低,成本低,易于實現(xiàn)等顯著優(yōu)點,被諸多電子設(shè)備包括消費電子、家用電器、安防
    發(fā)表于 10-21 14:22

    MM32L0130系列MCU片上RTC外設(shè)具有哪些特征

    夏令時補償,支持?jǐn)?shù)字校準(zhǔn)補償晶振精度的偏差。靈動微電子推出的MM32L0130系列MCU片上RTC外設(shè)具有以下特征:可編程的日歷功能,包括時、分、秒、小時(12/24 小時制)、日期、星期、月份、年份軟件
    發(fā)表于 10-31 15:57

    MM32L0130系列MCU片上RTC模塊具有哪些功能呢

    1 MM32L0130 RTC簡介RTC 模塊是用于提供時間(時、分、秒、亞秒)和日期(年、月、日)功能的定時計數(shù)器,日歷以 BCD碼的格式顯示。內(nèi)部包含周期性的喚醒單元,用于喚醒低功
    發(fā)表于 11-02 14:37

    基于MM32L0130的低功耗電子時鐘設(shè)計方案相關(guān)資料分享

    可以輕松實現(xiàn)一個低功耗電子時鐘設(shè)計。本次微課堂通過講述MM32L0130 PWR電源控制模式,以及SLCD 和RTC外設(shè)配置,實現(xiàn)低功耗應(yīng)用場景?! ?b class='flag-5'>MM32L0130 PWR簡介  電源控制 PWR
    發(fā)表于 11-09 16:00

    請問有人使用IAR進(jìn)行過MM32L0130的開發(fā)嗎?

    我在使用IAR8.30進(jìn)行MM32L0130開發(fā)板試用時遇到了一個棘手的問題,其例程能夠下載到開發(fā)板(至少在IAR中任何報錯,也可以在線調(diào)試),可是就是一直開在時鐘配置階段,一直沒有配置成功,有人遇到過這樣的問題嗎?或者在調(diào)試其他單片機(jī)時是否有類似現(xiàn)象?麻煩指導(dǎo)一下解決辦法
    發(fā)表于 12-18 21:48

    STM32CubeMX | 40 - 實時時鐘RTC的使用(日歷鬧鐘

    STM32CubeMX | 40 - 實時時鐘RTC的使用(日歷鬧鐘
    發(fā)表于 11-23 18:06 ?19次下載
    STM32CubeMX | 40 - 實時時鐘<b class='flag-5'>RTC</b>的使用(<b class='flag-5'>日歷</b>和<b class='flag-5'>鬧鐘</b>)

    靈動微MM32L0130系列32位微控制器的詳細(xì)介紹

    全新MM32L0130系列是靈動微電子針對低功耗應(yīng)用推出的新一代MCU產(chǎn)品,其搭載了Arm?Cortex?-M0+內(nèi)核,采用了先進(jìn)的低功耗架構(gòu)設(shè)計和技術(shù)手段,實現(xiàn)了最低700nA的RTC運行功耗,最低250nA的待機(jī)功耗和低于100nA的最低功耗表現(xiàn)。
    發(fā)表于 04-28 16:18 ?712次閱讀

    使用MM32L0130片上IRM模塊實現(xiàn)紅外發(fā)碼

    靈動股份推出的MM32L0130系列MCU具有片上IRM紅外調(diào)制器,該模塊使用片上的定時器和串口,實現(xiàn)數(shù)據(jù)的 FSK/ASK 調(diào)制,以滿足紅外發(fā)碼的需求。
    的頭像 發(fā)表于 10-13 17:03 ?1191次閱讀

    基于MM32L0130的低功耗電子時鐘設(shè)計

    LCD顯示、RTC日歷鬧鐘,其實SLCD與RTC都支持在特定的低功耗模式下運行,結(jié)合這兩個外設(shè)特性,在前面實驗的基礎(chǔ)上,使用EVB_L01
    的頭像 發(fā)表于 11-04 10:12 ?1561次閱讀

    CubeMX配置RTC實現(xiàn)日歷鬧鐘實驗

    CubeMX配置RTC實現(xiàn)日歷鬧鐘實驗
    的頭像 發(fā)表于 02-15 14:05 ?1768次閱讀
    CubeMX配置<b class='flag-5'>RTC</b>實現(xiàn)<b class='flag-5'>日歷</b>和<b class='flag-5'>鬧鐘</b>實驗

    MM32L0130 產(chǎn)品手冊(中文版)

    MM32L0130 產(chǎn)品手冊(中文版)
    發(fā)表于 02-27 18:24 ?0次下載
    <b class='flag-5'>MM32L0130</b> 產(chǎn)品手冊(中文版)

    MM32L0130 產(chǎn)品手冊(英文版)

    MM32L0130 產(chǎn)品手冊(英文版)
    發(fā)表于 02-27 18:25 ?0次下載
    <b class='flag-5'>MM32L0130</b> 產(chǎn)品手冊(英文版)

    MM32L0130 用戶手冊(中文版)

    MM32L0130 用戶手冊(中文版)
    發(fā)表于 02-27 18:26 ?0次下載
    <b class='flag-5'>MM32L0130</b> 用戶手冊(中文版)

    MM32L0130 用戶手冊(英文版)

    MM32L0130 用戶手冊(英文版)
    發(fā)表于 02-27 18:26 ?0次下載
    <b class='flag-5'>MM32L0130</b> 用戶手冊(英文版)

    使用MM32L0130和HYS1254的電子秤方案驗證

    NPI提了需求,需要驗證使用友商SDADC芯片和MM32L0130微控制器集成的一個系統(tǒng)應(yīng)用方案。
    的頭像 發(fā)表于 10-17 17:16 ?684次閱讀
    使用<b class='flag-5'>MM32L0130</b>和HYS1254的電子秤方案驗證