原子哥的delay函数是这样的:
[mw_shl_code=c,true]void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
} [/mw_shl_code]
今天做了个实验,用到了中断。主程序中有delay函数,中断服务函数里面也有delay。
要是在主程序的delay期间发生了中断,中断服务程序中最后
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
把计数器给关了,待返回主函数时,因为延时函数的主要执行时间是在循环体,当返回主函数的do while循环的时候:
[mw_shl_code=c,true] do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 [/mw_shl_code]
岂不是因为计数器被关闭了而无法计数到0变成死循环?程序死翘翘了? |