本文解决的问题是:
? ? ? ? 当我在执行程序的时候会遇到一种状况,会有一个子程序去处理这种状况,但是定时中断服务函数的运行会对我这个子程序的运行造成影响而不能去解决这种状况时,我就需要去暂时关闭我的定时中断,去让这个对应的子程序去处理这种状况。
一
? ? ? ? 第一种思路就是我不去关闭定时器中断,让它继续的定时中断,而不让它去运行它的服务函数。
? ? ? ? 怎样实现呢·?
? ? ? ? 给它的中断服务函数里加个大前提
????????LED0写在定时中断里(100ms反转一次) 当按键KEY1按下(并松开)之后,LED0不反转了,LED1每1s反转一次 共反转两次(2s)(期间LED0不会发生变化),之后它中断服务函数的LED0继续每100ms翻转一次。
? ? ? ? 这里我设了个全局变量 a ,当LED1反转的两秒期间我把 a = 0 ,这样就导致了中断服务函数里的LED0反转这个函数不运行,当LED1反转两秒之后,我再把 a = 1;这样LED0反转既可以继续运行,整个期间定时器一直在运行。
????????这种方法主要是解决我中断服务程序的部分程序不得不运行,而有部分程序在我处理其他状况的时候需要必须关闭的这种情况。
注:注意把 a 设成全局变量,为了方便代码中各种初始化都没写上去。
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
TIM3_Int_Init(999,7199);
while(1)
{
key=KEY_Scan(0); //得到键值
if(KEY1==0)
{
a=0;
LED1=!LED1;
delay_ms(1000);
LED1=!LED1;
delay_ms(1000);
a=1;
}
}
}
u16 a=1;
void TIM3_IRQHandler(void) //TIM3中断服务函数
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
if(a)
{LED0=!LED0;
}}
}
二
? ? ? ? 纯粹的关闭和开启定时器中断。
? ? ? ? 使用Cmd函数来让定时中断使能和不使能。
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
TIM3_Int_Init(999,7199);
while(1)
{
key=KEY_Scan(0); //得到键值
if(KEY1==0)
{
// a=0;
TIM_Cmd(TIM3,DISABLE);
LED1=!LED1;
delay_ms(1000);
LED1=!LED1;
delay_ms(1000);
LED1=!LED1;
TIM_Cmd(TIM3,ENABLE);
// a=1;
}
}
}
? ? ? ? 或者使用TIM_ITConfig()定时器更新中断函数来控制
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
TIM3_Int_Init(999,7199);
while(1)
{
key=KEY_Scan(0); //得到键值
if(KEY1==0)
{
// a=0;
// TIM_Cmd(TIM3,DISABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
LED1=!LED1;
delay_ms(1000);
LED1=!LED1;
delay_ms(1000);
LED1=!LED1;
// TIM_Cmd(TIM3,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
// a=1;
}
}
}
|