新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > S3C2440之中断操作(MDK4.22)

S3C2440之中断操作(MDK4.22)

作者:时间:2016-11-19来源:网络收藏
背景知识:

2440中断控制器接收60个中断源。

本文引用地址:http://www.eepw.com.cn/article/201611/318143.htm

中断被分为多种类别,此处为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代码

view plain
  1. #include"S3C2440.h"
  2. #include"int.h"
  3. voidinit_irq(void)
  4. {
  5. pHandleEINT0=EINT0_Handle;
  6. pHandleEINT1=EINT1_Handle;
  7. pHandleEINT2=EINT2_Handle;
  8. pHandleEINT4_7=EINT4_7_Handle;
  9. rEINTMASK&=(~(1<<4));
  10. rPRIORITY=(rPRIORITY&(~(0x01)))|(0x01<<7);
  11. rINTMSK&=(~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4));
  12. }
  13. void__irqEINT0_Handle(void)
  14. {
  15. rSRCPND=1<<0;
  16. rINTPND=1<<0;
  17. rGPBDAT|=(0x0f<<5);
  18. rGPBDAT&=~(1<<8);
  19. }
  20. void__irqEINT1_Handle(void)
  21. {
  22. rSRCPND=1<<1;
  23. rINTPND=1<<1;
  24. rGPBDAT|=(0x0f<<5);
  25. rGPBDAT&=~(1<<5);
  26. }
  27. void__irqEINT2_Handle(void)
  28. {
  29. rSRCPND=1<<2;
  30. rINTPND=1<<2;
  31. rGPBDAT|=(0x0f<<5);
  32. rGPBDAT&=~(1<<7);
  33. }
  34. void__irqEINT4_7_Handle(void)
  35. {
  36. rEINTPEND=(1<<4);
  37. rSRCPND=1<<4;
  38. rINTPND=1<<4;
  39. rGPBDAT|=(0x0f<<5);
  40. rGPBDAT&=~(1<<6);
  41. }

主程序:

view plain
  1. #include"S3C2440.h"
  2. #include"int.h"
  3. intmain(void)
  4. {
  5. rGPBDAT|=(0xf<<5);
  6. init_irq();
  7. while(1);
  8. }

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



评论


相关推荐

技术专区

关闭