微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440中断控制器

S3C2440中断控制器

时间:11-21 来源:互联网 点击:
S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、

UART、IIC等等。在这些中断源中,UARTn、AC97 和EINTn中断对于中断控制器而言是“或”关系。
当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ
或IRQ。

中断控制器所用到的专业寄存器,其详细的使用请看数据手册

SRCPND 中断标志(挂起)寄存器

写1时 对应位中断源有中断请求,写0时,对应位中断源无中断请求

INTPND 中断服务(挂起)寄存器

写1时 对应位中断源被响应,写0时,对应位中断源未被响应

。。。。。。。。。

现在主要说下外部中断(其寄存器使用说明在数据手册的输入输出端口章节)

S3C2440有24个外部中断,GPF0--GPF7对应于外部中断EINT0--EINT7,GPG0--GPG15对应于外部中断EINT8--EINT23,支持上升沿、下降沿、高电平、低电平、双边沿触发。

EXTINTn(外部中断控制寄存器)

EINTFLTn(外部中断滤波寄存器)

EINTMASK(外部中断屏蔽寄存器)

EINTPEND(外部中断挂起寄存器)

设置外部中断的一般步骤

1,选择管脚功能为外部中断功能
2,设置触发方式
3,清中断源挂起寄存器,中断服务寄存器(可选,防止原有中断干扰)
4,设置中断模式(IRQ、FRQ, 默认为IRQ)
5,设置中断优先级(可选,一般默认)
6,打开外部中断屏蔽
7,设置中断服务入口程序

外部中断按键按一下进入中断程序对应LED灯闪一下

  1. #include"2440addr.h"
  2. #include"option.h"//这个文件中定义了中断服务程序的起始地址
  3. #defineLED1_ON(rGPBDAT&=~(1<5))
  4. #defineLED1_OFF(rGPBDAT|=(1<5))
  5. #defineLED2_ON(rGPBDAT&=~(1<6))
  6. #defineLED2_OFF(rGPBDAT|=(1<6))
  7. #defineLED3_ON(rGPBDAT&=~(1<7))
  8. #defineLED3_OFF(rGPBDAT|=(1<7))
  9. #defineLED4_ON(rGPBDAT&=~(1<8))
  10. #defineLED4_OFF(rGPBDAT|=(1<8))
  11. voidDelay(void)
  12. {
  13. inti;
  14. for(i=0;i<100000;i++);
  15. }
  16. void__irqIRQ_KEY1(void)
  17. {
  18. rSRCPND|=(1<1);//清除中断标志位
  19. rINTPND|=(1<1);
  20. LED1_ON;
  21. Delay();
  22. LED1_OFF;
  23. }
  24. void__irqIRQ_KEY2(void)
  25. {
  26. rSRCPND|=(1<4);//清除中断标志位
  27. rINTPND|=(1<4);
  28. rEINTPEND|=(1<4);//清除ENIT4的中断标志位
  29. LED2_ON;
  30. Delay();
  31. LED2_OFF;
  32. }
  33. void__irqIRQ_KEY3(void)
  34. {
  35. rSRCPND|=(1<2);//清除中断标志位
  36. rINTPND|=(1<2);
  37. LED3_ON;
  38. Delay();
  39. LED3_OFF;
  40. }
  41. void__irqIRQ_KEY4(void)
  42. {
  43. rSRCPND|=1<0;//清除中断标志位
  44. rINTPND|=1<0;
  45. LED4_ON;
  46. Delay();
  47. LED4_OFF;
  48. }
  49. voidEint_Init(void)
  50. {
  51. rGPFCON&=~(0x33f);
  52. rGPFCON|=0x22a;//设置GPF0、1、2、4为中断输入功能
  53. rEXTINT0=0x20222;//ENIT0、1、2、4下降沿触发中断
  54. rSRCPND=0x17;//清除ENIT0、1、2、4的中断标志位
  55. rINTPND=0x17;//清除ENIT0、1、2、4的中断标志位
  56. rEINTPEND=(1<4);//清除ENIT4的中断标志位
  57. rINTMOD=0x0;//所有中断为IRQ中断
  58. rINTMSK&=~0x17;//ENIT0、1、2、4中断服务有效(这里就是使能外部中断)
  59. rEINTMASK&=~(1<4);//EINT4中断服务有效
  60. pISR_EINT0=(unsigned)IRQ_KEY4;//设置各中断服务子程序地址
  61. pISR_EINT1=(unsigned)IRQ_KEY1;
  62. pISR_EINT2=(unsigned)IRQ_KEY3;
  63. pISR_EINT4_7=(unsigned)IRQ_KEY2;
  64. }
  65. voidMain(void)
  66. {
  67. rGPBCON&=~((3<10)|(3<12)|(3<14)|(3<16));//对GPBCON[10:17]清零
  68. rGPBCON|=((1<10)|(1<12)|(1<14)|(1<16));//设置GPB5~8为输出
  69. rGPBUP&=~((1<5)|(1<6)|(1<7)|(1<8));//设置GPB5~8的上拉功能
  70. rGPBDAT|=(1<5)|(1<6)|(1<7)|(1<8);//关闭LED
  71. Eint_Init();
  72. while(1);
  73. }


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top