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时间。
浙公网安备 33010602011771号