主题 : 这个论坛有点冷,转载一个其他文坛的文章 嫌嫌人气! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 13466
精华: 0
发帖: 32
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 64 分
注册时间: 2010-01-25
最后登录: 2014-05-23
楼主  发表于: 2010-02-21 16:12

 这个论坛有点冷,转载一个其他文坛的文章 嫌嫌人气!

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
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。
级别: 新手上路
UID: 13466
精华: 0
发帖: 32
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 64 分
注册时间: 2010-01-25
最后登录: 2014-05-23
1楼  发表于: 2010-02-21 16:19
S3C2440A的中断按制器可接收60个中断源的中断请求。这些中断源由如DMA控制器、UART、IIC以有其他内部外围设备提供。在这些中断源中,UARTn、AC97和EINTn中断与中断控制器相与。

当接收到从内部外设和外部中断请求引脚的多个中断请求时,中断控制器会在中断裁决流程之后申请ARM920T核的FIQ或IRQ中断。

中断裁决流程取决于硬件优先逻辑,并且裁决结果会被写入中断持起寄存器,它帮助用户知道是在众多中断源中,是哪个源产生了中断。
唉,刚刚又写了很多,但是后来理解了全部,发现没有用。重新来过。这个帖子原来是想讲一部分来着,后来搞懂了,改名为一帖OK!我希望我真的能用一帖,给大家讲懂。我学习时没人教,你有伟东山的书,走了很多弯路,但毕竟走过来了。搞明白了,很快乐。给大家讲讲。

s3c2440a的中断系统号称有60个中断。
我还没来得及数是不是真有那么多。一会再算吧。但是它有32个一级中断,或是标准中断。(都是我自己乱取的名)另外28个则要成为某些一级中断的子中断。很迷糊是吧,中断还分父子?是这样的,且听我慢慢道来。。。。
从我的记忆中我记得一级中断有一个叫UART0的中断。什么意思?串口0啊!它下面就有三个子中断。分别为RXD0,TXD0,ERR0.想必大家理解了吧!串口还分发送中断,接收中断和错误中断。发送完了,告诉cpu一下,得中断。接收了,也告诉一下,也中断。这父父子子的怎么弄啊?
请看图:

如图,大家看到了吧。有两组request sources,第一组是有子中断的一级中断。第一组是没有子中断的一级中断。
我们先说有子中断的一级中断,就以UART0为例,其下级子中断为RXD0,TXD0,ERRO.
我们有一个寄存器,看图,就是上图第一个叫:SUBSRCPND.即子中断源待决寄存器。就是说有子中断源产生中断等着cpu处里的意思。这是一个32位寄存器,其中一些位代表着一些子中断源。比如说它的第0个bit代表RXD0,第1个 bit代表TXD0,第2个bit代表ERR0.
这样假如说串口0接收到了数据。产生了RXD0中断。就会把SUBSRCPND寄存器中代表RXD0的相应位,也就是bit0置为1.
然后我们再去看看这个寄存器下一个寄存器,就是图中像右看第二个:SUBMASK.这个寄存器相应位代表内容与SUBSRCPND代表的内容是一样的。也就是说它的bit0,bit1,bit2也依次代表RXD0,TXD0,ERR0中断。这个东西就像一个遮光板,把相应位挡住了。下一个寄存器是SRCPND啊,它功能与 SUBSRCPND一样的,但相应位代表的内容不一样,都是代表一级中断的嘛。共32个啊!这里面有一个位(不知是什么,假设是bit0吧)代表着上面讲到三个中断的父中断:UART0.这个父中断很关心他的儿子啊!天天看,天天看,就看儿子有没有中断的,也就是看SUBSRCPND中的 bit0,bit1,bit2有没有是1的。有一个是1的,它就是1.有一个儿子中断了,他就自豪地对下一级寄存器说我中断了啊!!!但是中间有个遮光板 SUBMASK,比如说它的bit1是1吧!那就像是给SUBSRCPND寄存器中bit1这个房间的窗子挡住了。其中的TXD0中断没中断,UART0 也看不到了。所以就不管了。无论TXD0有没有中断,UART0都不中断。但我们假设的是RXD0中断了啊,收到数据了啊,所以在SRCPND公寓里 bit0号屋子里的UART0看到儿子RXD0中断了很高兴,也给自己换了件衣服,就是把自己写为1.
在看下面,下面是没有子中断源的,也就是说没有儿子的,住SRCPND公寓中XXX号房间的WDT先生无有子女,他与他的看门狗一起相依为命好多年了。
WDT只看他自己有没有中断,中断了就换衣服,即把自己写成1。
注意:我们这里一切0都代表透明,下一级看到见,一切1都代表不透明,下一级看不到啊!
下一级有一个遮光板,一个峰火台。遮光板MASK,比如说这个遮光板中bit0遮住了。 bitXXX也就是有看门狗的WDT先生那里没有遮住。还有一个王阿姨家的窗子也没设遮光板,而且王阿姨也中断了。这样一下级PRIORITY发现中断的有两个WDT先生和王阿姨,而UART0先生被可怜地挡住了。PRITITY跟WDT先生是亲戚,而上面只有一个名额。所以王阿姨被淘汰掉了。事情还会有转机吗?会有吗?
答案是肯定的。下面请出本案一位重量级人物。INTMODE.INTMODE先生就是手捧金翦的八贤王,他上打晕君,下打奸臣,让我们对他表示敬意!
八贤王也只有一把宝翦。只能用来维护一个人,如果他选择了其它人,而不是王阿姨,PRIORITY就会把结果报告给INTPND.INTPND会在bitxxx屋子里点燃烽火,皇宫卫士会告诉皇上,有一个IRQ中断。
然而幸运的是,八贤王INTMODE选择WDT先生的。把宝器放在了WDT先生的相同号码的屋子里。因而事情有了转机,皇宫出现了一个FIQ中断。

我讲完了,我明白了,你们呢?是不是都糊涂了?
级别: 新手上路
UID: 13466
精华: 0
发帖: 32
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 64 分
注册时间: 2010-01-25
最后登录: 2014-05-23
2楼  发表于: 2010-02-21 16:27

 Re:这个论坛有点冷,转载一个其他文坛的文章 嫌嫌人气!(转)

原理:
CPU在正常執行工作時,由CPU內部或外部產生例外的request,要求 CPU suspend working job,做些必要的處理,以滿足各種預料外的狀況。

種類:
有兩種 硬體中斷 and 軟體中斷
硬體中斷:
硬體 能夠利用CPU的 interrupt request signal 來通知CPU中斷
軟體中斷:
CPU自己發出

處理interrupt原則
1.當下 CPU狀態記錄下來
2.跳到中斷處理程式做中斷處理


S3C2440 user manual第十四章有提及 interrupt controller
1. 提供60個 interrupt sources, including DMA controller, UART, IIC, USB host and device, RTC(INT_TICK:RTC Time tick interrupt)[INT_RTC:RTC alarm interrupt].
2.interrupt request分兩種 FIQ(fast interrupt request) and IRQ(normal interrupt request)
3.CPU會根據硬體優先權 把結果寫到 interrupt pending register (紀錄哪個中斷產生)
,S3C2440A有兩個 interrupt pending registers: source pending register (SRCPND) and interrupt pending register(INTPND) 負責紀錄哪個中斷需要產生
如果要中斷來源要產生中斷,相對應SRCPND = 1 and INTPND = 1
4. interrupt mask register 負責作遮罩 讓某個中斷disable


INTERRUPT PRIORITY GENERATRING BLOCK
有32個 interrupt requests
先由6個 arbiter(仲裁者)x
決定誰的中斷可以採納 轉成 req0~5
最後交給第7個中斷來決定

arbiter
每個仲裁者 有one bit arbiter mode control(ARB_MODE) and two bits of selection control signals(ARB_SEL)
ARB_MODE 則負責啟動or 關閉 the function - 調整優先權
ARB_SEL 調整 interrupt 優先權順序


INTERRUPT CONTROLLER SPECIAL REGISTERS
1. source pending register (SRCPND):所有 interrupt request from the interrupt sources 被登記到 source pending register
SRCPND 位置在 0x4A000000 R/W
0 = The interrupt has not been requested
這樣來說 哪個interrupt source要產生interrupt 先在此註冊(registe)
ex. 啟動RTC tick interrupt
設定此register為(0x1<<8)

2. interrupt mode register: 紀錄 interrupt request mode: FIQ and IRQ
0 = IRQ mode
1 = FIQ mode
順帶一提
只有一個interrupt能夠被設定為FIQ mode in the interrupt controller
(our system doesn't use this much)

3. interrupt mask register(INTMSK): 負責作遮罩
0 = interrupt service is available
1= interrupt service is masked
[so HWIntItem has function Enable() and Disable()
void Enable(){INTMSK &= ~(0x1<<8)}
In RTC init will call CHWIntItem::Enable to unmask RTC tick]

4. priority register ::負責控制arbiter 跟上述 interrupt priority generating block and interrupt priority有關
[Register, Address, R/W, Description, Reset Value]
[PRIORITY,0x4A00000C, R/W, IRQ priority register, 0x7F]
擁有21bit
0~6 bit 分別控制 arbiter 0~6 是否要調整priority
0 = priority does not rotate
1 = priority rotate enable

7~20 bit 分別去調整priority優先順序
可參考14-5
7-8 bit 負責作arbiter 0 priority調整
00 = REQ 1-2-3-4
01 = REQ 2-3-4-1
10 = REQ 3-4-1-2
11 = REQ 4-1-2-3
arbiter0 有四個 interrupt request
REQ1/EINT0
REQ2/EINT1
REQ3/EINT2
REQ4/EINT3
default value is 00
[our system does not use this register for some purpose]

5. interrupt pending register(INTPND)
bit in the pending register shows whether the corresponding interrupt request has the highest priority.
Only one bit can be set to 1. in INTPNDD.
Manual 中有提到 in 14-144
"Like the SRCPND register, this register has to be cleared in the interrupt service routine after clearing the SRCPND register."
clearpending function can set 1 and 5


continue
INTERRUPT OFFSET (INTOFFSET)
(not used in system)
The value in the INTOFFSET show which interrupt request of IRQ mode is in the INTPND register.
This bit can be cleared automatically by clearing SRCPND and INTPND.

SUB SOURCE PENDING(SUBSRCPND) REGISTER
indicate the interrupt request status.
1 = the interrupt source has asserted the interrupt request

INTERRUPT SUBMASK(INTSUBMSK) REGISTER
Determine which interrupt source is masked. The masked interrupt source will not be serviced.
1 = interrupt service is masked.
The function is the same with INTMSK. the difference is interrupt source.
ex. INTMSK第九個bit 負責 INT_WDT_AC97
INTSUBMSK 第13個bit 負責INT_WDT
第14個bit 負責INT_AC97


Reference:
http://www.eforth.com.tw/Csoc/eSOCFM/esoc_dol/AN/AN0001.pdf
S3C2440 user manual