systick延时程序参考野火的例程
#include "SysTick.h"
static __IO u32 TimingDelay;
void SysTick_Init(void){ if (SysTick_Config(SystemCoreClock / 100000)) { while (1); } SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;}
void Delay_us(__IO u32 nTime){ TimingDelay = nTime;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);}
void TimingDelay_Decrement(void){ if (TimingDelay != 0x00) { TimingDelay--; }}
void SysTick_Handler(void){ TimingDelay_Decrement(); }
平常使用是没有任何问题的,但是有时候在定时器中断中调用延时函数就会卡死在延时中,
while(TimingDelay != 0); 就是这一句话,不知道有没有人遇到这样的问题
定时器的中断等级一般都高于systick中断,你在其中运行程序,按理应该是进不了sysytick中断的吧,设置成非中断延时应该会好一点
参考下这个http://blog.csdn.net/hust_xu/article/details/47088365
定时器中断中,要尽量简化程序内容,只进行标志位赋值这样的简单操作,最好别有占用时间较长的函数。
你可以这样操作:
设置一个系统标志位name_flag;
然后在定时器中断中进行置1,在主循环中检测name_flag等于1时,执行你需要在定时器中执行的函数,并将该标志位置0.