S3C2440 中断解析(各个中断相关寄存器分析)

发布者:zonheny最新更新时间:2022-10-25 来源: csdn关键字:S3C2440  中断  寄存器 手机看文章 扫描二维码
随时随地手机看文章

S3C2440外部中断操作

这两天在调试2440外部中断的时候,通过jlink来调试,老是进不了中断。

因为借鉴了网上很多程序,感觉不应该是程序的问题。后来通过USB口,利用

supervivi的download&run功能,把编译产生的bin文件下载到内存中。超级终

端就提示:Dummy_isr error, interrupt number: 5, INTMSK = 0xffff16ff已是网上查

了这个错误。才知道是什么原因。因为SDRAM的起始地址为0x30000000,把

程序烧写进SDRAM,起始地址不为0而不程序中断后,PC默认指向0x00-0x1C,

内部SRAM的地址0处都不存在你要调试的程序的中断向量表,所以不能正确

将中断引导到你编写的中断服务程序中来,一旦中断发生,程序必然会跑飞。

同时ARM内核会通过串口打印"Dummy_isr error........"信息。


解决办法:

(1)直接烧写到nand第0块(如果代码大于4K,启动代码中必须要有拷贝到SDRAM功能)

(2)改 写 自 己 的 程 序 , 在 初 始 化 中 断 之 前 将 中 断 向 量 表 拷 贝 到 内 部S8/31/2010RAM.

(3)利用MMU的重定向功能


首先,这里先来了解下S3C2440中断相关的寄存器


1.中断分两大类:内部中断和外部中断。


2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15

(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要

上拉。具体参考datesheet数据手册。


寄存器:

EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。

EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。

EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。


为什么没有EINT0-EINT3,呵呵,看看SRCPND就知道了,里面没有EINT4-EINT23的位子,所以有了EINTPEND。


EINTMASK:这个简单,是屏蔽中断用的,也就是说位为1时,此次中断无效。


3.内部中断。内部中断有8个寄存器,下面逐一来看。

寄存器:SUBSRCPND:当一个中断发生后,那么相应的位会被置1,表示一个中断发生了。


INTSUBMSK:与上一个是一伙的,中断屏蔽寄存器,具体屏蔽什么,自己看手册去吧。


INTMOD:中断的方式。一个中断可以是普通中断,也可以是快中断,在这里设置,但只能有一个快中断。


PRIORITY:优先级寄存器,不说了。


SRCPND:当一个中断发生后,那么相应的位会被置1,表示一个或一类中断发生了。


INTMSK:中断屏蔽寄存器。


INTPND:中断发生后,SRCPND中会有位置1,可能好几个(因为同时可能发生几个中断),这些中断会由优先级仲裁器选出一个最紧迫的,然后


吧把INTPND中相应位置1,所以同一时间只有一位是1。也就是说前面的寄存

器置1是表示发生了,只有INTPND置1,CPU才会处理。


INTOFFSET:用来表示INTPND中哪一位置1了,好让你查询,普通中断跳转时查询用。清除INTPND、SRCPND时自动清除。


4.各寄存器关系:

 

下面看图说明:

5.中断过程。

a如果是不带子中断的内部中断:发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理。


b如果是带子中断的内部中断:发生后SUBSRCPND相应位置1,如果没有被INTSUBMSK屏蔽,那么SRCPND相应位置1,等待进一步处理,几个SUBSRCPND可能对应同一个SRCPND,对应表如下:


SRCPND                        SUBSRCPND

INT_UART0                     INT_RXD0,INT_TXD0,INT_ERR0

INT_UART1                     INT_RXD1,INT_TXD1,INT_ERR1

INT_UART2                     INT_RXD2,INT_TXD2,INT_ERR2

INT_ADC                        INT_ADC_S, INT_TC

INT_CAM                        INT_CAM_C, INT_CAM_P

INT_WDT_AC97             INT_WDT, INT_AC97

 

3

c如果是外部中断:EINT0-EINT3发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理。EINT4-EINT23发生后EINTPEND相应位置1,如果没有被EINTMASK屏蔽,那么SRCPND相应位EINT4-7或EINT8-23置1,如果没有被INTMSK屏蔽,等待进一步处理,几个EINTPEND对应同一个SRCPND,对应表如下:


SRCPND                         EINTPEND

EINT0                             EINT0

EINT1                             EINT1

EINT2                             EINT2

EINT3                             EINT3

EINT4-7                           EINT4-EINT4

EINT8-23                        EINT8-EINT23


三种中断都等待进一步处理了。接下来从SRCPND往下看,看INTMSK。如果中断被屏蔽了,就不用说了(注意:快中断也能被屏蔽)。如果没有被屏蔽,那么会进一步到INTMOD。如果是快中断,那么直接出来,进入FIQ(即CPU进入快中断模式处理)。如果是普通中断,那么SRCPND可以有多为置1(FIQ只能有一个),这时就会经过PRIORITY选出一个优先级高的,然后把根据选出的中断把INTPND相应位置1(注意:只能选出一个),进入IRQ,让CPU处理

 

6.中断的开启。

 

a.如果是不带子中断的内部中断,只需设置INTMSK,让它不屏蔽中断就可以了。

b如果是带子中断的内部中断,需设置INTSUBMSK和INTMSK,让它门不屏蔽中断就可以了。c如果是外部中断,对于EINT8-23需要设置EINTMASK和INTMSK。对于EINT0-EINT3只需设置INTMSK。

 

7.中断的清除。

 

a.如果是不带子中断的内部中断,只需清除SRCPND,注意清除需位置1。

b如果是带子中断的内部中断,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因为,如果你先清除SRCPND的话,然后在清除SUBSRCPND的过程中,SRCPND会以为又有中断发生,又会置1。也就是说一次中断会响应两次。所以必须先掐断源头。

 

c如果是外部中断,对于EINT8-23需要清除EINTPEND和SRCPND(同样注意顺序)。对于EINT0-EINT3只需清除SRCPND。

 

当然这些寄存器,更具体的介绍请看S3C2440的datasheet- -。

介绍了这么多,下面来点实战的吧。又是贴代码,呜呜~其实不然,如果你能把别人的代码

变成自己的,那就是学会了,而且借鉴别人的代码来学,这样学会快很多。(纯属个人观点)


在这里采用了第1种方法,而且这里的代码量小于4k,这里就没有涉及到拷贝功能。关于MMU功能和拷贝功能,后面我会补上,因为现在还没有学到那~

 

/*

文件:main.c

功能:按下KEY1~KEY4按键时,对应的LED改变状态。按下KEY5/KEY6

时LED分别全亮和全暗

 

下面是mini2440的按键的接口:

 

*/

/*

文件:main.c

功能:按下KEY1~KEY4按键时,对应的LED改变状态。按下KEY5/KEY6

LED分别全亮和全暗

*/

#include "def.h"

#include "option.h"

#include "2440addr.h"     

#include "2440lib.h"

#include "2440slib.h" 

 /*

-------------------------------------------------------------

按键    |     对应的GPGx   |  对应的EINTx   |  对应的EINTPEND值

-------------------------------------------------------------

K1    |      GPG0          |      EINT8         |     0x100

K2    |      GPG3          |      EINT11        |     0x800

K3    |      GPG5          |      EINT13        |     0x2000

K4    |      GPG6          |      EINT14        |     0x4000

K5    |      GPG7          |      EINT15        |     0x8000

K6    |      GPG11         |      EINT19        |     0x80000

-------------------------------------------------------------

*/      

//================================

#define LED_ON() (rGPBDAT &= ~(0xf<<5))

#define LED1_ON() (rGPBDAT &= ~(0x1<<5))

#define LED2_ON() (rGPBDAT &= ~(0x1<<6))

#define LED3_ON() (rGPBDAT &= ~(0x1<<7))

#define LED4_ON() (rGPBDAT &= ~(0x1<<8))

#define LED_OFF() (rGPBDAT |= (0xf<<5))

#define LED1_OFF() (rGPBDAT |= (0x1<<5))

#define LED2_OFF() (rGPBDAT |= (0x1<<6))

#define LED3_OFF() (rGPBDAT |= (0x1<<7))

#define LED4_OFF() (rGPBDAT |= (0x1<<8))

//------延迟函数----

void dely(U32 tt)

{

      U32 i;

   for(;tt>0;tt--)

      {

     for(i=0;i<10000;i++){}

      }

}

//-----IO口初始化--------

void GPIO_Init(void)

{

 rGPGCON=0x80A882;//按键对应

//GPG0/GPG3/GPG5/GPG6/GPG7/GPG11

  //rGPGUP = 0x0;

  rGPBCON = 0x155555;//LED对应GPB5/GPB6/GPB7/GPB8,设为输出

  //rGPBUP = 0x1E0;

}

//-------key中断服务-------

static void __irq EINT_KEY(void)

{

 //清中断,向对应位写1可清0。

 U32 a,b,c;

  a = rSRCPND;

  rSRCPND = a;

  b = rINTPND;

  rINTPND = b;

  c = rEINTPEND;

  rEINTPEND = c;

 //判断那个按键被按下,控制对应的LED状态

 switch(c)

 {

  case 0x100:

                  if(rGPBDAT & 0x20)

               LED1_ON();

                  else

               LED1_OFF();

                  break;

  case 0x800:

                  if(rGPBDAT & 0x40)

               LED2_ON();

                  else

               LED2_OFF();

                  break;

  case 0x2000:

                  if(rGPBDAT & 0x80)

               LED3_ON();

[1] [2]
关键字:S3C2440  中断  寄存器 引用地址:S3C2440 中断解析(各个中断相关寄存器分析)

上一篇:在TQ2440实验板上进行linux+qtopia++ov9650+opencv的图像处理系统
下一篇:S3C2440——键盘中断服务程序

推荐阅读最新更新时间:2024-10-22 23:46

S3C2440 中断相关寄存器小探
肯定有的朋友和我一样,对2440里面的中断寄存器迷惑,屡不清脉络。结合网上资料和自己的琢磨,我大概搞清楚了。先上图,以飨读者。 1. 中断分为两大类 (1)外部中断 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。这些中断对应的是片子上的引脚,用的时候,需要把引脚配置为中断模式,并且不要上拉。他们的触发方式由寄存器EXTINT0-EXTINT2设置(比如上升沿,下降沿等)。 EINTPEND:这个是中断挂起寄存器,清除时要写1。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。 EINTMASK:这个是屏蔽中断用的,尽管 EINTP
[单片机]
<font color='red'>S3C2440</font> <font color='red'>中断</font>相关<font color='red'>寄存器</font>小探
S3C2440中断寄存器的分类及中断的过程分析
S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND,而EINT8~23对应的也是SRCPND一位。 1 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体可参考datesheet数据手册。 寄存器: EXTINT0-EXTINT2:分别设置EINT0—EINT7、E
[单片机]
<font color='red'>S3C2440</font>的<font color='red'>中断</font><font color='red'>寄存器</font>的分类及<font color='red'>中断</font>的过程分析
S3C2440 中断解析(各个中断相关寄存器分析)
S3C2440外部中断操作 这两天在调试2440外部中断的时候,通过jlink来调试,老是进不了中断。 因为借鉴了网上很多程序,感觉不应该是程序的问题。后来通过USB口,利用 supervivi的download&run功能,把编译产生的bin文件下载到内存中。超级终 端就提示:Dummy_isr error, interrupt number: 5, INTMSK = 0xffff16ff已是网上查 了这个错误。才知道是什么原因。因为SDRAM的起始地址为0x30000000,把 程序烧写进SDRAM,起始地址不为0而不程序中断后,PC默认指向0x00-0x1C, 内部SRAM的地址0处都不存在你要调试的程序的中断向量表,所以不
[单片机]
<font color='red'>S3C2440</font> <font color='red'>中断</font>解析(各个<font color='red'>中断</font>相关<font color='red'>寄存器</font>分析)
S3C2440 中断控制寄存器
1、 SUBSRCPND 寄存器(SUB SOURCE PENDING) SUBSRCPND 寄存器被用来标识 INT_RXD0、INT_TXD0 等中断(S3C2410中这类中断有 11 个,而 S3C2440 中有 15 个)是否已经发生,每位对应一个中断。当这些中断发生并且没有被 INTSUBMSK 寄存器屏蔽,则它们中的若干位将“汇集”出现在 SRCPND 寄存器的一位上。比如 SUBSRCPND 寄存器中的 3 个中断 INT_RXD0、INT_TXD0、INT_ERR0,只要有一个发生了并且它没有被屏蔽,则 SRCPND 寄存器中的 INT_UART0 位被置 1。 要清楚中断时,往 SUBSRCPND 寄存器中某
[单片机]
<font color='red'>S3C2440</font> <font color='red'>中断</font>控制<font color='red'>寄存器</font>
S3C2440裸机------异常与中断__CPU的工作模式和状态以及寄存器
1.CPU工作模式(Mode) ARM CPU有七种模式,各种模式如下图所示。注意用户模式下不可进入其他模式,用户模式是在有操作系统的时候给应用程序使用的,写应用程序的人水平千差万别,不能保证写的程序是好是坏,所以让应用程序运行在用户模式,限制应用程序的权限,防止破坏整个系统, 2.状态(State) ARM架构的CPU有ARM state和Thumb state, ARM State:用的是ARM指令集,每个指令占据4 byte, Thumb State:用的是Thumb指令集,每个指令2 byte. 比如对于同样的一条指令,MOV R0,R1 对于ARM指令集就要占据四个字节,对于Thumb指令集占据两个字节
[单片机]
<font color='red'>S3C2440</font>裸机------异常与<font color='red'>中断</font>__CPU的工作模式和状态以及<font color='red'>寄存器</font>
S3C2440中断寄存器有关
1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器: EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EINT0-EINT3,呵呵,看看SRCPND就知道
[单片机]
<font color='red'>S3C2440</font><font color='red'>中断</font><font color='red'>寄存器</font>有关
S3C2440外部中断响应寄存器设置方法
如果不按照如下设置,中断将无法执行或者无法使下一个中断进入。 /*中断挂起设置,此过程加入到主函数中启动时加载*/ void Eint_wait() { rSRCPND=rSRCPND; //中断挂起寄存器清除 rINTPND=rINTPND; //中断源挂起寄存器清除 rEINTPEND|=0x1 13; //外部中断挂起寄存器,Eint挂起等待中断 rSRCPND=BIT_EINT8_23; //中断源挂起寄存器相应位置1等待中断 rINTPND=BIT_EINT8_23; //中断挂起寄存器相应位置1等待中断 } /*中断挂起设置结束*/ /*以下为响应中断时的处理过程,为pISR指针中的函数*/
[单片机]
S3C2440中断寄存器
S3C2440的中断寄存器: 1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EINT0-EINT3,呵呵,看
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved