Files
hpw421/component/xc6xx_drivers/Drivers/xc_driver/xc_drv_rtc.c
T
2026-07-03 18:08:25 +08:00

183 lines
5.5 KiB
C

/*!
* \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)