/*! * \file xc_drv_rtc.c * * \brief Target xc aotimer driver implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * * _ __ _ ________ _ * | |/ /(_)___ / ____/ /_ (_)___ * | // / __ \/ / / __ \/ / __ \ * / |/ / / / / /___/ / / / / /_/ / * /_/|_/_/_/ /_/\____/_/ /_/_/ .___/ * /_/ * (C) 2022-2025 XinChip * * \endcode * * \author ( XinChip ) Alex-J * * \author ( XinChip ) */ /*----------------------------------------------------------------------------------- INCLUDE HEADE FILES ------------------------------------------------------------------------------------*/ #include "xc6xxx.h" #if XC_CHECK(XC_RTC_ENABLED) /*------------------------------------------------------------------------------------ Local Variables -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Global Variables -------------------------------------------------------------------------------------*/ RTC_Intr_Cb_t RTC_Intr_cb = { NULL, T1_CMR_Callback, T2_CMR_Callback, T3_CMR_Callback, Sec_Callback, Min_Callback, Hour_Callback, Day_Callback}; /*------------------------------------------------------------------------------------ Func Prototype -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Functions -------------------------------------------------------------------------------------*/ void xc_rtc_start(void) { rtc_icr__rtc__cnt_e__setf(RTC_ICR_CNTE_ENABLE); } void xc_rtc_stop(void) { rtc_icr__rtc__cnt_e__setf(RTC_ICR_CNTE_DISABLE); } static void xc_rtc_matchtime_set(RTC_InitCfg_t *rtc_cfg) { if (rtc_cfg->MatchTime.ch == RTC_MATCH_T1) { rtc_cmr_one_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour, rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec); } else if (rtc_cfg->MatchTime.ch == RTC_MATCH_T2) { rtc_cmr_two_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour, rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec); } else if (rtc_cfg->MatchTime.ch == RTC_MATCH_T3) { rtc_cmr_three_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour, rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec); } } void xc_rtc_date_get(Rtc_DateTypeDef_t *Date) { __rtc_dateget(Date); } void xc_rtc_init(RTC_InitCfg_t *rtc_cfg) { uint8_t dateset_num = 0; cpr_ctlapbclken_grctl__rtc_pclk_en__setf(ENABLE); cprao_aon_clken_grctl__rtc_clk_en__setf(ENABLE); rtc_icr_set(DISABLE); rtc_dateSet(rtc_cfg); /* Solve the issue where there is a probability that RTC time setting fails during the first power-on. */ while (rtc_clr_get() != rtc_ccvr_get()) { delay_us(50); dateset_num++; rtc_dateSet(rtc_cfg); if (dateset_num >= 5) { printf("Err:rtc date set fail!\n"); break; } } rtc_raw_limit__setf(xc_clock_lfclk_in_get()); rtc_datelimitSet(rtc_cfg); if (rtc_cfg->MatchTimeEnable) { xc_rtc_matchtime_set(rtc_cfg); rtc_config_matchtimeit(rtc_cfg); } if (rtc_cfg->SecIT_Enable) { rtc_config_secit(rtc_cfg); } if (rtc_cfg->MinIT_Enable) { rtc_config_minit(rtc_cfg); } if (rtc_cfg->HourIT_Enable) { rtc_config_hourit(rtc_cfg); } if (rtc_cfg->DayIT_Enable) { rtc_config_dayit(rtc_cfg); } } __RAM_CODE void RTC_Handler(void) { uint32_t val; #if defined(NOT_RUN_XIP_TX_ONLY) tx_on_delay(); #endif // defined(NOT_RUN_XIP_TX_ONLY) val = rtc_all_intr_ao_get(); if (val & RTC_AO_ALL_INTR_AO_TIMER_INTR_Msk) { rtc_ao_timer_ctl__rtc_ao_timer_clr__setf(RTC_AO_TIMER_CTL_AO_TIMER_CLR_SET); rtc_ao_timer_ctl__rtc_ao_timer_en__setf(RTC_AO_TIMER_CTL_AO_TIMER_EN_DISABLE); xc_rc32k_soft_calib_set(); } val = rtc_isr_eoi_get(); #if XC_RTC_DATE_INT_ENABLED if (val) { rtc_isr_eoi_set(val); if ((val & RTC_ICR_T1E_Msk) == RTC_ICR_T1E_Msk){ RTC_Intr_cb.T1_CMR_Callback(); } if ((val & RTC_ICR_T2E_Msk) == RTC_ICR_T2E_Msk){ RTC_Intr_cb.T2_CMR_Callback(); } if ((val & RTC_ICR_T3E_Msk) == RTC_ICR_T3E_Msk){ RTC_Intr_cb.T3_CMR_Callback(); } if ((val & RTC_ICR_DaE_Msk) == RTC_ICR_DaE_Msk){ RTC_Intr_cb.Day_Callback(); } if ((val & RTC_ICR_HoE_Msk) == RTC_ICR_HoE_Msk){ RTC_Intr_cb.Hour_Callback(); } if ((val & RTC_ICR_MiE_Msk) == RTC_ICR_MiE_Msk){ RTC_Intr_cb.Min_Callback(); } if ((val & RTC_ICR_SeE_Msk) == RTC_ICR_SeE_Msk){ RTC_Intr_cb.Sec_Callback(); } } #endif } __WEAK uint8_t T1_CMR_Callback(void) { return 0; } __WEAK uint8_t T2_CMR_Callback(void) { return 0; } __WEAK uint8_t T3_CMR_Callback(void) { return 0; } __WEAK uint8_t Sec_Callback(void) { return 0; } __WEAK uint8_t Min_Callback(void) { return 0; } __WEAK uint8_t Hour_Callback(void) { return 0; } __WEAK uint8_t Day_Callback(void) { return 0; } #endif // XC_CHECK(XC_RTC_ENABLED)