From 4ac8869c86534136e97ed4bf738a83e65cdefafa Mon Sep 17 00:00:00 2001
From: zhangbo <zhangbo@qq.com>
Date: 星期五, 14 三月 2025 10:31:03 +0800
Subject: [PATCH] 添加了新的协议内容,还添加了保留位

---
 keil/include/drivers/mk_misc.c |   54 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/keil/include/drivers/mk_misc.c b/keil/include/drivers/mk_misc.c
index 5fbbdb2..7ec7dd5 100644
--- a/keil/include/drivers/mk_misc.c
+++ b/keil/include/drivers/mk_misc.c
@@ -130,16 +130,11 @@
 
 /* SYS Timer */
 
-uint32_t sys_timer_freq = 0;
-
 void sys_timer_open(void)
 {
-    // DIV = 1    (max: ~68.8s,     resolution: ~16ns)
-    // DIV = 16   (max: ~1101.2s,   resolution: ~256ns)
-    // DIV = 256  (max: ~17620.3s   resolution: ~65us)
     struct DUAL_TIMER_CFG_T sys_timer_cfg = {
         .type = DUAL_TIMER_TYPE_FREERUNNING,
-        .prescale = DUAL_TIMER_PRESCALE_DIV1,
+        .prescale = SYS_TIMER_DIV == 1 ? DUAL_TIMER_PRESCALE_DIV1 : (SYS_TIMER_DIV == 16 ? DUAL_TIMER_PRESCALE_DIV16 : DUAL_TIMER_PRESCALE_DIV256),
         .width = DUAL_TIMER_SIZE_32BIT,
         .int_en = false,
         .load = 0xffffffff,
@@ -148,8 +143,6 @@
 
     dual_timer_open(DUAL_TIMER_ID0, &sys_timer_cfg);
     dual_timer_start(DUAL_TIMER_ID0, sys_timer_cfg.load);
-    uint16_t div = sys_timer_cfg.prescale == DUAL_TIMER_PRESCALE_DIV1 ? 1 : sys_timer_cfg.prescale == DUAL_TIMER_PRESCALE_DIV16 ? 16 : 256;
-    sys_timer_freq = clock_get_frequency(CLOCK_APB_CLK) / div;
 }
 
 void sys_timer_close(void)
@@ -157,10 +150,16 @@
     dual_timer_close(DUAL_TIMER_ID0);
 }
 
+#if defined(__ICCARM__)
+#pragma default_function_attributes = __ramfunc
+#endif
 uint32_t sys_timer_get(void)
 {
     return -dual_timer_get(DUAL_TIMER_ID0);
 }
+#if defined(__ICCARM__)
+#pragma default_function_attributes =
+#endif
 
 // max: 68829 us  (DIV = 1)
 void sys_timer_delay_us(uint32_t time_us)
@@ -232,6 +231,8 @@
     NVIC_SetPriority(SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);    /* set Priority for Systick Interrupt */
     SysTick->VAL = 0;                                                   /* A write of any value clears the field to 0 */
     SysTick->CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
+    // Store SysTick counter
+    sys_tick_env.load = ticks;
 }
 
 uint32_t sys_tick_us(void)
@@ -293,7 +294,7 @@
     return sys_tick_env.count;
 }
 
-void sys_tick_callback_set(void (*callback)(void))
+void sys_tick_callback_set(void (*callback)(uint32_t elapsed_ticks))
 {
     sys_tick_env.callback = callback;
 }
@@ -322,6 +323,29 @@
     return elapse_ms;
 }
 
+uint32_t sys_tick_elapse_ticks(void)
+{
+    uint32_t lock = int_lock();
+
+    uint32_t load = SysTick->LOAD + 1;
+    uint32_t val = SysTick->VAL;
+
+    uint32_t flag_pending = REG_READ(0xE000ED04) & (1 << 26);
+    if (flag_pending)
+    {
+        val = 0;
+    }
+    else if (val == 0)
+    {
+        val = load;
+    }
+
+    int_unlock(lock);
+
+    return load - val;
+}
+
+static uint32_t used_cnt;
 void sys_tick_pause(void)
 {
     // Stop SysTick
@@ -343,17 +367,16 @@
         val = load;
     }
 
-    // Store SysTick counter
-    sys_tick_env.load = load;
     // SysTick->VAL cannot be set
     sys_tick_env.elapse += (load - val);
+    used_cnt = load - val;
 }
 
 void sys_tick_resume(void)
 {
     sys_tick_start(sys_tick_env.load);
 
-    uint32_t slp_cnt = high_xtal_off_time();
+    uint32_t slp_cnt = xtal_38m4_off_time();
     uint32_t cnt = slp_cnt / sys_tick_env.load;
     sys_tick_env.elapse += (slp_cnt - cnt * sys_tick_env.load);
     while (sys_tick_env.elapse >= sys_tick_env.load)
@@ -363,9 +386,10 @@
     }
 
     sys_tick_env.count += cnt;
-    if ((sys_tick_env.callback != NULL) && (cnt))
+    slp_cnt += used_cnt;
+    if ((sys_tick_env.callback != NULL) && (slp_cnt))
     {
-        sys_tick_env.callback();
+        sys_tick_env.callback(slp_cnt);
     }
 }
 
@@ -375,7 +399,7 @@
     sys_tick_env.count++;
     if (sys_tick_env.callback != NULL)
     {
-        sys_tick_env.callback();
+        sys_tick_env.callback(sys_tick_env.load);
     }
     // board_led_off(BOARD_LED_2);
 }

--
Gitblit v1.9.3