中级会员
 
- 积分
- 325
- 金钱
- 325
- 注册时间
- 2016-10-21
- 在线时间
- 43 小时
|
发表于 2016-10-25 11:30:13
|
显示全部楼层
在主程中调用了delay_ms();在中断中又调用了delay_ms();
主程中运营delay_ms时,如果产生中断,中断中的delay_ms()会强行修改延时函数的参数,结果就是退出中断时,主程序的delay_ms函数也会结束,所以按下键时,会紧跟出打印数据。
看看下面代码,分析一下,你就明白。
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
中断产生时,会重置计数器:
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
中断的延时函数结束时,会关闭计数器:
SysTick->CTRL=0x00; //关闭计数器
中断结束后,会进入主程序的延时函数,此时SysTick->CTRL为0,而延时循环体:
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达
temp读数据为0,肯定跳出循环,所以主程序的延时会在产生中断后马上退出,所以时间为小于1S.
|
|