代码:- static u32 fac_us; //定义 1 个微秒的值
- static u32 fac_ms; //定义 1 个毫秒的值
- /**
- * 初始化系统的嘀嗒定时器
- */
- void delay_init(){
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟,将 72MHz 的频率 8 分频,把系统嘀嗒定时器的变化定位在 1s
- fac_us = SystemCoreClock / 8000000; //将 fac_us 设置为系统时钟的 1 / 8000000,SystemCoreClock = 72MHz,9MHz <=> 1s
- fac_ms = fac_us * 1000; //将 fac_ms 设置为 fac_us 的 1000 倍
- }
- /**
- * 微秒延迟计数
- * temp & 0x01 && !(temp & (1 << 16)) 详解:
- * temp & 0x01 通过定时器状态值的最小位(1位)判断定时器是否处于使能状态
- * !(temp & (1 << 16)) 通过定时器状态值的最大位(16位)判断定时器是否处于归零状态
- */
- void delay_us(u32 nus){
- u32 temp;
- SysTick -> LOAD = nus * fac_us; //设置重装载值
- SysTick -> VAL |= 0x00; //将定时器归零
- SysTick -> CTRL |= SysTick_CTRL_ENABLE_Msk; //开启定时器
- //这里通过循环判断定时器的状态位值来确认定时器是否已归零
- do{
- temp = SysTick -> CTRL; //获取定时器的状态值
- }while(temp & 0x01 && !(temp & (1 << 16)));
- SysTick -> CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭定时器
- SysTick -> VAL |= 0x00; //将定时器归零
- }
- /**
- * 毫秒延时计数
- */
- void delay_ms(u32 nms){
- u32 temp;
- SysTick -> LOAD = nms * fac_ms; //设置重装载值
- SysTick -> VAL |= 0x00; //将定时器归零
- SysTick -> CTRL |= SysTick_CTRL_ENABLE_Msk; //开启定时器
- //这里通过循环判断定时器的状态位值来确认定时器是否已归零
- do{
- temp = SysTick -> CTRL; //获取定时器的状态值
- }while(temp & 0x01 && !(temp & (1 << 16)));
- SysTick -> CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭定时器
- SysTick -> VAL |= 0x00; //将定时器归零
- }
|