查看: 3366|回复: 0

ARM7TDM中断接口详解

[复制链接]

该用户从未签到

发表于 2011-5-11 16:26:42 | 显示全部楼层 |阅读模式
分享到:
中断模式
ARM7TDMI的两种中断模式:FIQ和IRQ。
IRQ和FIQ的区别:
(1)对于FIQ,必须尽快处理事件并离开这个模式;
(2)IRQ可以被FIQ中断,但IRQ不能中断FIQ;
(3)为使FIQ更快,FIQ模式具有更多的私有寄存器。
程序状态寄存器PSR的F位和I位:
(1)PSR的F位=1,处理器不接受FIQ;
(2)PSR的I位=1,处理器不接受IRQ。
因此,为了使能相应中断机制,PSR的F位或I位必须被清0,同时中断屏蔽寄存器INTMSK的相应位也必须被清0。

中断请求寄存器INTPND
INTPND:指示某个中断请求是否还未被处理。
INTPND中被置位的中断位称为pending位。
Pending=1时,若PSR的I标志位或F标志位为0,中断服务程序就会被启动执行。
INTPND是只读寄存器,故要想清除pending位,需要对中断服务寄存器I_ISPC或F_ISPC的相应位写1。
读取INTPND可以了解中断发生的情况,通过软件查询确定中断服务优先级。
INTPND中的26个位对应着每一个中断源。
某个中断产生时,INTPND中的相应位就会置1。
中断服务程序中,处理结束后须及时清除pending位,使系统能够及时再次响应该类型的中断。
中断请求可通过INTMSK屏蔽,但如果被屏蔽的中断发生,INTPND中的pending位仍然会置1。

INTMSK中断屏蔽寄存器
INTMSK =1,则与该位对应的中断响应被禁止。
INTMSK =0,则这个中断发生时将会被正常响应。
如果某个中断在INTMSK寄存器中的对应位为1,但是又有这个中断发生,则它的pending位还是会置位,只是不会自动转入中断服务程序。
如果全局屏蔽位被置1,那么,当任一中断发生时,中断pending位还是会置位,但是所有的中断都不会得到服务 。
S3C44B0X中断源1
在30个中断源中有26个中断源提供给中断控制器,4个外部中断(EINT4/5/6/7)请求是通过“或”的形式合成为1个中断源送至中断控制器,两个UART错误中断(UERRORO/1)也是如此。

 S3C44B0X中断源2



注意:EINT4,EINT5,EINT6和EINT7分享同一个中断请求源。中断服务程序ISR要通过读取
EXTINTPND3~EXTINTPND0寄存器来区别这4个中断源,并在处理结束时通过EXTINTPND3~EXTINTPND0中对应位写1来清除该位。

中断优先级产生模块
确定中断优先级方式:软件查询,硬件排队(矢量中断模式)。
IRQ中断请求有一个中断优先级产生模块,如果使用中断向量模式,并且中断源被配置为IRQ 中断,中断将被中断优先级产生模块处理。
中断优先级产生模块包括5个单元:1个主单元,4个从单元。
从单元:管理6个中断源,包括4个可编程优先级中断源sGA、sGB、sGC、sGD和2个固定优先级中断源sGKA、sGKB 。
主单元:管理4个可编程优先级从单元mGA、mGB、mGC、mGD和2个固定优先级中断源mGKA、mGKB  。其中,两个固定优先级中断源INT_RTC和INT_ADC(对应mGKA和mGKB  )在26个中断源中优先级最低,并且INT_RTC的优先级高于NT_ADC的优先级。

中断优先级
FIQ中断比IRQ中断具有更高的优先级。
从单元:sGA、sGB、sGC、sGD的优先级可编程,但总是高于sGKA和sGKB。 sGKA、sGKB 的优先级固定,并且sGKA的优先级高于sGKB。
主单元:mGA、mGB、mGC、mGD的优先级可编程,但总是高于mGKA、mGKB 。 mGKA、mGKB的优先级固定,并且mGKA的优先级高于mGKB。
如果编程确定mGA的优先级高于mGB ,那么mGA涉及的6个中断源中,优先级最低的中断源(也就是sGKB ),其中断优先级也要高于mGB涉及的6个中断源中优先级最高的中断源的中断优先级。
由于INT_RTC和INT_ADC对应mGKA和mGKB,所以,在26个中断源中, INT_ADC( mGKB )优先级最低,INT_RTC (mGKA )的优先级高于INT_ADC的优先级。
S3C44B0X中断优先级 :
(1)FIQ→IRQ
(2)主单元(A、B、C、D可编程)→{从单元(A、B、C、D可编程) →从单元KA →从单元KB } →主单元KA →主单元KB

中断矢量地址

 
异常中断特定地址(第3章)

关于S3C44B0X中断系统
中断向量表:ROM区,地址从0x00开始,其中0x00-0x1C为异常向量入口地址,0x20-0xC0为中断向量入口地址。
ARM7内核只有8个硬件中断入口(1个保留,7个异常向量, 0x00-0x1C ),对于众多的中断源,ARM7内核通过 IRQ、FIQ的中断状态寄存器进行软件查询。
S3C44B0X有30个中断源,为了克服软件查询产生的中断延迟,加入了更多的中断向量表(0x20-0xC0), 由 S3C44B0X自己的中断控制器管理。
要使用这种方式,必须在中断模式寄存器INTMOD中设置每个中断源的模式为IRQ模式,且中断控制寄存器INTCON中使用向量中断模式。
“非向量中断”的中断过程:IRQ产生后,CPU自动到0x18地址取指,转到中断服务程序,软件查询中断源,转到相应处理程序。
“向量中断”的中断过程:  IRQ产生后,从0x18地址取指令,同时,中断控制器自动产生分支指令,并加载到数据总线。中断控制器产生的分支指令机器码:  0xEA000000,硬件逻辑根据中断源提供向量地址(见向量地址表)。在各个中断源对应的中断向量地址中,存放跳转到相应中断服务程序的指 令:0xEA000000+((-< 向量地址>-0X8)>>2)

中断控制寄存器
在实际编程中,对中断控制寄存器进行读取和设置来实现对中断的响应和控制。
INTCON地址0x01E00000,可读写,初始值为0x07。


中断请求寄存器INTPND(1)
INTPND寄存器的地址为0x01E00004,用来指示中断请求状态 。

请求寄存器INTPND(2)


中断中断模式寄存器INTMOD(1)
INTMOD中的26位分别对应着每个中断源,如果INTMOD中的某个位设置为1,则ARM7TDM1内核将以FIQ(快速中断)模式操作那个中断;否则,将以IRQ(普通中断)模式操作。
INTMOD地址0x01E00008,可读写。


中断模式寄存器INTMOD(2)

 
中断屏蔽寄存器INTMSK(1)
INTMSK地址0x01E0000C,可读写,用以确定哪个中断源被屏蔽,屏蔽的中断源将不被服务。

 
中断屏蔽寄存器INTMSK(2)

IRQ矢量模式寄存器
主优先级产生单元通过I_PMST寄存器决定4个辅单元和两个中断源之间的优先级。
两个中断源INT_RTC和INT_ADC在26个中断源中优先级是最低的。
如果几个中断请求同时发生,在I_ISPR寄存器中将其中具有最高优先级的中断源对应位置1。

 IRQ/FIQ中断服务寄存器
对应着IRQ的I_ISPR和I_ISPC寄存器,在FIQ中断模式下,也有如表5-41所示的与中断服务相关的寄存器。
I_ISPC/F_ISPC不仅清除中断pending位(INTPND),也通知中断控制器中断服务程序(ISR)已经结束。
在某个中断的ISR结束时,与该中断相应的pending位必须被清零,要将INTPND的某一位清零,方法是往
I_ISPC/F_ISPC的相应位写入1

I_ISPC/F_ISPC寄存器(1)

 
I_ISPC/F_ISPC寄存器(2)

外部中断控制寄存器EXTINT
外部中断控制寄存器EXTINT用来设置外部中断的触发模式

外部中断请求寄存器EXTINTPND
EINT4、EINT5、EINT6和EINT7分享同一个中断请求源,因此,中断服务程序要通过读取EXTINTPND寄存器来区别这4个中断源。它们的中断处理程序(ISR)必须在处理结束时,通过将EXTINTPND中对应位写1来清除该位。

外部中断的应用
例:有4个按键直接与EXINT4-7引脚相连,配置好I/O口工作在外部中断模式下后,通过按下某个按键来触发中断 。

I/O口设置
(1)对PG口的工作模式进行设置,让PG4~PG7工作在外部中断输入状态。因此,将PG口设置在功能3模式下,采用语句:

rPCONG = 11 11 11 11 xx xx xx xxB;

(2)采用内部上拉,语句为:

rPUPG = 0000xxxxB;


外部中断触发模式设置
利用外部中断控制寄存器EXTINT来设置外部中断的触发模式。

采用电平触发容易引起重复触发,通常采用下降沿或上升沿触发。

不同触发方式的语句如下:

(1)采用下降沿触发时:

rEXTINT=01x 01x 01x 01x xxx xxx xxx xxxB;

(2)采用上升沿触发时:

rEXTINT=10x 10x 10x 10x xxx xxx xxx xxxB;

(3)采用边沿触发时:

rEXTINT=11x 11x 11x 11x xxx xxx xxx xxxB;

(4)采用低电平触发时:

rEXTINT=000 000 000 000 xxx xxx xxx xxxB;


中断寄存器设置
将EINT4~EINT7设置为IRQ中断模式的语句为:

rINTCON=0x5 ;

//非矢量中断模式,禁止FIQ中断,使能IRQ中断

开启中断:

rINTMSK= ~(BIT_GLOBAL|BIT_EINT4567)。


主程序参考示例(1)
volatile char which_int=0;

void Test_Eint(void)

{

rINTCON=0x5; //禁止FIQ,使能IRQ

pISR_EINT4567=(int)Eint4567lsr; //修改中断处理函数指针

Uart_Printf("选择触发方式;n"

1."下降沿触发n"

2."上升沿触发n"

3."边沿触发n"

4."低电平触发n");

rPCONG=11 11 11 11 xx xx xx xxB; //工作在外部中断功能状态

rPUPG 0000xxxxB; //内部上拉使能


主程序参考示例(2)
switch (Uart_Getch())

{

case '1':

rEXTINT=01x 01x 01x 01x xxx xxx xxx xxxB; //下降沿触发

break;

case '2':

rEXTINT=10x 10x 10x 10x xxx xxx xxx xxxB;//上升沿触发

break;

case '3':

rEXTINT=11x 11x 11x 11x xxx xxx xxx xxxB; //边沿触发

break;

case '4':

rEXTINT=000 000 000 000 xxx xxx xxx xxxB; //低电平触发

break;

default:

return;

}

Uart_Printf ("请按中断键\n");

RINTMSK = ~(BIT_GLOBAL|BIT_EINT4567); //中断使能


主程序参考示例(3)
While(!which_int);

switch (which_int)

{

case 1:

Uart_Printf("外部中断4发生了n");

break;

case 2:

Uart_Printf("外部中断5发生了n");

break;

case 4:

Uart_Printf("外部中断6发生了n");

break;

case 8:

Uart_Printf("外部中断7发生了n");

break;

default:

break;

}


主程序参考示例(4)
rINTMSK= BIT_GLOBAL; //禁止中断

which_int=0;

rINTCON=0x5;

}

中断处理程序参考示例如下:

void irq_Eint4567lsr(void)

{

which_int = rEXTINTPND;

rEXTINTPND = 0x0f; //清除EXTINTPND寄存器

rl_lSPC= BIT_EINT4567; //清除pending_bit

Delay(1000); //延时消抖

}
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条



手机版|小黑屋|与非网

GMT+8, 2025-1-9 10:42 , Processed in 0.123180 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.