S3C2410A的中断控制器.ppt
文本预览下载声明
College of Computer Science Technology;S3C2410A的中断控制;为了更好地区分各个中断源,通常为这些中断定义不同的优先级别,并为每一个中断设置一个中断标志位。当发生中断时,通过判断中断优先级以及访问中断标志位的状态来识别哪一个中断发生了,进而调用相应的函数进行中断处理。
(5)中断返回,恢复现场。当完成中断服务子程序后,将SPSR中保存的程序运行状态恢复到CPSR中,R14中保存的被中断程序的地址恢复到PC中,继续执行被中断的程序。
;S3C2410A有SRCPND(中断源挂起寄存器)和INTPND(中断挂起寄存器)两个中断挂起寄存器。SRCPND和INTPND两个挂起寄存器用于指示某个中断请求是否处于挂起状态。当多个中断源请求中断服务时,SRCPND寄存器中的相应位设置为1,仲裁过程结束后INTPND寄存器中只有1位被自动设置为1。
S3C2410A中的中断控制器能够接收来自56个中断源的请求,这些中断源来自DMA控制器、UART、I2C及外部中断引脚等。S3C2410A共有32个中断请求信号。S3C2410A采用了中断共享技术,INT_UARTO、INT_UART1、INT_UART2、EINT8_23和EINT4_7为多个中断源共享使用的中断请求信号。中断请求的优先级逻辑是由7个仲裁器组成的,其中包括6个一级仲裁器和1个二级仲裁器。每个仲裁器是否使能由寄存器PRIORITY[6:0]决定。每个仲裁器可以处理4~6个中断源,从中选出优先级最高的。优先级顺序由寄存器PRIORITY[20:7]的相应位决定。; ;INT_LCD;;寄存器;PRIORITY;S3C2410A的中断控制编程;S3C2410A的中断控制编程;S3C2410A的中断控制编程;通过定时器1控制一个led灯每1秒钟改变一次状态,需要完成的主要工作如下。
(1)对定时器1初始化,并设定定时器的中断时间为1,具体代码参见Timed init( )函数。
void Timerl_init(void){
rGPBCON = rGPBCON0xfffffffc0
rGPBDAT= rGPBDAT |0x001;
rTCFG0 = 255;
rTCFG1 = 04;
rTCNTB1 = 48828; //在pclk = 50MHz下,1s的记数值rTCNTB1 =4/256=48828;
rTCMPB1 = 0x00;
rTCON = (1+11) | (19) | (08);//禁用定时器1,手动加载
rTCON = (1+11) | (09) | (18);//启动定时器1,自动装载
};(2)为了使CPU响应中??,在中断服务子程序执行之前,必须打开ARM920T的CPSR中的I位,以及相应的中断屏蔽寄存器中的位。打开相应的中断屏蔽寄存器中的位,是在TimerlINT Init()函数中实现的,具体代码如下。
void TimerlINT_Init(void){
if((rINTPND&BIT_TIMERI)){
rSRCPND | = BIT_TIMER1;
}
//写入定时器1中断服务子程序的入口地址
pISR_TMER1=(int)Timerl_ISR;
rINTMSK &=~(BIT_TIMERI); //开中断;
};(3)根据设置的定时时间,产生定时器中断。中断发生后,首先进行现场保护,然后转人中断的入口代码处执行。该部分代码通常使用汇编语言编写。在执行中断服务程序之前,要确保HandleIRQ地址处保存中断分发程序IsrIRQ的入口地址,代码如下。;(4)执行中断服务子程序,该子程序实现led灯每一秒钟改变一次状态。看到LEDl灯闪烁一次,则说明定时器发生了一次中断。具体实现见函数Timerl_ISR()。
int f ;
void _ _irq Timer1_ISR(void)
{
If (f= = 0)
{ rGPBDAT = rGPBDAT | 0x001;
f=1;
}
If (f= = 1)
{ rGPBDAT= rGPBDAT 0x0;
f=0;
}
rSRCPND |= BIT_TIMER1;
rINTPND |= BIT_TIMER1;
}
显示全部