CH58X/CH59X RTC使用

实时时钟(RTC)是一个独立的定时器,包含一组连续计数的计数器。在相应软件配置下,可提供简单日历功能。修改计数器的值可以重新设置当前的时间和日期。
  RTC 寄存器与 PMU 一样常供电,在系统复位或从低功耗模式唤醒后,RTC 的设置和时间维持不变。
  可配置 2 种模式:
       定时模式:软件可选择固定周期时间(定时)产生中断通知。
    触发模式:匹配一个软件预设的目标闹钟时间,产生中断通知。
  3 组 16 位计数器,提供了 CK32K 原始周期、2 秒周期、1 天周期的计数。
  RTC时钟可以选择外部32.768K晶振作为时钟来源可以选择内部,区别在于精度的不同。外部:20ppm以内 内部:0.04%-0.5%(400ppm-5000ppm)。
  晶振来源选择:
    LClk32K_Select(Clk32K_LSI);             //启用内部32K 精度0.04%-0.5%(400ppm-5000ppm)
/////////////////////////////////////////////////////////////////////////////////////////
LClk32K_Select(Clk32K_LSE); //启用外部32K 精度20ppm 推荐晶体参数32768hz 12.5pf 20ppm R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1; R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2; R8_CK32K_CONFIG |= RB_CLK_XT32K_PON; //给外部32K上电 R8_SAFE_ACCESS_SIG = 0;

具体使用:

RTC_InitTime(2025,5,5,5,00,00);       //初始化RTC时间
//中断配置 
RTC_TMRFunCfg(Period_1_S); //定时模式 共八档可配置 RTC_TRIGFunCfg(32768*1); //触发方式 32768为1s

 

    PFIC_EnableIRQ(RTC_IRQn);               //中断服务使能
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_LongDelay ); //RTC使能唤醒功能(睡眠模式下使用)
     __attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
  UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;
  RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
    if (RTC_GetITFlag(RTC_TRIG_EVENT)) {
        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_TRIGFunCfg(32768*1);
        RTC_ClearITFlag(RTC_TRIG_EVENT);
    }

    if (RTC_GetITFlag(RTC_TMR_EVENT)) {
        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
}

注意:使用ble是尽量不要在运行过程中重新初始化RTC时间。

posted @ 2025-06-29 21:54  小舟从此逝_1  阅读(104)  评论(0)    收藏  举报