当前位置:
文档之家› 嵌入式系统实训报告-外部中断
嵌入式系统实训报告-外部中断
rEXTINT0 = (rEXTINT0 & ~(7<<4))|(0x2<<4); //EINT1=Low level triggered rEXTINT0 = (rEXTINT0 & ~(7<<8))|(0x2<<8); //EINT2=falling edge triggered rEXTINT0 = (rEXTINT0 & ~(7<<12))|(0x2<<12); //EINT3=falling edge triggered rEXTINT0 = (rEXTINT0 & ~(7<<16))|(0x2<<16); //EINT4=falling edge triggered rEXTINT0 = (rEXTINT0 & ~(7<<20))|(0x2<<20); //EINT5=falling edge triggered rEXTINT0 = (rEXTINT0 & ~(7<<28))|(0x2<<28); //EINT7=falling edge triggered
ClearPending(BIT_EINT2); Uart_Printf("EINT2 is occurred.\n"); rGPBDAT ^= 1<<6; }
static void __irq Eint3_ISR(void) {
ClearPending(BIT_EINT3); Uart_Printf("EINT3 is occurred.\n"); rGPBDAT ^= 1<<7; }
{
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1);
//405MHZ
//Rtc_Init();
//实时时钟初始化
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
七种异常中断
中断过程框图
4.2 异常中断响应过程和返回过程
异常中断的响应过程:
1).保存处理器当前状态寄存器CPSR 的值到备份程序状态寄存器SPSR 中。 2).设置但前程序状态寄存器CPSR 的值,其中包括:设置CPSR 响应位的值,使处理器 进入特定的处理器模式;按要求屏蔽中断,通常应该屏蔽IRQ 中断。在FIQ 中断时屏蔽FIQ 中 断。 3).设置Lr 寄存器。将相应中断模式的Lr 寄存器的值设为异常中断的返回地址。 4).处理程序计数器 PC,将 PC 值设为相应的中断向量的地址,从而实现跳转以执行中 断服务程序。
5、S3C2440A的中断控制器
SRCPND――源中断指示寄存器
SRCPND 寄存器 32 位中的每一位对应着一个中断源,每一位被设置为 1,则相应的中 断源产生中断请求并且等待中断被服务。因此,这个寄存器表明了哪个中断源在等待中断请 求被处理。注意,SRCPND 寄存器的每一位是由中断源自动设置的,而不管INTMSK 寄存 器中的屏蔽位是否置1。另外,SRCPND 寄存器不影响中断控制器的优先级逻辑。
static void __irq Eint4_7_ISR(void) {
if(rEINTPEND & (1<<4)) { Uart_Printf("EINT4 is occurred.\n"); rEINTPEND=(1<<4); ClearPending(BIT_EINT4_7); rGPBDAT ^= 1<<8; } else if(rEINTPEND & (1<<5)) { Uart_Printf("EINT5 is occurred.\n"); rEINTPEND=(1<<5); ClearPending(BIT_EINT4_7); rGPBDAT &= ~(0xf<<5); } else if(rEINTPEND & (1<<7)) { Uart_Printf("EINT7 is occurred.\n"); rEINTPEND=(1<<7); ClearPending(BIT_EINT4_7); rGPBDAT |= (0xf<<5);
在指定中断源的中断服务程序中,SRCPND 寄存器相对应的位必须被清除,这样才可 以正确地响应来自同一中断源的中断请求。如果从 ISR 返回而没有清除相应的位,也就是 SRCPND 寄存器中的对应的位还是1,那么就会一直响应这个中断请求。
SRCPND 中相应的中断标志位清除的时间依赖于用户的需求,如果想要从同一中断源 接收另一次有效的中断请求,你在第一次就应该清除相应的位,并且使能中断。
z 通过外部K1、K2、K3、K4、K5、K7 按键触发外部中断EINT1、EINT2、EINT3、 EINT4、EINT5、EINT7
4、实验原理
4.1 ARM 的异常中断类型
在嵌入式系统中外部设备的功能实现主要是靠中断机制来实现的。中断功能可以解决 CPU 内部运行速度远远快于外部总线速度而产生的等待延时问题。ARM 提供的FIQ 和IRQ 异常中断用于外部设备向CPU 请求中断服务,一般情况下都是采用IRQ 中断。
INTPND――中断请求寄存器 中断请求寄存器32 位中的每一位对应着相应的中断请求,经过优先级逻辑后,INTPND 寄存器只能有一位被设置为1,并且向ARM 产生中断请求。在IRQ 中断服务子程序,能够 读 取这个寄存器的值来决定32 个中断源的那一个中断被服务。 同 SRCPND 寄存器,在中断服务子程序里,这个寄存器的相应位需要被清除。我们可 以 向INTPND 寄存器写一个数据1,来清除寄存器的指定位。
rEINTMASK=~( (1<<4)|(1<<5)|(1<<7) ); rINTMSK=~(BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);
}
7.3 中断主程序
/*********** 主程序 ************/
实训中心制
广东岭南职业技术学院
void xmain(void)
用户可以通过向SRCPND 寄存器的相应位写“1”,这样可以清除该位。 下 表为SRCPND 寄存器的地址和位定义说明
INTMOD――中断模式寄存器 中断模式寄存器(INTMOD)的32 位中的每一位对应一个中断源,当INTMOD 的谋一 位 都设置为1,则ARM 内核将以FIQ 模式响应中断,否则将以IRQ 模式响应中断。INTMOD 寄存 器的定义如下表:
static void __irq Eint1_ISR(void) {
ClearPending(BIT_EINT1); Uart_Printf("EINT1 is occurred.\n"); rGPBDAT ^= 1<<5; }
static void __irq Eint2_ISR(void) {
需要注意的是:对于不同的异常中断,其返回地址的计算方法也是不同的,IRQ 和FIQ 异 常中断产生时,程序计数器PC 已经更新,而SWI 中断和未定义指令中断时由当前指令自 身 产生的,程序计数器PC 尚未更新,所以要计算出下一条指令的地址来执行返回操作;指 令 预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。
S3C2440A 异常中断的响应-返回流程图:
保存状态寄存器CPSR->进入特定模式、屏蔽中断->设置Lr 寄存器->设置程序计数 器PC进入中断向量、异常中断的处理程序->恢复状态寄存器->将返回地址复制到程序计 数器
4.3 异常中断的安装
S3C2440A 系统通过异常向量表安装异常中断处理程序。即将异常向量表指向异常中断处理程 序的入口,实现面向异常中断的跳转,异常向量中断的的入口地址是固定的(0x00-0x1C), 系统运行到满足异常中断时,系统将自动跳入相应的异常中断向量表中,而在异 常向量表中 保存的正是利用跳转指令或LDR 指令指向该中断的异常中断处理程序,这就实 现了异常中断 处理程序的安装。
void INIT_interrupt() {
rGPFCON = (rGPFCON & ~((3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10)|(3<<14)))|(1<<3)|(1<<5)|(1<<7)|(1<<9)|(1<< 11)|(1<<15); //GPF0/2 = EINT0/2
S3C2440A 子中断列表 SUBSRCPND――次级源中断指示寄存器
INTSUBMSK――次级中断屏蔽寄存器
EINTPND――外部中断判断寄存器 EINTPND 用来判断外部的20 个中断源(EINT[23:4]),用户可以通过向EINTPEND 寄 存 器的相应位写“1”,这样可以清除该位。 EINTMASK――外部中断屏蔽寄存器
广东岭南职业技术学院
EXTINTn――外部中断控制寄存器n 外部中断控制寄存器可以控制外部中断信号有效方式,外部中断信号有效方式可以设置为 电 平触发和边沿触发,具体内容见下表。
6、实验电7.1 外部中断服务程序
/*********** 外部中断服务程序 ************/
INTMSK――中断屏蔽寄存器 在INTMSK 寄存器中,32 位依次对应着每个中断源,如果指定的位被设为1,ARM 将
不响应中断源的中断请求(注意,即使在SRCPND 相应的位被置位1 的条件下也不响应)。如 果屏蔽位为0,则中断请求可以被响应。