CMT2380F32模块开发11-RTC例程
Posted andylauren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMT2380F32模块开发11-RTC例程相关的知识,希望对你有一定的参考价值。
实时时钟/日历提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过 AM/PM 寄存器位,决定采用 24 或 12 小时格式。
实时时钟的时钟源可配置为外部低速晶振,外部高速晶振,内部低速 RC;默认使用外部低速晶振。
具有闹钟功能,具有高精度 1Hz 方波信号输出,具有周期中断,具有闹钟中断。
所有软件写入和读取的日期时间值都为 BCD 码,无须十六进制转换为十进制。任何无效的日期时间将无法写入,比如 32 日,25 时,70 秒,B 月等。
RTC 在上电之后复位一次,在系统不掉电的情况下,外部各种复位请求都不能复位 RTC,RTC 会一直处于计数状态。在上电之后,设定日历初始值、闹钟设置、误差补偿、中断等之后,启动 RTC。
注意,开发板没有外部晶振,所以这里的例程都会使用内部低速晶振,这样可以保证低功耗仍然运行。
rtc_int例程
本样例主要低功耗时钟模块周期中断实例。
Clk_SetRCLFreq(ClkFreq32768);
Clk_Enable(ClkRCL, TRUE); //开启内部晶振32
Clk_SetPeripheralGate(ClkPeripheralRtc, TRUE); //使能rtc时钟
stcRtcConfig.enClkSel = RtcClk32; // RtcClkHxt1024;//RtcClk32;//
stcRtcConfig.enAmpmSel = Rtc24h; // Rtc12h;//
stcCycSel.enCyc_sel = RtcPrads;
stcCycSel.enPrds_sel = Rtc_1S;
stcRtcConfig.pstcCycSel = &stcCycSel;
#if 1
Rtc_DisableFunc(RtcCount);
stcAlarm.u8Minute = 0x59;
stcAlarm.u8Hour = 0x12;
stcAlarm.u8Week = 0x08;
Rtc_DisableFunc(RtcAlarmEn);
Rtc_EnAlarmIrq(Rtc_AlarmInt_Enable);
Rtc_SetAlarmTime(&stcAlarm);
Rtc_EnableFunc(RtcAlarmEn);
#endif
stcTime.u8Year = 0x17;
stcTime.u8Month = 0x06;
stcTime.u8Day = 0x07;
stcTime.u8Hour = 0x12;
stcTime.u8Minute = 0x58;
stcTime.u8Second = 0x55;
stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
stcRtcConfig.pstcTimeDate = &stcTime;
stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
stcIrqCb.pfnTimerIrqCb = RtcCycCb;
stcRtcConfig.pstcIrqCb = &stcIrqCb;
stcRtcConfig.bTouchNvic = TRUE;
Rtc_DisableFunc(RtcCount);
Rtc_Init(&stcRtcConfig);
Rtc_EnableFunc(RtcCount);
while (1 == Gpio_GetIO(0, 2))
; //注意:此处用户不能屏蔽,否则进入深度休眠模式导致SWD连接不上。
Gpio_SetIO(2, 3, 0);
Lpm_Config(&stcLpmCfg);
Lpm_GotoLpmMode();
Gpio_SetIO(2, 3, 1);
配置1s周期中断,按下按键1,进入低功耗,启动计数,观察LED1是否1s高低电平变化。
rtc_cnt例程
本样例主要涉及RTC模块计数寄存器的写入和读取。
Clk_SetRCLFreq(ClkFreq32768);
Clk_Enable(ClkRCL, TRUE); //开启内部晶振32
Clk_SetPeripheralGate(ClkPeripheralRtc, TRUE); //使能rtc时钟
stcRtcConfig.enClkSel = RtcClk32; // RtcClkHxt1024;//RtcClk32;//
stcRtcConfig.enAmpmSel = Rtc24h; // Rtc12h;//
stcTime.u8Year = 0x17;
stcTime.u8Month = 0x06;
stcTime.u8Day = 0x07;
stcTime.u8Hour = 0x12;
stcTime.u8Minute = 0x59;
stcTime.u8Second = 0x59;
stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
stcRtcConfig.pstcTimeDate = &stcTime;
stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
stcIrqCb.pfnTimerIrqCb = RtcCycCb;
stcRtcConfig.pstcIrqCb = &stcIrqCb;
stcRtcConfig.bTouchNvic = TRUE;
Rtc_DisableFunc(RtcCount);
Rtc_Init(&stcRtcConfig);
Rtc_EnableFunc(RtcCount);
while (1)
Rtc_ReadDateTime(&stcReadTime);
运行几秒暂停一下,查看变量stcReadTime。
rtc_cali例程
这个例程是时钟补偿的方法,因为我没有去具体校准,而且每个板子校准的值都是不一样的。这个例程需要的时候自行阅读吧。
以上是关于CMT2380F32模块开发11-RTC例程的主要内容,如果未能解决你的问题,请参考以下文章