📄 interrupt.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 + -