WXK
2025-02-11 e328ebef585cea2351b37117b2d5ac4978ecd3c0
keil/include/drivers/mk_rtc.c
@@ -141,8 +141,7 @@
        if (rtc_handle[id].alarm_callback != NULL)
        {
            uint32_t value = rtc_handle[id].base->DATA;
            rtc_handle[id].alarm_callback(&value, 0);
            rtc_handle[id].alarm_callback(&id, rtc_handle[id].base->DATA);
        }
    }
}
@@ -187,7 +186,7 @@
    }
    if (time->year < 1970 || time->month < 1 || time->month > 12 || time->day < 1 || time->day > rtc_month_days(time->month, time->year) || time->hour >= 24 ||
            time->minute >= 60 || time->second >= 60)
        time->minute >= 60 || time->second >= 60)
    {
        return DRV_ERROR;
    }
@@ -392,7 +391,7 @@
        {
            uint32_t value = rtc_handle[id].base->DATA;
            rtc_second_to_time(value, &time);
            rtc_handle[id].tick_callback(&time, 0);
            rtc_handle[id].tick_callback(&id, (uint32_t)&time);
        }
    }
}
@@ -410,31 +409,34 @@
        {
            uint32_t value = rtc_handle[id].base->DATA;
            rtc_second_to_time(value, &time);
            rtc_handle[id].alarm_callback(&time, 0);
            rtc_handle[id].alarm_callback(&id, (uint32_t)(&time));
        }
    }
}
#endif
void rco32k_clk_calibrate(enum RCO32_MEAS_TIME_T time)
void clk32k_ppm_calibrate(enum CLK32K_MEAS_TIME_T time)
{
    enum RTC_DEV_T id = RTC_ID0;
    if (rtc_handle[id].rtc_open_flag == 0)
    {
        // enable RTC clock
        clock_enable(CLOCK_RTC);
        if (sleep_timer_handle.enable == 0)
        {
            // enable RTC clock
            clock_enable(CLOCK_RTC);
        }
        rtc_handle[id].base->CTRL = RTC_CTRL_START_MSK;
    }
    NVIC_SetPriority(RCO32K_CAL_IRQn, IRQ_PRIORITY_NORMAL);
    NVIC_ClearPendingIRQ(RCO32K_CAL_IRQn);
    NVIC_EnableIRQ(RCO32K_CAL_IRQn);
    NVIC_SetPriority(CLK32K_CAL_IRQn, IRQ_PRIORITY_NORMAL);
    NVIC_ClearPendingIRQ(CLK32K_CAL_IRQn);
    NVIC_EnableIRQ(CLK32K_CAL_IRQn);
    rtc_handle[id].base->MEASURE = 0;
    rtc_handle[id].base->MEASURE = RTC_MEASURE_TIME(time) | RTC_MEASURE_EN_MSK;
}
void RCO32K_CAL_IRQHandler(void)
void CLK32K_CAL_IRQHandler(void)
{
    enum RTC_DEV_T id = RTC_ID0;
    if ((rtc_handle[id].base->MEASURE & RTC_MEASURE_DONE_MSK) == 0)
@@ -443,16 +445,19 @@
        uint32_t measure_cnt = rtc_handle[id].base->MEASURE & RTC_MEASURE_CNT_MSK;
        uint32_t pclk = clock_get_frequency(CLOCK_APB_CLK);
        uint32_t ppm_target_cnt = measure_cycles * pclk / 32768;
        uint32_t ppm_target_cnt = (uint32_t)((float)measure_cycles * ((float)pclk / 32768.0f));
        int32_t ppm = (int32_t)((int32_t)(ppm_target_cnt - measure_cnt) * 1000000 / (int32_t)ppm_target_cnt);
        sleep_timer_ppm_set(ppm);
        LOG_INFO(TRACE_MODULE_DRIVER, "RCO32K ppm %d\r\n", ppm);
        LOG_INFO(TRACE_MODULE_DRIVER, "CLK32K ppm %d\r\n", ppm);
        if (rtc_handle[id].rtc_open_flag == 0)
        {
            rtc_handle[id].base->CTRL = 0;
            // disable RTC clock
            clock_disable(CLOCK_RTC);
            if (sleep_timer_handle.enable == 0)
            {
                // disable RTC clock
                clock_disable(CLOCK_RTC);
            }
        }
        else
        {