[mw_shl_code=c,true]void delay_ms(u16 nms)
{
u32 temp;
if( SysTick->CTRL==0x00 )
{
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL=0x01;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00
}
else
{
temp = SysTick->VAL;
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
delay_ms(nms);
if(nms*fac_ms<temp)
{
SysTick->LOAD = temp - nms*fac_ms;
SysTick->CTRL = 0x01;
}
}
}[/mw_shl_code]
这个是参照原子哥写的,当初用这个是因为主函数中有延时的时候,发生中断进入中断函数以后再执行延时,退出中断后Systick定时器关闭,导致主函数延时提前结束所想出来的办法,这个函数主要就是进来先判断Systick是否在工作,如果在工作就先记录Systick的当前的计数值,然后关闭计数器,递归调用延时,等延时结束判断一下原来剩余的延时时间跟中断时执行的延时时间,如果少于中断的就关闭计数器,如果没有就继续延时,退出函数 ,返回主进程。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>