#include"systemtick.h"
#include"gd32f30x.h"
#define systiclk_real ((~systick->val)&0xFFFFFF|(gsystick0vfcnt<<24))
static volatile system_tick_type gsystick0vfcnt=0;
static int gsystickperus;
void systick_handler(){++gsystick0vfcnt;}
system_tick_type getsystemrealtick(){
return systiclk_real;
}
void delay_us(unsigned int us){
unsigned long long dest =systiclk_real+us*15;
while(systiclk_real<dest);
}
void systemtickinit(){
SysTick_Config(0x1000000);
systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
gsystickperus=rcu_clock_freq_get(CK_AHB);
}
#ifndef system_tick_h
#define system_tick_h
typedef unsigned long long system_tick_type;
extern void delay_us(unsigned int us);
extern void systemtickinit();
extern system_tick_type getsystemrealtick();
#endif
时钟树
预分频器可以配置
AHB
、
APB2
和
APB1
域的时钟频率。
AHB
、
APB2
、
APB1
域的最高时钟频率
分别为
120MHz
、
120MHz
、
60MHz
。
RCU
通过
AHB
时钟
(HCLK)8
分频后作为
Cortex
系统定时
器
(SysTick)
的外部时钟。通过对
SysTick
控制和状态寄存器的设置,可选择上述时钟或
AHB(HCLK)
时钟作为
SysTick
时钟