关于定时器中断的问题
各位高手大家好,目前我在基于ARM7和UCOS—ii做一个定时的应用程序,因TIMER0已被操作系统利用,故我的定时是利用TIMER1来做的,以下是我在应用程序中的代码:
void Control_Task(void* pdata)
{
/*定时器的配置和开启*/
for( ; ;)
{
unsigned char err;
Uart_Printf("test timer\n");
rTCNTB1 = 1000*8; //8*ms;
rTCMPB1 = 0x0;
rTCON |= (0x1 < < 9); //manual update
rTCON |= ((0x1 < < 8) | (0x1 < < 11)) + rTCON & ~(0x1 < < 9);//start, auto-load mode
rINTMSK&=(~BIT_GLOBAL);
rINTMSK &= ~(BIT_TIMER1);
Uart_Printf("complete config!\n");
OSSemPend(comsem,0,&err); //等待中断延时的完成
Uart_Printf("hello!\n");
}
}
而另外中断服务程序在uhal.c中,其具体代码如下:
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include "44breg.h"
#include "44blib.h"
#include "uhal.h"
#include "uart.h"
#include "def.h"
#include "includes.h"
#include "option.h"
#include "ne2kif.h"
extern OS_EVENT* comsem;
int count=0;
void do_irq(void);
extern void OSISR(void);
//extern void FISR(void);
__irq void do_firq(void)
{ while(1)
Uart_Printf("!!!Enter FIRQ.");
}
__irq void Timer1(void) //有关TIMER1的中断服务程序
{
Uart_Printf(" enter Timer1\n");
rTCON &= ~((0x1 < < 8) | (0x1 < < 11));//stop, one shot mode
rINTMSK |= BIT_TIMER1;
Uart_Printf(" enter Timer1\n");
// count++;
// if(count==10)
// {
// count=0;
OSSemPost(comsem);
// }
}
__irq void BreakPoint(void)
{ while(1)
Uart_Printf("!!!Enter break point.\n");
}//BreakPoint
__irq void OutDebug(unsigned int num)
{while(1)
Uart_Printf("\r\n***STACK***:%d\r\n", num);
}//OutDebug
//Initialze interrupts.
void uHALr_InitInterrupts(void)
{
// Non-vectored,IRQ disable,FIQ disable
// rINTCON=0x0;
rINTCON=0x5;
// All=IRQ mode
rINTMOD=0x0;
}//uHALr_InitInterrupts
//Initialize timer that is used OS.
void uHALr_InitTimers(void)
{
rTCFG0= 0x00000000; // prescaler0 = 0
rTCFG1= 0x00000000; // mux0 = 1/2
rTCNTB0= MCLK/2/OS_TICKS_PER_SEC;
rTCMPB0= 0x0;
rTCON=0x2; //update mode for TCNTB0 and TCMPB0.
rTCON=0x9; //timer0 = auto reload, start
}//uHALr_InitTimers
int I_COUNT=0;
__irq void DebugUNDEF(void)
{ while(1)
Uart_Printf("!!!Enter UNDEFINED.\n");
}//BreakPoint
__irq void DebugSWI(void)
{ //while(1)
Uart_Printf("!!!Enter SWI.\n");
}
__irq void DebugABORT1(void)
{ while(1)
Uart_Printf("!!!Enter PROGRAM ABORT\n");
}
__irq void DebugABORT2(void)
{ while(1)
Uart_Printf("!!!Enter DATA ABORT\n");
}
void do_irq(void)
{
U32 intpnd;
Uart_Printf("Total Interrupt Enter\n");
intpnd = rINTPND & (~rINTMSK);
while(intpnd)
{
if(intpnd & BIT_TIMER0)
{
Uart_Printf("enter timer0!\n");
OSTimeTick();
rI_ISPC |= BIT_TIMER0;
}
if(intpnd & BIT_EINT3)
{
//Uart_Printf("enter net int\n");
ne2k_isr();
rI_ISPC |= BIT_EINT3;
}
if(intpnd & BIT_TIMER1) //added by zjh
{
Uart_Printf("timer1 interrupt!\n");
Timer1();
rI_ISPC |= BIT_TIMER1;
}
intpnd = rINTPND & (~rINTMSK);
}
}
/*** Called by ARMTargetStart() ***/
void uHALr_InstallIrqHandler(void)
{
pISR_TIMER0 = (unsigned) OSISR;
pISR_UNDEF = (unsigned) DebugUNDEF;
pISR_SWI = (unsigned) DebugSWI;
pISR_PABORT = (unsigned) DebugABORT1;
pISR_DABORT = (unsigned) DebugABORT2;
pISR_FIQ = (unsigned) do_firq;
pISR_ADC = (unsigned) BreakPoint;
pISR_RTC = (unsigned) BreakPoint;
pISR_UTXD1 = (unsigned) BreakPoint;
pISR_UTXD0 = (unsigned) BreakPoint;
pISR_SIO = (unsigned) BreakPoint;
pISR_IIC = (unsigned) BreakPoint;
pISR_URXD1 = (unsigned) BreakPoint;
pISR_URXD0 = (unsigned) BreakPoint;
pISR_EINT4567 = (unsigned) BreakPoint;
pISR_WDT = (unsigned) BreakPoint;
pISR_TIMER3 = (unsigned) BreakPoint;
pISR_TIMER2 = (unsigned) BreakPoint;
//pISR_TIMER1 = (unsigned) BreakPoint;
pISR_TIMER1 = (unsigned) OSISR;
pISR_UERR01 = (unsigned) BreakPoint;
pISR_BDMA1 = (unsigned) BreakPoint;
pISR_BDMA0 = (unsigned) BreakPoint;
pISR_ZDMA1 = (unsigned) BreakPoint;
pISR_ZDMA0 = (unsigned) BreakPoint;
pISR_EINT3 = (unsigned) OSISR;
pISR_EINT0 = (unsigned) BreakPoint;
pISR_EINT1 = (unsigned) BreakPoint;
pISR_EINT2 = (unsigned) BreakPoint;
}//uHALr_InstallIrqHandler
//Start system timer & enable the interrupt.
void uHALr_EnableTimer(void)
{
rINTMSK&=(~BIT_GLOBAL);
rINTMSK&=(~BIT_TIMER0);
}
#define BUILD_DATE "Date: " __DATE__ "\n"
/*
* Initialize an ARM Target board
*/
void
ARMTargetInit(void)
{
/* ---- Tell the world who we are ---------------------------------- */
Uart_Printf("\nSAMSUNG board\n");
Uart_Printf(uHAL_VERSION_STRING);
Uart_Printf("\n");
Uart_Printf(uHAL_AUTHOR_STRING);
Uart_Printf("\n");
Uart_Printf(BUILD_DATE);
Uart_Printf("\n");
/* ---- disable interrupts (IRQs) --------------------------------- */
//ARMDisableInt();
// OS_ENTER_CRITICAL();
uHALr_InitInterrupts();
uHALr_InitTimers();
} /* targetInit */
/* start the ARM target running */
void ARMTargetStart(void)
{
/* request the system timer */
uHALr_InstallIrqHandler();
/* Start system timer & enable the interrupt. */
uHALr_EnableTimer();
}
但现在的问题是,程序运行时,始终进不了TIMER1的中断,我想请教各位高手这是什么问题?先谢了!
发表时间:2006年7月22日16:54:02