当前位置:网站首页>CMT2380F32模块开发11-RTC例程

CMT2380F32模块开发11-RTC例程

2022-08-11 05:24:00 andylauren

实时时钟/日历提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过 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例程

这个例程是时钟补偿的方法,因为我没有去具体校准,而且每个板子校准的值都是不一样的。这个例程需要的时候自行阅读吧。

原网站

版权声明
本文为[andylauren]所创,转载请带上原文链接,感谢
https://blog.csdn.net/andylauren/article/details/126261919