irq.c

来自「平台44B0开发板」· C语言 代码 · 共 86 行

C
86
字号
#include "irq.h"
/*
#define IRQBASE       _ISR_STARTADDRESS+4*8
#define IRQVECTOR(x)  (IRQBASE + ((unsigned int)x)*4)
void uhal_register_irq(NON_VECTOR_HANDLER IrqSrc, void* pIRQService)
{
  *(unsigned *)(IRQVECTOR(IrqSrc)) = (unsigned)pIRQService;
}
*/
#define _ISR_STARTADDRESS 0xc7fff00
#define pISR_IRQ	( *( (unsigned *)(_ISR_STARTADDRESS + 0x18) ) )

extern leds_run(void);
extern leds_on(void);
void enable_IRQ(void);
void disable_IRQ(void);

/*
void irq_init(void)
{
	pISR_IRQ = (unsigned) irq_ISR;
	disable_IRQ();
	rINTCON	= 0x1;	  								// Vectored mode, IRQ disable, FIQ disable    	
	rINTMOD	= 0x0;	  								// IRQ mode
    rINTMSK	= 0x07DFFFFF;	  						//other interrupt masked.
    rI_ISPC = 0xffffffff;							// Clear all interrupt pend
    rPCONG = 0xffff;
    rPUPG = 0x00;
    rEXTINT = 0x4000000;                  			// 上升沿,Level mode
	rEXTINTPND = 0x0;								// 置零,not actived。	
	rI_ISPC   |=  BIT_EINT6;				// clear pending_bit
}
*/
void irq_init(void)
{
	disable_IRQ();
	
	rI_ISPC = 0x3ffffff;	//清除中断状态寄存器,[21]为1的时候,清除extint4.5.6.7;
	rINTMOD = 0;			//中断模式选择,[21]值为0,EXTINT4.5.6.7为irq中断。		
	rINTCON = 0x5;			//中断控制寄存器,0101,非向量,且irq模式			
	rINTMSK = ~(0x200000 | 0x4000000);	//中断屏蔽位[21]为0,表示未屏蔽	
	pISR_IRQ = (unsigned) (irq_ISR);	//安装服务程序
	rPCONG = 0xffff;	//port g控制寄存器;
	rPUPG = 0x00;		//上升沿有效;
	rEXTINT = rEXTINT | 0x22220020;	//中断4567 全部下降沿触发
	rI_ISPC = rI_ISPC | 0x200000;	//EINT4567 clear the pending bit
	rEXTINTPND = 0xf;		//EXTINT4.5.6.7同时激活
	
	enable_IRQ();
}
void irq_ISR(void)
{
	disable_IRQ();
	
	leds_run();
	
	rEXTINTPND = 0xf;		//EXTINT4.5.6.7同时清除;
	rI_ISPC = 0x3ffffff;	//清除中断状态寄存器,[21]为1的时候,清除extint4.5.6.7;
	
	enable_IRQ();
}


//内联函数enable_IRQ,使能irq中断;
__inline void enable_IRQ(void)
	{
  	int tmp;
  	__asm
  	{
    	MRS tmp, CPSR
    	BIC tmp, tmp, #0x80
    	MSR CPSR_c, tmp
  	}
}

//内联函数enable_IRQ,关闭irq中断;
__inline void disable_IRQ(void)
{
	int tmp;
  	__asm
  	{
		MRS tmp, CPSR
		ORR tmp, tmp, #0x80
    	MSR CPSR_c, tmp
  	}
}

⌨️ 快捷键说明

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