利用系统时钟实现微秒延时。系统时钟正常设置为1ms一个tick,每毫秒产生一个系统时钟中断。SysTick->VAL记录的是计数器,SysTick->LOAD为计数器记录的最大值。SysTick->VAL开始被设置为SysTick->LOAD寄存器中配置的值,之后根据系统时钟的频率递减,为0之后触发中断后又重新加载为LOAD的值。因此,1us对应的VAL寄存器的变化值为SysTick->LOAD / 1000。
//Delay < 1000us
void Delay_us(uint32_t Delay)
{
uint32_t tickstart = 0;
uint32_t tickNum = 0;
uint32_t tickMax = SysTick->LOAD;
uint32_t delay_usvalue = (SysTick->LOAD / 1000) * Delay;
tickstart = SysTick->VAL;
while(1)
{
uint32_t cur_tick = SysTick->VAL;
if (cur_tick > tickstart)
{
tickNum = tickstart + (tickMax - cur_tick);
}
else
{
tickNum = tickstart - cur_tick;
}
if (tickNum > delay_usvalue)
{
break;
}
}
}