Download presentation
Presentation is loading. Please wait.
1
第四章 BootLoader开发 附-s3c2410/s3c2440中断控制器介绍
College of Computer Science & Technology
2
S3C2410A的中断控制 ARM系统的中断处理 在ARM系统中,支持复位、未定义指令、软中断、预取中止、数据 中止、IRQ和FIQ 7种异常,每种异常对应于不同的处理器模式, 有对应的异常向量; 在ARM系统中,中断响应的步骤: (1)保存现场。保存当前的PC值到R14,保存当前的程序运行状 态到SPSR。 (2)模式切换。根据发生的中断类型,进入IRQ模式或FIQ模式。 (3)获取中断服务子程序地址。PC指针跳到异常向量表所保存的 IRQ或FIQ地址处,从而跳入到相应的中断服务子程序,进行中断 处理。 (4)多个中断请求处理。在ARM系统中,可以存在多个中断请求 源,比如串口中断、AD中断、外部中断、定时器中断及DMA中断等 ,所以可能出现多个中断源同时请求中断的情况。
3
为了更好地区分各个中断源,通常为这些中断定义不同的 优先级别,并为每一个中断设置一个中断标志位。当发生 中断时,通过判断中断优先级以及访问中断标志位的状态 来识别哪一个中断发生了,进而调用相应的函数进行中断 处理。 (5)中断返回,恢复现场。当完成中断服务子程序后,将 SPSR中保存的程序运行状态恢复到CPSR中,R14中保存的被 中断程序的地址恢复到PC中,继续执行被中断的程序。
4
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]的 相应位决定。
5
中断源 描述 仲裁器分组 INT_ADC AD转换或触摸(INT_ADC/INT_TC) ARB5 INT_RTC RTC报警中断 INT_SPI1 SPI1中断 INT_UART0 UART0中断(故障、接收和发送) INT_IIC I2 C中断 ARB4 VINT_USBH USB主设备中断 INT_USB USB从设备中断 保留 INT_UART1 UART1中断(故障、接收和发送) INT_SPI0 SPI0中断 INT_SDI SDI中断 ARB3 INT_DMA3 DMA通道3中断 INT_DMA2 DMA通道2中断 INT_DMA1 DMA通道1中断 INT_DMA0 DMA通道0中断 S3C2410A 的中断源
6
INT_LCD LCD中断 ARB3 INT_UART2 UART2中断(故障、接收和发送) ARB2 INT_TIMER4 定时器4中断 INT_TIMERS 定时器3中断 INT_TIMER2 定时器2中断 INT_TIMER1 定时器1中断 INT_TIMER0 定时器0中断 INT_WDT 看门狗定时器中断 ARB1 INT_TICK RTC时钟滴答中断 nBATT_FLT 电源故障中断 保留 EINT8_23 外部中断8~23 EINT4_7 外部中断4~7 EINT3 外部中断3 ARB0 EINT2 外部中断2 EINTI 外部中断1 EINT0 外部中断0
7
S3c2410的仲裁器
8
S3C2410A的中断控制器 寄存器 地址 R/W 描述 复位值 SRCPND 0X4A000000
中断源挂起寄存器,为0时,无中断请求;当有中断产生,相应位置1。 0x INTMOD 0X4A000004 中断模式寄存器:0=IRQ模式,1=FIQ模式。 INTMSK 0X4A000008 中断屏蔽寄存器:0=允许中断,1=屏蔽中断。 0xFFFFFFFF
9
PRIORITY 0x4A00000C R/W IRQ中断优先级控制寄存器 0x7F INTPND 0X4A000010 中断状态指示寄存器:0=该中断没有请求,1=该中断源发出中断请求 0x INTOFFSET 0X4A000014 R 中断偏移寄存器,指示IRQ中断源 SUBSRCPND 0X4A000018 子中断源状态寄存器,指示中断请求的状态。 0=该中断没有请求,1=该中断源发出中断请求 INTSUBMSK 0X4A00001C 定义哪几个中断源屏蔽。 0=中断服务允许,1=中断服务屏蔽 0x7FF
10
S3C2410A的中断控制编程 中断控制器SFR列表 SUBSRCPND INTSUBMSK SRCPND INTMSK INTMOD
鲁东大学 LUDONG UNIVERSITY 中断控制器SFR列表 子中断源挂起(标志)寄存器 子中断源屏蔽寄存器 SUBSRCPND 中断源挂起(标志)寄存器 INTSUBMSK 中断源屏蔽寄存器 中断源模式寄存器 SRCPND 优先级方式寄存器 INTMSK (胜出)中断挂起寄存器 (胜出)中断偏移量寄存器 INTMOD INTPND 判优逻辑 PRIORITY INTOFFSET
11
S3C2410A的中断控制编程 中断初始化 堆栈配置 打开中断源的屏蔽位 清除SRCPND和INTPND 开中断 中断服务程序
鲁东大学 LUDONG UNIVERSITY 中断初始化 堆栈配置 打开中断源的屏蔽位 清除SRCPND和INTPND 开中断 中断服务程序 要点:手动清除SRCPND和INTPND 向量装载 将中断服务程序的入口地址装入用户自定义向量表
12
S3C2410A的中断控制编程 怎样找到用户自定义的中断服务程序? B ResetHandler 复位异常服务入口
鲁东大学 LUDONG UNIVERSITY 怎样找到用户自定义的中断服务程序? SDRAM ROM 硬件异常向量表 用户自定义向量表 _ISR_STARTADDRESS 0x0000_0000 B ResetHandler 复位异常服务入口 HandleReset B HandlerUndef HandleUndef 未定义异常入口 B HandlerSWI … HandleEINT0 B HandlerPabort EINT0服务入口 IsrIRQ: IRQ异常处理程序 B HandlerDabort EINT1服务入口 B . EINT2服务入口 0x0000_0014 B HandlerIRQ … B HandlerFIQ HandleADC INT_ADC服务入口
13
S3C2410A的中断控制举例 通过定时器1控制一个led灯每1秒钟改变一次状态,需要完成的主要 工作如下。
(1)对定时器1初始化,并设定定时器的中断时间为1,具体代码参 见Timed init( )函数。 void Timerl_init(void){ rGPBCON = rGPBCON&0xfffffffc&0x ; rGPBDAT= rGPBDAT |0x001; rTCFG0 = 255; rTCFG1 = 0<<4; rTCNTB1 = 48828; //在pclk = 50MHz下 ,1s的记数值rTCNTB1 = /4/256=48828; rTCMPB1 = 0x00; rTCON = (1+11) | (1<<9) | (0<<8);//禁用定时器1,手 动加载 rTCON = (1+11) | (0<<9) | (1<<8);//启动定时器1,自 动装载 }
14
S3C2410A的中断控制举例 (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); //开中断;
15
(3)根据设置的定时时间,产生定时器中断。中断发生后,首先进行现场保护,然后转人中断的入口代码处执行。该部分代码通常使用汇编语言编写。在执行中断服务程序之前,要确保HandleIRQ地址处保存中断分发程序IsrIRQ的入口地址,代码如下。 ldr r0,= HandleIRQ ldr r1,= IsrIRQ str r1,[r0〕 接下来将执行IsrIRQ中断分发程序,具体代码如下。 IsrIRQ sub sp,sp,#4; //为保存PC预留堆栈空间 stmfd sp!,{r8-r9} ldr r9,= INTOFFSET ldr r9,[r9]; //加载INTOFFSET寄存器值到r9 ldr r8,=HandleEINT0; //加载中断向量表的基地址到r8 add r8,r8,r9,lsl #2; //获得中断向量 ldr r8, [r8]; //加载中断服务程序的入口地址到r8 str r8,[sp,#8]; //保存sp,将其作为新的pc值 ldmfd sp!,(r8-r9,pc}; //跳转到新的pc处执行,即跳转到中断服务子程序执行
16
(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;
Similar presentations