布景常识:
2440中止控制器接纳60个中止源。
中止被分为多种类别,此处为32类别,正好用32位。
图上能够很好的一共整个中止的流程。有些中止源对应一个中止类别,比方串口中止发送,接纳最终都对应到串口中止。submask屏蔽子类别,未屏蔽的会引起srcpnd相应方位位,假如mask未屏蔽的话,就会紧接着判别优先级,最终导致intpnd置位,然后发生了IRQ,而FIQ不需求优先级判别,会直接发生,由intmod设置。
留意的是:进入ISR后,铲除中止的次序很重要,首要是srcpnd接着是intpnd,假如还需求铲除eintpnd的话,要最早铲除。
试验进程:
编译东西–MDK4.22
硬件图
首要需求装备GPF0/1/2/4的脚为EINT0/1/2/4。
我们用到了外部4-7中止,需求舱位EINTMASK寄存器相应位。设置优先级寄存器,设置INTMSK寄存器。
在2440A.s中现已设置了I F位舱位,能够接纳中止了。
在中止初始化代码里,需求将中止函数的地址安装到中止向量表中。
程序如下:
MDK4.22的发动代码设置
装备了堆,栈,以及中止向量表的地址为0x33ffff20处。装备了B口和F口,B面试LED的灯显现,F口是衔接按键的外部中止。按一个键会亮一个LED。
int.c代码
- #include”S3C2440.h”
- #include”int.h”
- voidinit_irq(void)
- {
- pHandleEINT0=EINT0_Handle;
- pHandleEINT1=EINT1_Handle;
- pHandleEINT2=EINT2_Handle;
- pHandleEINT4_7=EINT4_7_Handle;
- rEINTMASK&=(~(1<<4));
- rPRIORITY=(rPRIORITY&(~(0x01)))|(0x01<<7);
- rINTMSK&=(~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4));
- }
- void__irqEINT0_Handle(void)
- {
- rSRCPND=1<<0;
- rINTPND=1<<0;
- rGPBDAT|=(0x0f<<5);
- rGPBDAT&=~(1<<8);
- }
- void__irqEINT1_Handle(void)
- {
- rSRCPND=1<<1;
- rINTPND=1<<1;
- rGPBDAT|=(0x0f<<5);
- rGPBDAT&=~(1<<5);
- }
- void__irqEINT2_Handle(void)
- {
- rSRCPND=1<<2;
- rINTPND=1<<2;
- rGPBDAT|=(0x0f<<5);
- rGPBDAT&=~(1<<7);
- }
- void__irqEINT4_7_Handle(void)
- {
- rEINTPEND=(1<<4);
- rSRCPND=1<<4;
- rINTPND=1<<4;
- rGPBDAT|=(0x0f<<5);
- rGPBDAT&=~(1<<6);
- }
主程序:
- #include”S3C2440.h”
- #include”int.h”
- intmain(void)
- {
- rGPBDAT|=(0xf<<5);
- init_irq();
- while(1);
- }
scatter文件如下:
LR_ROM1 0x00000000 0x00001000 { ; load region size_region
ER_ROM1 0x00000000 0x000001000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30000000 0x40000000 { ; RW data
.ANY (+RW +ZI)
}
ISR 0x31000000{
int.o(*)
}
HEAP 0x30000800 {
S3C2440A.o(HEAP)
}
STACK 0x30000c00{
S3C2440A.o(STACK)
}
}
验证,能够按一个键亮一个键。
over