From 23480ab197150979f4505501a1abe8a64796fb18 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 04 七月 2025 18:37:07 +0800 Subject: [PATCH] 初步调好发包,解决因为uwb未open导致txlen不断溢出重启问题,两边sts配置初步调好 --- keil/include/drivers/mk_rtc.c | 80 ++++++++++++++++++++++++++++++--------- 1 files changed, 61 insertions(+), 19 deletions(-) diff --git a/keil/include/drivers/mk_rtc.c b/keil/include/drivers/mk_rtc.c index c34929f..ed11eb0 100644 --- a/keil/include/drivers/mk_rtc.c +++ b/keil/include/drivers/mk_rtc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and + * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. @@ -55,7 +55,24 @@ }, }; -int rtc_open(enum RTC_DEV_T id) +uint32_t rtc_ms(void) +{ + uint32_t now = rtc_get(RTC_ID0); + + // split 15U to 5U+10U, for ~1ms resolution, and overflows when ticks > ~2^27(~4000s) + return ((now >> 5U) * 1000) >> 10U; +} + +uint32_t rtc_us(void) +{ + uint32_t now = rtc_get(RTC_ID0); + + // x * 10^6 / 32768 ~= x * 30.518 ~= x * 61 / 2 + // resolution 61us(~2 ticks), overflows every 4300s + return (now >> 1U) * 61U; +} + +int rtc_open(enum RTC_DEV_T id, uint8_t rst_en) { if (id >= RTC_MAX_NUM) { @@ -68,6 +85,12 @@ // enable RTC clock clock_enable(CLOCK_RTC); + + if (rst_en) + { + reset_module(RESET_MODULE_RTC); + } + rtc_handle[id].rtc_open_flag = 1; if ((rtc_handle[id].base->CTRL & RTC_CTRL_START_MSK) == 0) @@ -102,6 +125,14 @@ uint32_t rtc_get(enum RTC_DEV_T id) { return rtc_handle[id].base->DATA; +} + +int rtc_set_alarm_lite(enum RTC_DEV_T id, uint32_t target) +{ + rtc_handle[id].base->MATCH = target; + rtc_handle[id].base->INTR_CLR = RTC_INTR_CLR_MSK; + + return DRV_OK; } int rtc_set_alarm(enum RTC_DEV_T id, uint32_t target, drv_callback_t callback) @@ -141,8 +172,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->MATCH); } } } @@ -273,7 +303,7 @@ time->second = (uint8_t)(second - time->minute * 60); } -int rtc_open(enum RTC_DEV_T id, drv_callback_t callback) +int rtc_open(enum RTC_DEV_T id, uint8_t rst_en, drv_callback_t callback) { if (id >= RTC_MAX_NUM) { @@ -282,6 +312,12 @@ // enable RTC clock clock_enable(CLOCK_RTC); + + if (rst_en) + { + reset_module(RESET_MODULE_RTC); + } + rtc_handle[id].rtc_open_flag = 1; if (rtc_handle[id].tick_int_en) @@ -392,7 +428,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 +446,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 +482,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; - int32_t ppm = (int32_t)((int32_t)(ppm_target_cnt - measure_cnt) * 1000000 / (int32_t)ppm_target_cnt); + uint32_t ppm_target_cnt = (uint32_t)((float)measure_cycles * ((float)pclk / 32768.0f)); + int32_t ppm = (int32_t)((int32_t)(measure_cnt - ppm_target_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 { -- Gitblit v1.9.3