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