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

📄 interrupt.c

📁 ARM9 的head。BOOTLOAD和串口IO的部分 if.q if
💻 C
字号:
#include "def.h"
#include "option.h"
#include "2410addr.h"
//#include "2410lib.h"
//#include "2410slib.h" 
#include "interrupt.h"
#include "IOSerial.h"

/*#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>*/

void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);

/********************************************************************
// Function name	: Isr_Init
// Description	    : 中断初始化功能
// Return type		: void
// Argument         : void
*********************************************************************/
void Isr_Init(void)
{
    pISR_UNDEF  = (unsigned)HaltUndef;
    pISR_SWI    = (unsigned)HaltSwi;
    pISR_PABORT = (unsigned)HaltPabort;
    pISR_DABORT = (unsigned)HaltDabort;
    
 	rSRCPND		= 0xffffffff;
    rINTPND		= 0xffffffff;
    
    rINTMOD     = 0x0;                     //All=IRQ mode
    rINTMSK     = BIT_ALLMSK;              //All interrupt is masked.
    rINTSUBMSK  = BIT_SUB_ALLMSK;          //All sub-interrupt is masked. <- April 01, 2002 SOP
}
/********************************************************************
// Function name	: Isr_Request
// Description	    : 注册中断函数
// Return type		: void
// Argument         : int irq_no
//                    #define IRQ_EINT0     1
//                    #define IRQ_EINT1     2
//                    #define IRQ_EINT2     3
//                    #define IRQ_EINT3     4
//                    #define IRQ_EINT4_7   5
//                    #define IRQ_EINT8_23  6
//                    #define IRQ_NOTUSED6  7
//                    #define IRQ_BAT_FLT   8
//                    #define IRQ_TICK      9
//                    #define IRQ_WDT       10
//                    #define IRQ_TIMER0    11
//                    #define IRQ_TIMER1    12
//                    #define IRQ_TIMER2    13
//                    #define IRQ_TIMER3    14
//                    #define IRQ_TIMER4    15
//                    #define IRQ_UART2     16
//                    #define IRQ_LCD       17
//                    #define IRQ_DMA0      18
//                    #define IRQ_DMA1      19
//                    #define IRQ_DMA2      20
//                    #define IRQ_DMA3      21
//                    #define IRQ_SDI       22
//                    #define IRQ_SPI0      23
//                    #define IRQ_UART1     24
//                    #define IRQ_NOTUSED24 25
//                    #define IRQ_USBD      26
//                    #define IRQ_USBH      27
//                    #define IRQ_IIC       28
//                    #define IRQ_UART0     29
//                    #define IRQ_SPI1      30
//                    #define IRQ_RTC       31
//                    #define IRQ_ADC       32
// Argument         : void* irq_routine
*********************************************************************/
void Irq_Request(int irq_no, void* irq_routine)
{
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX)
		*(unsigned int*)((irq_no - 1) * sizeof(unsigned int) + (unsigned int)(_ISR_STARTADDRESS+0x20)) = (unsigned int)irq_routine;
}
/********************************************************************
// Function name	: Irq_Enable
// Description	    : 开中断
// Return type		: void
// Argument         : int irq_no
*********************************************************************/
void Irq_Enable(int irq_no)
{
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX)
		rINTMSK &= ~(1 << (irq_no - 1));
}
/********************************************************************
// Function name	: Irq_Disable
// Description	    : 关中断
// Return type		: void
// Argument         : int irq_no
*********************************************************************/
void Irq_Disable(int irq_no)
{
	if(irq_no >= IRQ_MIN && irq_no <= IRQ_MAX)
		rINTMSK |= (1 << (irq_no - 1));
}
/********************************************************************
// Function name	: Irq_Clear
// Description	    : 清除中断
// Return type		: void
// Argument         : int irq_no
*********************************************************************/
void Irq_Clear(int irq_no)
{
    rSRCPND = (1 << (irq_no - 1));					/*清除RTC中断						*/
    rINTPND = (1 << (irq_no - 1));
    //rINTPND;
}
/********************************************************************
// Function name	: HaltUndef
// Description	    : undef异常处理
// Return type		: void
// Argument         : void
*********************************************************************/
void HaltUndef(void)
{
    PRINTF("Undefined instruction exception.\n");
    while(1);
}
/********************************************************************
// Function name	: HaltSwi
// Description	    : SWI异常处理
// Return type		: void
// Argument         : void
*********************************************************************/
void HaltSwi(void)
{
    Uart_Printf("SWI exception.\n");
    while(1);
}
/********************************************************************
// Function name	: HaltPabort
// Description	    : Pabort异常处理
// Return type		: void
// Argument         : void
*********************************************************************/
void HaltPabort(void)
{
    Uart_Printf("Pabort exception.\n");
    while(1);
}
/********************************************************************
// Function name	: HaltDabort
// Description	    : Dabort异常处理
// Return type		: void
// Argument         : void
*********************************************************************/
void HaltDabort(void)
{
    Uart_Printf("Dabort exception.\n");
    while(1);
}

void Enable_Irq_Cpsr(void)
{
	int tmp;
	__asm
	{
		MRS tmp,CPSR
		BIC tmp,tmp,#0x80
		MSR CPSR_c,tmp
	}
}
void Disable_Irq_Cpsr(void)
{
	int tmp;
	__asm
	{
	
		MRS tmp,CPSR
		ORR tmp,tmp,#0x80
		MSR CPSR_c,tmp
	}
}

⌨️ 快捷键说明

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