#include "clock.h" #include "gd32f3x0.h" extern uint32_t SystemCoreClock; static u8 delay_ticks_enable = 0; void delay_us(uint32_t us){ if (delay_ticks_enable) { task_udelay(us); return; } uint32_t insr_num = (SystemCoreClock /1000000) * us * 4;// 1000000; while(insr_num-->0); //have 4 instr } void task_ticks_enable(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; delay_ticks_enable = 1; } u32 task_ticks_abs(void) { return DWT->CYCCNT; } u32 task_ticks_rel(u32 start) { u32 ticks = DWT->CYCCNT; if (ticks >= start) { return ticks - start; } return 0xFFFFFFFF - start + ticks + 1; } void task_ticks_delay(u32 ticks) { u32 start; start = task_ticks_abs(); while (task_ticks_rel(start) < ticks); } void task_udelay(u32 delay) { task_ticks_delay(delay * (SystemCoreClock / 1000000)); } uint32_t get_sys_clock(void){ return SystemCoreClock; } uint32_t get_ahb_clock(void){ return rcu_clock_freq_get(CK_AHB); } uint32_t get_apb1_clock(void){ return rcu_clock_freq_get(CK_APB1); } uint32_t get_apb2_clock(void){ return rcu_clock_freq_get(CK_APB2); } uint32_t get_adc_clock(void){ return rcu_clock_freq_get(CK_ADC); } uint32_t get_apb1_timer_clock(void){ uint32_t apb1psc = 0U; apb1psc = RCU_CFG0; uint32_t div = GET_BITS(apb1psc, 8, 10); if (div == 0){ //DIV1 return get_apb1_clock(); } return get_apb1_clock() * 2; } uint32_t get_apb2_timer_clock(void){ uint32_t apb2psc = 0U; apb2psc = RCU_CFG0; uint32_t div = GET_BITS(apb2psc, 11, 13); if (div == 0){ //DIV1 return get_apb2_clock(); } return get_apb2_clock() * 2; }