导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于定时器中断的问题[zjh1112]

 *第42168篇: 关于定时器中断的问题

  
楼 主:zjh1112 2006年7月22日16:54
 关于定时器中断的问题
各位高手大家好,目前我在基于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的中断,我想请教各位高手这是什么问题?先谢了!

  
2楼:zjh1112 2006年7月24日09:57
 关于定时器中断的问题(CONT)
这个问题已经解决,是配置语句顺序的问题;不过现在又碰到新的问题,就是定时器中断在运行过程中会死掉(应该开启以后无限的运行下去),这可能是什么问题呢?(平台是ARM44B0和UCOS)

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:ADS7844有谁用过,请教个问题!

[下一篇主题]:求教:用串口精灵给89C52发送数据,怎么只能发送一次呢