如果我们需要得到精确的定时,那么我们可以使用STM32中的定时器(时钟9M,1微秒减9),例如,SysTick 定时器。SysTick是一个24位的递减计数器,它放在NVIC中,主要目的是为了给操作系统提供一个硬件上的中断(滴答中断)。SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0 时,SvsTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(假如中断使能情况下)。在STM32中,SysTick定时器可以用来作为操作系统的滴答定时器。如果我们的程序不使用操作系统,那么SysTick定时器可以用来产生精确的定时。
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb; //bit2清空,选外部时钟 HCLK/8
fac_us=SYSCLK/8:
fac_ms=(u16)fac_us*1000;
}
//延时nus
//nus为要延时的us数
//n为10,20,30,.....
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;//关闭计数器
SysTick->VAL =0X00://清空计数器
}
要注意因为 LOAD 仅仅是一个24bit的寄存器,延时的ms数不能太长。否则超出了LOAD 的范围,高位会被舍去,导致延时不准。最大延迟ms数可以通过公式:n ms<=0xffffff *8*1000/SYSCLK 计算。SYSCLK 单位为Hz,nms的单位为ms。如果时钟为72M,那么nms的最大值为1864ms。超过这个值就会导致延时不准确。