#include "delay.h" static u8 fac_us=0;//us延时倍乘数 static u16 fac_ms=0;//ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为HCLK时钟的1/8 //SYSCLK:系统时钟 void delay_init(void) { systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8); fac_us = SystemCoreClock / 8000000; fac_ms = (u16)fac_us * 1000; } void delay_us(u32 nus) { u32 ctl; SysTick->LOAD = (u32)(nus * fac_us); SysTick->VAL = 0x0000U; do { ctl = SysTick->CTRL; } while((ctl & SysTick_CTRL_ENABLE_Msk) && !(ctl & SysTick_CTRL_COUNTFLAG_Msk)); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0x0000U; } //延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK单位为Hz,nms单位为ms //对72M条件下,nms<=1864 void delay_ms(u16 nms) { u32 ctl; /* reload the count value */ SysTick->LOAD = (u32)(nms * fac_ms); /* clear the current count value */ SysTick->VAL = 0x0000U; /* enable the systick timer */ SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; /* wait for the COUNTFLAG flag set */ do { ctl = SysTick->CTRL; } while((ctl & SysTick_CTRL_ENABLE_Msk) && !(ctl & SysTick_CTRL_COUNTFLAG_Msk)); /* disable the systick timer */ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* clear the current count value */ SysTick->VAL = 0x0000U; }