自己用的Systick延时函数

2019-07-21 04:37发布

[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的当前的计数值,然后关闭计数器,递归调用延时,等延时结束判断一下原来剩余的延时时间跟中断时执行的延时时间,如果少于中断的就关闭计数器,如果没有就继续延时,退出函数 ,返回主进程。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。