一.RTC可以选择使用外部32768HZ晶振或芯片内部32768HZ(区别是精度不同)外部: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时间初始化

注:在蓝牙程序中,除初始化外,在程序运行中不可再调用此函数,否则会影响tmos和蓝牙的运行,可以将设置的时间值与当前时间作差,获取时间时加上这个差值。

    RTC_InitTime(2023,9,20,12,00,00);       //初始化RTC时间

三.RTC有两种模式进入中断(定时模式和触发模式)定时模式有八档可选,若挡位不符合应用,可用触发模式,时间可自由配置,32768为1s。

    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);
    }
}

 

注意点:

1.若使用的是ch579,可以在main的最开始下方函数就可以了,

RTC_ModeFunDisable(RTC_TRIG_MODE);

原因:ch579的TRIG中断默认使能了,但是用户自己并没有开启,所以中断中没有清除此中断,中断会频繁进入,导致程序无法正常运行。

2.若使用内部RC,需要校准,否则误差很大,蓝牙程序中使用内部RC会两分钟校准一次。

        Lib_Calibration_LSI(); // 校准内部RC

 

posted on 2023-09-20 14:24  WCH蓝牙应用分享  阅读(1066)  评论(0编辑  收藏  举报