优化前
void delay_ms(uint32_t ms)
{
while(ms --)
{
SysTick->CTRL = 0; // 关闭系统定时器后才能配置寄存器
SysTick->LOAD = 21000; // 设置计数值,用于设置定时的时间
SysTick->VAL = 0; // 清空当前值还有计数标志位
SysTick->CTRL = 1; // 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
while ((SysTick->CTRL & (1<<16))==0); // 等待系统定时器计数完毕
SysTick->CTRL = 0; // 关闭系统定时器
}
}
void delay_us(uint32_t n)
{
SysTick->CTRL = 0; // 关闭系统定时器
SysTick->LOAD = n*168-1; // 168000000/1000000 -1,每次延时1us
SysTick->VAL = 0; //清空val寄存器 还有清空COUNTFLAG标志位
SysTick->CTRL = 5; // 使能系统定时器工作,而它的时钟源为处理器时钟168MHz
while ((SysTick->CTRL & 0x00010000)==0);// 等待系统定时器计数完毕
SysTick->CTRL = 0; // 关闭系统定时器
}
优化后:官方代码没有想到意外关闭的问题
int32_t delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->CTRL = 0;
SysTick->LOAD = (nus*21)-1;
SysTick->VAL = 0;
SysTick->CTRL = 1;
while(1)
{
temp=SysTick->CTRL;
//检测count flag
if(temp & 0x00010000)
break;
//检测系统定时器是否意外关闭
if((temp & 0x1)==0)
return -1;
}
SysTick->CTRL = 0;
return 0;
}
int32_t delay_ms(uint32_t nms)
{
uint32_t t = nms;
uint32_t temp;
while(t--)
{
SysTick->CTRL = 0;
SysTick->LOAD = 21000-1;
SysTick->VAL = 0;
SysTick->CTRL = 1;
while(1)
{
temp=SysTick->CTRL;
//检测count flag
if(temp & 0x00010000)
break;
//检测系统定时器是否意外关闭
if((temp & 0x1)==0)
return -1;
}
}
SysTick->CTRL = 0;
return 0;
}