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

📄 interrupt.c

📁 AT91RM9200-UC/OS-II,clock,irq,usart,pio等驱动
💻 C
字号:
#include <includes.h>
#include <interrupt.h>

/*******************************************************************************
*设置该中断处理函数列表的目的是为了对中断处理程序的统一管理,并且对同类外设采用
*统一的处理方式,各个外设的特殊处理由相应的外设管理程序区别处理,这里不加区分,
*上面的功能特点在中断入口函数OS_CPU_IRQ_ISR_Handler中应用
*
*intEnable()完成:
*各个外设对应的中断处理硬件地址SVR全部设置为0,触发方式为沿触发,中断优先级为0
*******************************************************************************/
TIntAtrib interrupt_handling_table[INTERRUPT_CNT];	//中断处理函数列表

//与中断号相对应的同类设备中的序号从0开始
int Index_table[INTERRUPT_CNT] = {
/*0,FIQ*/	0,
/*1,debug*/	0,
/*2,PIOA*/	0,
/*3,PIOB*/	1,
/*4,PIOC*/	2,
/*5,PIOD*/	3,
/*6,US0*/	1,
/*7,US1*/	2,
/*8,US2*/	3,
/*9,US3*/	4,
/*10,MCI*/	0,
/*11,UDP*/	0,
/*12,TWI*/	0,
/*13,SPI*/	0,
/*14,SSC0*/	0,
/*15,SSC1*/	1,
/*16,SSC2*/	2,
/*17,TC0*/	0,
/*18,TC1*/	1,
/*19,TC2*/	2,
/*20,TC3*/	3,
/*21,TC4*/	4,
/*22,TC5*/	5,
/*23,UHP*/	0,
/*24,EMAC*/	0,
/*25,AIC*/	0,
/*26,AIC*/	1,
/*27,AIC*/	2,
/*28,AIC*/	3,
/*29,AIC*/	4,
/*30,AIC*/	5,
/*31,AIC*/	6
};

int interrupt_state = 0;							//中断使能状态,现在没用??????????????????



/*******************************************************************************
* 名称:IsVectorValid()
* 功能:判断中断源号是否有效
* 入口参数:vector 中断源号
* 出口参数:BOOLEAN 0-无效,1-有效
* 说明:中断源号的范围0-31
*******************************************************************************/
BOOLEAN IsVectorValid(int vector)
{
	int i,bit=0,bits;
	
	if((vector < AT91C_ID_FIQ) || (vector > AT91C_ID_IRQ6))
		return 0;
	
	return 1;
/*	
	bits = sizeof(AT91_REG) * 4;
	
	for(i = 0; i < bits; i ++)
	{
		if((vector >>= i) && 0x01)
			bit ++;
	}
	
	if(bit == 1)
		return 1;
	
	return 0;
*/
	
}


/*******************************************************************************
* 名称:intConnect()
* 功能:连接中断处理函数
* 入口参数:vector 中断源号
*			base_reg 该中断号对应的外设基地址
*			int_handling  对应的中断处理函数
* 出口参数:无
* 说明:设置中断处理函数列表,中断产生时,根据ISR中的中断源号,
*		查询该表可找到对应的中断处理函数及外设
*******************************************************************************/
void intConnect(int vector,AT91_REG base_reg,PFNCT int_handling)
{
	//判断中断源号的有效性
	if(!IsVectorValid(vector))
		return;
	
	//中断处理程序不能为空
	if(!int_handling)
		return;
	
	//设置中断处理函数列表
	interrupt_handling_table[vector].interrupt_handling = int_handling;
	interrupt_handling_table[vector].base_reg = base_reg;
}

/*******************************************************************************
* 名称:intEnable()
* 功能:使能vector对应的中断
* 入口参数:vector 中断源号
* 出口参数:无
* 说明:设置vector对应的中断使能标志位,该外设本身的使能设置由该外设的初始化完成,
*		这里只完成对中断控制器的对应位设置
*		对应外设的中断处理函数硬件地址AIC_SVR设置为0
*		中断触发方式为沿触发
*		中断优先级为0
*******************************************************************************/
void intEnable(int vector)
{
	//判断中断源号的有效性
	if(!IsVectorValid(vector))
		return;
	
	//设置使能状态位,现在没用??????????????????
	interrupt_state |= (1 << vector);
	
	//清楚对应的中断使能位及状态位
	//并初始化对应中断的一些寄存器
	AT91F_AIC_ConfigureIt(
		 AT91C_BASE_AIC,
		 vector,
		 0,
		 AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,
		 0);
	
	//设置对应中断的使能位
	AT91F_AIC_EnableIt(AT91C_BASE_AIC, vector);
}

/*******************************************************************************
* 名称:intDisEnable()
* 功能:取消vector对应的中断
* 入口参数:vector 中断源号
* 出口参数:无
* 说明:使相应的中断无效
*******************************************************************************/
void intDisEnable(int vector)
{
	if(!IsVectorValid(vector))
		return;
	
	//取消对应的使能状态位,现在没用??????????????????
	interrupt_state &= (1 << vector);
	
	//取消对应的中断使能	 
	AT91F_AIC_DisableIt(AT91C_BASE_AIC, vector);	
}

⌨️ 快捷键说明

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