// 初始化SysTick
void delay_init(uint32_t sysclk) {
// 配置SysTick为1us计数一次
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 先关闭
SysTick->LOAD = sysclk / 1000000 - 1; // 重装载值
SysTick->VAL = 0; // 清空当前值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | // 使用处理器时钟
SysTick_CTRL_ENABLE_Msk; // 使能
}
// 微秒延时
void delay_us(uint32_t us) {
uint32_t ticks = us * (SystemCoreClock / 1000000);
uint32_t start = SysTick->VAL;
if(start < ticks) {
ticks -= start;
while(SysTick->VAL >= start); // 等待溢出
while(SysTick->VAL < (SysTick->LOAD - ticks));
} else {
while(SysTick->VAL - start > ticks);
}
}
// 毫秒延时
void delay_ms(uint32_t ms) {
while(ms--) {
delay_us(1000);
}
}
|