本帖最后由 kyzb001 于 2011-9-30 10:17 编辑
我想用定时器0做一个延时。
定时器初始化为 1ms进入中断一次。
void Timer0_init(void)
{
//Timer 0 init
rTCFG0 = 249; //pclk/(249+1)
rTCFG1 = 0x02; //8分频=25000HZ
rTCNTB0 = 25000/1000; //TCNTB0[15:0]=计数值
rTCMPB0 = 0;
rTCON |=(1<<1); //将计数值装入TCNTB0、TCMPB0
rTCON =0x09;
rPRIORITY = 0x00000000; // 默认优先级
rINTMOD = 0x00000000; // 默认优先级
ClearPending(BIT_TIMER0);
pISR_TIMER0 = (unsigned int)IRQ_Timer0_Handle;
EnableIrq(BIT_TIMER0);
}
中断处理函数
void __irq IRQ_Timer0_Handle(void)
{
ClearPending(BIT_TIMER0);
if(_ms>1)
_ms--;
}
_ms是全局变量
在AllVar.h 中声明:extern unsigned int _ms;
在main.c中定义: unsigned int _ms=1;
延时函数如下
void DelayMs(unsigned int time)
{
unsigned char temp;
temp=1;
_ms=time;
#ifdef DebugDelay
Uart0_SendString("In Ms Delay.\r");
#endif
while(temp)
{
if(_ms<=1)
{
temp=0;
Uart0_SendString("Delay is Over.\r");
}
}
#ifdef DebugDelay
Uart0_SendString("Out Ms Delay.\r");
#endif
}
设计是:打开定时器,让它一直跑,1ms进入一次中断函数。进入中断函数以后 判断_ms的值 如果大于1就减。 延时函数调用,赋值给_ms 就可以达到延时效果。
但是,出现一个非常奇怪的问题,大家注意红色的串口0打印函数没,如果我不加这个函数的话, 延时函数就一个在那里跑,跳不出来。 我加了,就能按照预想的进行延时。
感觉非常奇怪啊, 是不是和 启动代码中的 异常中断有关系,但是我看不懂那个启动代码
请问下大虾们,这个问题该怎么解决啊!!!! |