S3C2440之中断操作(MDK4.22)

原创 2011年11月26日 15:09:09

背景知识:

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代码

  1. #include "S3C2440.h"  
  2. #include "int.h"  
  3.   
  4.   
  5. void init_irq(void)  
  6. {  
  7.   
  8.     pHandleEINT0     = EINT0_Handle;  
  9.     pHandleEINT1     = EINT1_Handle;  
  10.     pHandleEINT2     = EINT2_Handle;  
  11.     pHandleEINT4_7   = EINT4_7_Handle;  
  12.   
  13.   
  14.   
  15.     rEINTMASK &= (~(1<<4));    
  16.     rPRIORITY = (rPRIORITY & (~(0x01))) | (0x01<<7);  
  17.   
  18.     rINTMSK &= (~(1<<0)) & (~(1<<1)) & (~(1<<2)) & (~(1<<4));  
  19. }  
  20.   
  21. void __irq EINT0_Handle(void)  
  22. {  
  23.     rSRCPND = 1<<0;  
  24.     rINTPND = 1<<0;  
  25.   
  26.     rGPBDAT |= (0x0f<<5);  
  27.     rGPBDAT &= ~(1<<8);  
  28. }  
  29.   
  30. void __irq EINT1_Handle(void)  
  31. {  
  32.     rSRCPND = 1<<1;  
  33.     rINTPND = 1<<1;  
  34.   
  35.     rGPBDAT |= (0x0f<<5);  
  36.     rGPBDAT &= ~(1<<5);  
  37. }  
  38.   
  39. void __irq EINT2_Handle(void)  
  40. {  
  41.     rSRCPND = 1<<2;  
  42.     rINTPND = 1<<2;  
  43.   
  44.     rGPBDAT |= (0x0f<<5);  
  45.     rGPBDAT &= ~(1<<7);  
  46. }  
  47.   
  48. void __irq EINT4_7_Handle(void)  
  49. {  
  50.     rEINTPEND = (1<<4);  
  51.     rSRCPND = 1<<4;  
  52.     rINTPND = 1<<4;  
  53.   
  54.     rGPBDAT |= (0x0f<<5);  
  55.     rGPBDAT &= ~(1<<6);  
  56. }  

主程序:

  1. #include "S3C2440.h"  
  2. #include "int.h"  
  3.   
  4.   
  5. int main(void)  
  6. {     
  7.     rGPBDAT |= (0xf<<5);  
  8.   
  9.     init_irq();  
  10.       
  11.     while(1);  
  12. }  

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


s3c2440中断体系

int main() { while(1); return 0; }
  • hongwazi_2010
  • hongwazi_2010
  • 2013年07月05日 16:43
  • 1347

S3C2440 外部按键中断解析

学习bootloader制作的过程中,学到 “通过按键进入中断控制LED亮灭”的实验时,自己所用的开发板和视频讲解中的不同,于是琢磨了一下中断涉及到的各个寄存器,并进行编码尝试,最终完成了实验,达到了...
  • LNF_2373837248
  • LNF_2373837248
  • 2015年12月07日 08:18
  • 989

S3C2440中断学习

一.ARM中断体系 当一个“异常”发生时,或者说当收到一个中断触发信号时,ARM9将会自动完成如下一些工作: (1)       在异常工作模式的连接寄存器R14中保存前一个工作模式的下一...
  • u011308691
  • u011308691
  • 2013年11月17日 10:42
  • 1222

s3c2440外部中断

s3c2440 外部中断原理,编程控制按键
  • XscKernel
  • XscKernel
  • 2014年08月22日 10:12
  • 2862

S3C2440中断体系结构:外部中断实验

转自:http://blog.chinaunix.net/uid-22182617-id-399397.html 1 SUBSRCPND和SRCPND表明有哪些中断被触发了     INTSU...
  • hannibaychty
  • hannibaychty
  • 2015年03月30日 22:24
  • 337

TQ2440裸机中断(外部中断)

1. 关于中断 1.所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的中断程序中去,服务完毕...
  • forsakening
  • forsakening
  • 2013年05月31日 14:51
  • 1266

S3c2440中断学习

中断功能在单片机上一直在用,今天学习在2440上用外部中断的方式,实现按键检测功能。 1. 中断生命周期:中断源,中断过滤,中断处理 1.1 中断源:2440有60个中断源。 ...
  • u012582664
  • u012582664
  • 2016年06月24日 16:06
  • 173

一起学mini2440裸机开发(十)--mini2440外部中断实验

我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表,...
  • mybelief321
  • mybelief321
  • 2013年05月26日 21:18
  • 3154

S3C2440按键驱动之中断法

上一篇博客实现了一个S3C2440的按键驱动 但是采用查询法实现,基本占尽了CPU资源,现在写一个改进型驱动,采用中断方式。 在上一篇基础上,我们要将按键对应的几个引脚设为中断引脚,多个引脚共享一个...
  • cumtgao
  • cumtgao
  • 2013年03月18日 17:58
  • 2271

s3c2440外部中断操作

要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。     在具体执行中断之前,要初始化好要用的中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想...
  • hannibaychty
  • hannibaychty
  • 2015年04月04日 15:33
  • 326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:S3C2440之中断操作(MDK4.22)
举报原因:
原因补充:

(最多只允许输入30个字)