#include "systick.h" // 用于记住每一微妙的时钟计数 volatile static u8 fac_us = 0; // 用于记住每一毫秒妙的时钟计数 volatile static u16 fac_ms = 0; // 初始化 systick void systick_init(void) { // 初始化 SysTick 的时钟为外部时钟 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us = SYSCLK / 8; fac_ms = SYSCLK / 8 * 1000; } // 延时 us 微秒 void delay_us(u32 us) { // 用于保存寄存器状态 u32 temp; // 设置重加载值 SysTick->LOAD = us * fac_us; // 清空当前值 SysTick->VAL = 0; // 使能 SysTick SysTick->CTRL |= 0x1; // 循环等待定时器到时 do { temp = SysTick->CTRL; } while (!(temp & (1 << 16)) && (temp & 0x1)); // 关闭 SysTick 定时器 SysTick->CTRL &= ~0x01; // 当前计数清零 SysTick->VAL = 0; } // 延时 ms 毫秒 void delay_ms(u32 ms) { // 用于保存寄存器状态 u32 temp; // 设置重加载值 SysTick->LOAD = ms * fac_ms; // 清空当前值 SysTick->VAL = 0; // 使能 SysTick SysTick->CTRL |= 0x1; // 循环等待定时器到时 do { temp = SysTick->CTRL; } while (!(temp & (1 << 16)) && (temp & 0x1)); // 关闭 SysTick 定时器 SysTick->CTRL &= ~0x01; // 当前计数清零 SysTick->VAL = 0; } // 延时 second 秒 void delay_s(u32 second) { while (second--) { delay_ms(1000); } }