irq.c

来自「AT91RM9200-UC/OS-II,clock,irq,usart,pio等」· C语言 代码 · 共 94 行

C
94
字号
#include "includes.h"
#include "irq.h"
#include "interrupt.h"

IRQ IRQ_Table[IRQ_CNT] = 
{
	{AT91C_ID_IRQ0,AT91C_BASE_PIOB,AT91C_PB29_IRQ0,'A',NULL},
	{AT91C_ID_IRQ1,AT91C_BASE_PIOA,AT91C_PA26_IRQ1,'B',NULL},
	{AT91C_ID_IRQ2,AT91C_BASE_PIOA,AT91C_PA25_IRQ2,'B',NULL},
	{AT91C_ID_IRQ3,AT91C_BASE_PIOA,AT91C_PA23_IRQ3,'B',NULL},
	{AT91C_ID_IRQ4,AT91C_BASE_PIOA,AT91C_PA2_IRQ4, 'B',NULL},
	{AT91C_ID_IRQ5,AT91C_BASE_PIOA,AT91C_PA3_IRQ5, 'B',NULL},
	{AT91C_ID_IRQ6,AT91C_BASE_PIOA,AT91C_PA16_IRQ6,'B',NULL}
};


/*******************************************************************************
* 名称:IRQ_Iint()
* 功能:IRQ的初始化函数
* 入口参数:irq IRQ的属性参数
*			ID--//该设备的ID,目前用该外设的中断号
*			AB--//IRQ对应的PIO的功能
*			IRQ_handling--//对设备的中断处理程序
* 出口参数:无
* 说明:设置PIO的IRQ功能,同时把设备加入中断处理程序列表,打开中断控制器的对应中
*		断使能位
*******************************************************************************/
void  IRQ_Init(IRQ irq)
{
#if	OS_CRITICAL_METHOD == 3
	int cpu_sr;
#endif
	IRQ *pIrq;
	int idx;
	
	OS_ENTER_CRITICAL();
	
	//根据中断号从同类设备的索引表中找出对应的序号
	idx = Index_table[irq.Id];
	
	//从外部中断列表中找出相应的IRQ
	pIrq = IRQ_Table + idx;		
	
	//设置专门的中断处理函数
	pIrq->IRQ_handling = irq.IRQ_handling;
	
	//设置PIO的IRQ功能
	if(pIrq->AB == 'A')
	{
		AT91F_PIO_CfgPeriph(pIrq->pIRQ,pIrq->shift,0);
	}
	else
	if(pIrq->AB == 'B')
	{
		AT91F_PIO_CfgPeriph(pIrq->pIRQ,0,pIrq->shift);	
	}
	else
		return;
	
	//填充中断处理函数列表,供OS_CPU_IRQ_ISR_Handler查询使用
	intConnect(pIrq->Id,(AT91_REG)pIrq->pIRQ,IRQ_Handling);
	
	//设置该外设对应的中断控制器使能位
	intEnable(pIrq->Id);
	
	OS_EXIT_CRITICAL();
}

/*******************************************************************************
* 名称:IRQ_Handling()
* 功能:IRQ中断处理函数
* 入口参数:irq_base 对应IRQ的基地址
*			irq_vector 对应的外设中断号
* 出口参数:无
* 说明:该函数是所有IRQ中断函数入口(与OS_CPU_IRQ_ISR_Handler的接口),在
*		该函数中判断具体的外设中断处理函数并执行
*******************************************************************************/
void IRQ_Handling(int irq_base,int irq_vector)
{
	int idx;
	IRQ *pIrq;
	
	//根据中断号从同类设备的索引表中找出对应的序号
	idx = Index_table[irq_vector];
	
	//从外部中断列表中找出相应的IRQ
	pIrq = IRQ_Table + idx;
	
	if(pIrq->IRQ_handling)
	{
		UartPrintf(1,"2");
		//pIrq->IRQ_handling();	
	}
}

⌨️ 快捷键说明

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