|
本帖最后由 gzyavr 于 2012-9-10 17:28 编辑
单片机的主程序和中断程序的执行的关系:
在没有中断的时候,在主程序的while中循环执行,当中断条件到,那么暂停主程序,进入中断服务函数运行。中断函数运行完后,返回主函数的中断处继续执行。
那么现在我用定时器实现了一个1ms的的中断。需要实现这样的一个效果:
全局变量赋值(进入中断的次数)。初值=10000,计时十分钟。十分钟后需要执行一段特定的程序,但是没有到十分钟的时候,主程序还是在执行者其它的函数。它的执行过程是这样的吧(每隔1ms进中断一次,断断续续的执行着主函数)
以下是实验程序【计时1s】:
u16 s; //全局变量
bool time_mark;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~延时
void delay_ms(unsigned int ms)
{
unsigned int ti;
while(ms--)
{
for(ti=0;ti<200;ti++){} //1421
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~中断初始化设置
void Tim5_Init(void)
{
TIM5->PSCR=0X02; //4分频,3.6864M晶振的到得计数频1us
TIM5->ARRH =0x03; //1000次
TIM5->ARRL =0xe8;
TIM5->EGR=0X01; // 软件产生一次中断 更新寄存器中值
TIM5->IER|=0x01; //允许溢出中断。
_asm("RIM") ; //开全局中断
TIM5->CR1|=0X80; //使能计数器,使能预装载,向上计数方式。
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~中断服务函数
@far @interrupt void TIM5_Server_Interrupt(void)
{
_asm("SIM") ; //关全局中断
s--;
if(s<1)
{
time_mark=1;
TIM5->CR1&=0xfe; //关比定时器
}
TIM5->SR1&=0xfe; //清除中断标志
_asm("RIM"); //开全局中断
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主函数文件
bool n=0;
extern time_mark;
extern s;
void main(void)
{
CLK_HSECmd(ENABLE);
Tim5_Init();
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);//推挽输出低电平
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
/* Infinite loop */
while (1)
{
if(n==0)
{
TIM5->CR1|=0X01; //开延时中断 延时10分钟关闭路灯的啦。
s=1000;
n=1; //仅给延时赋一次种?
GPIO_WriteLow(GPIOD, GPIO_PIN_6);
}
GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
delay_ms(1000);
GPIO_WriteLow(GPIOD, GPIO_PIN_0);
delay_ms(1000);
if(time_mark==1) //进入中断的次数完成标志
{
time_mark=0; //标记清除
n=0; //赋值标记清除,可再次进入赋值
GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
delay_ms(500);
}
}
}
但是现在:
我如果改变延时函数为delay_ms(2000)的话, if(time_mark==1){} 的这部分就不会执行了。这是为什么?这段延时怎么会影响中断呢??
按照我的理解应该是:我计时10分钟的话:
S=10000,然后计时器开始计时,每1ms进中断一次,在中断里面减S一次。出中断继续执行主程序中的可执行程序。待10000次中断后,执行一次if(time_mark==1){}。而主程序中的延时是完全不会影响中断的。但是事实是影响到了中断。这是什么原因呢? |
|