⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 arm编程 ads应用hello.rar
💻 C
字号:
#include "includes.h"

volatile unsigned int IntOffSet;


extern unsigned int GetIsrStartAddr(void);
#define ISRSTART GetIsrStartAddr()
//****************************************************************************
#ifdef _OS_
extern OS_EVENT *UartSem;
extern OS_EVENT *D12Mbox;
//extern INT32U            OSCtxSwCtr; 
#endif
//****************************************************************************
__swi(0x16) extern void OSEnter0(void);
__swi(0x6) extern void OSEnter1(void);

extern void OS_EnterOS0(void)
{
 OSEnter0();
}


//****************************************************************************

static void IsrUndef(void)
{
 uprintf("IsrUndef\n");
 while(1);
}

 extern void IsrSWI(unsigned int swi_num)
{
 switch(swi_num)
   {
    case 0x16:

              break;
    default:  break;
   
   }
 
 uprintf("IsrSWI\n");
 while(1);
}

static void IsrPabort(void)
{
 uprintf("IsrPabort\n");
 while(1);
}

static void IsrDabort(void)
{
 uprintf("IsrDabort\n");
 while(1);
}

static void IsrReserved(void)
{
 unsigned short val=1;
 #ifdef _OS_
  val=OSSemAccept(UartSem);
 #endif 
    if(val) 
      {
       uprintf("IsrReserved\n");
        #ifdef _OS_
       OSSemPost(UartSem);
        #endif
      }
 while(1);
}
/*
static void IsrIrq(void)
{
 
 
}

static void IsrFIQ(void)
{
 
 
}

*/

static void IsrADC(void)
{
 
 
}

static void IsrRTC(void)
{

}

static void IsrUTXD1(void)
{
 
 
}

static void IsrUTXD0(void)
{
 
 
}

static void IsrSIO(void)
{
 
 
}

static void IsrIIC(void)
{
 
 
}

static void IsrURXD1(void)
{
 
 
}

static void IsrURXD0(void)
{
 
 
}


void IsrTIMER5(void)
{
 static unsigned int tt=0;
 unsigned short val=1;

 tt++;
 
 #ifdef _OS_
 val=OSSemAccept(UartSem);
 #endif

    if(val) 
      {
        //uprintf("Timer5 Int %d\n",tt);
        //uprintf("%d\n",OSCtxSwCtr);
        //uprintf("%d\n",OSIntNesting);
        #ifdef _OS_
       OSSemPost(UartSem);
        #endif
      }    
      
}

static void IsrTIMER4(void)
{
 
 
}

static void IsrTIMER3(void)
{
 
 
}

static void IsrTIMER2(void)
{
 
 
}

static void IsrTIMER1(void)
{
 
 
}

static void IsrTIMER0(void)
{
 
 
}

static void IsrUERR01(void)
{
 
 
}
static void IsrWDT(void)
{
 
 
}

static void IsrBDMA1(void)
{
 
 
}

static void IsrBDMA0(void)
{
 
 
}

static void IsrZDMA1(void)
{
 
 
}

static void IsrZDMA0(void)
{
  
 
}


void IsrTICK(void)
{
 #ifdef _OS_
 OSTimeTick();
 #endif
}

static void  IsrEINT4567(void)
{
 
             switch(rEXTINTPND&0x0f)
         {
          case 0x01:rPDATC^=0x0002;
                    //delay(100);
                    rEXTINTPND|=1;
                    rI_ISPC|=(1<<21);
                    break;
          case 0x02:rPDATC^=0x0004;
                    //delay(100);
                    rEXTINTPND|=2;
                    rI_ISPC|=(1<<21);
                    break;
          case 0x04:rPDATC^=0x0008;
                    //delay(100);
                    rEXTINTPND|=4;
                    rI_ISPC|=(1<<21);
                    break;
          default:  //delay(100);
                    rEXTINTPND|=15;                                    
                    rI_ISPC|=(1<<21);
                    break;          
         }
} 

static void IsrEINT3(void)
{
 
 
}

static void IsrEINT2(void)
{
 
 
}

static void IsrEINT1(void)
{
 
 
}


static void IsrEINT0(void)
{
			

}

/****************************************************************/

static void RTCTICKInit(void)
{
 rRTCCON|=0x01; 
 rTICINT=0x81;
 rRTCCON&=~(0x01);
}

static void Timer5Init(void)
{
 /* 
 rTCON=0; 
 rTCFG0=255<<16;//1/256
 rTCFG1=2<<20;//1/8
 rTCNTB5=32767;
 rTCON=3<<24; 
 */
 
 	rTCON   &= 0xf0ffffff;			//clear manual update bit, stop Timer 5 	
	rTCFG0  &= 0xff00ffff;			//定时器4/5的预分频为128
	rTCFG0  |= (128-1)<<16;
	rTCFG1  &= 0xff0fffff;			//定时器5的MUX为1/8
	rTCFG1  |= 2<<20;	
	rTCNTB5  =32767;	//定时器5的重装值,在ENABLE之前设定	
	rTCON   |= 0x02000000;			//定时器5的MANUAL UPDATE BIT设为1
	;rTCON   &= 0xf0ffffff;			//MANUAL UPDATE BIT清零
	rTCON   |= 0x05000000;			//定时器5 start, 设为INTERVAL模式
 
}
/****************************************************************/
void IrqInit(void)
{
  
 RTCTICKInit();
 Timer5Init();
 IsrInstallAll(); 
 
 rINTCON=0x05;//non-vectored interrupt
 rINTMOD=0x0;
 rINTMSK=0x07cffeff;//5cffeff
 //rINTMSK=0x05ffffff; 
 rI_ISPC|=0x03ffffff;
 

}

static void IsrInstall(unsigned int vector,unsigned int isr)
{
 //isr 入口地址根据init中的进行计算
 vector=ISRSTART+vector*4;
 *(unsigned int *)vector=(unsigned int)isr;

}

//在该函数中完成ISR注册
//for vectored interrupt mode
void IsrInstallAll(void)
{
 IsrInstall(vctUNDEF,(unsigned int)IsrUndef);
 IsrInstall(vctSWI,(unsigned int)IsrSWI);
 IsrInstall(vctPABORT,(unsigned int)IsrPabort);
 IsrInstall(vctDABORT,(unsigned int)IsrDabort);
 IsrInstall(vctRESERVED,(unsigned int)IsrReserved);
 
 IsrInstall(vctADC,(unsigned int)IsrADC);
 IsrInstall(vctRTC,(unsigned int)IsrRTC);
 IsrInstall(vctUTXD1,(unsigned int)IsrUTXD1);
 IsrInstall(vctUTXD0,(unsigned int)IsrUTXD0);
 IsrInstall(vctSIO,(unsigned int)IsrSIO);
 IsrInstall(vctIIC,(unsigned int)IsrIIC);
 IsrInstall(vctURXD1,(unsigned int)IsrURXD1);
 IsrInstall(vctURXD0,(unsigned int)IsrURXD0);
 IsrInstall(vctTIMER5,(unsigned int)IsrTIMER5);
 IsrInstall(vctTIMER4,(unsigned int)IsrTIMER4);
 IsrInstall(vctTIMER3,(unsigned int)IsrTIMER3);
 IsrInstall(vctTIMER2,(unsigned int)IsrTIMER2);
 IsrInstall(vctTIMER1,(unsigned int)IsrTIMER1);
 IsrInstall(vctTIMER0,(unsigned int)IsrTIMER0);
 IsrInstall(vctUERR01,(unsigned int)IsrUERR01);
 IsrInstall(vctWDT,(unsigned int)IsrWDT);
 IsrInstall(vctBDMA1,(unsigned int)IsrBDMA1);
 IsrInstall(vctBDMA0,(unsigned int)IsrBDMA0);
 IsrInstall(vctZDMA1,(unsigned int)IsrZDMA1);
 IsrInstall(vctZDMA0,(unsigned int)IsrZDMA0);
 IsrInstall(vctTICK,(unsigned int)IsrTICK);
 IsrInstall(vctEINT4567,(unsigned int)IsrEINT4567);
 IsrInstall(vctEINT3,(unsigned int)IsrEINT3);
 IsrInstall(vctEINT2,(unsigned int)IsrEINT2);
 IsrInstall(vctEINT1,(unsigned int)IsrEINT1);
 IsrInstall(vctEINT0,(unsigned int)IsrEINT0);

}

//****************************************************************************
void (*pIsrFunc[26])(void)=
{
 IsrADC,
 IsrRTC,
 IsrUTXD1,
 IsrUTXD0,
 IsrSIO,
 IsrIIC,
 IsrURXD1,
 IsrURXD0,
 IsrTIMER5,
 IsrTIMER4,
 IsrTIMER3,
 IsrTIMER2,
 IsrTIMER1,
 IsrTIMER0,
 IsrUERR01,
 IsrWDT,
 IsrBDMA1,
 IsrBDMA0,
 IsrZDMA1,
 IsrZDMA0,
 IsrTICK,
 IsrEINT4567,
 IsrEINT3,
 IsrEINT2,
 IsrEINT1,
 IsrEINT0,
    
};


//****************************************************************************
//for non-vectored interrupt mode
void ISR_IrqHandler(void)
{
  #ifdef _OS_
 OSIntEnter();
  #endif

  pIsrFunc[IntOffSet](); 
   
  #ifdef _OS_ 
 OSIntExit();
  #endif
}
//****************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -