基于ARM9的中断控制器的程序设计与实现.docx

上传人:b****3 文档编号:26978665 上传时间:2023-06-24 格式:DOCX 页数:24 大小:664.90KB
下载 相关 举报
基于ARM9的中断控制器的程序设计与实现.docx_第1页
第1页 / 共24页
基于ARM9的中断控制器的程序设计与实现.docx_第2页
第2页 / 共24页
基于ARM9的中断控制器的程序设计与实现.docx_第3页
第3页 / 共24页
基于ARM9的中断控制器的程序设计与实现.docx_第4页
第4页 / 共24页
基于ARM9的中断控制器的程序设计与实现.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于ARM9的中断控制器的程序设计与实现.docx

《基于ARM9的中断控制器的程序设计与实现.docx》由会员分享,可在线阅读,更多相关《基于ARM9的中断控制器的程序设计与实现.docx(24页珍藏版)》请在冰豆网上搜索。

基于ARM9的中断控制器的程序设计与实现.docx

基于ARM9的中断控制器的程序设计与实现

 

目录

1功能描述1

1.1课题设计题目1

1.2课程功能描述及任务要求1

2基础知识1

2.1中断流程1

2.2数据结构2

2.2.1中断优先级产生模块2

2.2.2中断优先级2

2.3寄存器工作原理3

2.3.1程序状态寄存器PSR3

2.3.2中断模式3

2.3.3中断请求寄存器3

2.3.4中断屏蔽寄存器4

2.4实验详解4

2.4.1源请求寄存器SRCPND4

2.4.2中断模式寄存器INTMOD5

2.4.3中断屏蔽寄存器INTMSK5

2.4.4中断请求寄存器INTPND7

2.4.5中断偏移寄存器INTOFFSET7

2.4.6子中断源请求寄存器SUBSRCPND8

2.4.7子中断屏蔽寄存器INTSUBMSK8

2.5实验环境9

3系统设计9

3.1系统总体设计9

3.2主函数设计10

3.3中断处理函数设计10

3.4中断初始化及LED控制设计12

3.5各种寄存器的设计13

4实验截图13

4.1硬件连接13

4.2ADS中工程的相关配置13

4.3AXD的相关配置15

4.4工程JTAG调试执行17

5总结19

致谢20

参考文献21

1功能描述

1.1课题设计题目

《基于ARM9中断控制器的程序设计与实现》

1.2课程功能描述及任务要求

这次的嵌入式系统实习,我们的选题是基于ARM9中断控制器的程序设计与实现。

课题要完成的功能是,通过产生不同的外部中断控制发光二极管的亮灭,通过LED来指示发生了哪个外部中断。

要很好地完成本次实习,中断控制的基本原理必须非常熟悉。

S3C2410中断控制器接收56个中断源的中断请求。

中断源由如DMA控制器、UART、IIC等内部外设提供。

这些中断源中,UARTn和EINTn中断是以或逻辑输入到中断控制器的。

当从内部外设和外部中断请求引脚接收到多个中断请求时,经过中断仲裁后,中断控制器向ARM920T请求FIQ或者IRQ中断。

仲裁过程与硬件优先级有关,仲裁结果写入中断请求寄存器。

中断请求寄存器帮助用户确定哪个中断产生。

课题设计的目的是,通过实习,使我们对基于ARM微处理器的嵌入式系统开发的过程有更多的解,更好地掌握嵌入式系统开发的知识。

能够针对某一嵌入式微处理器进行实际开发,锻炼实践动手能力。

并能够熟练掌握ARM中断处理过程,能够在中断处理程序控制跑马灯,掌握ARM中断控制器的工作机制及原理,熟悉JXARM2410的中断处理的工作原理。

2基础知识

2.1中断流程

图2-1

2.2数据结构

2.2.1中断优先级产生模块

其中32个中断请求的优先级逻辑有由个rotationbased仲裁位组成:

6个一级仲裁位和一个二级位,如图2-2所示。

图2-2

2.2.2中断优先级

每个仲裁器可以处理6个中断请求,基于一位仲裁器模式(ARB_MODE)和两位选择信号(ARB_SEL):

—如果ARB_SEL位为00B,优先级顺序是:

REQ0,REQ1,REQ2,REQ3,REQ4,andREQ5。

—如果ARB_SEL位为01B,优先级顺序是:

REQ0,REQ2,REQ3,REQ4,REQ1,andREQ5.

—如果ARB_SEL位为10B,优先级顺序是:

REQ0,REQ3,REQ4,REQ1,REQ2,andREQ5

—如果ARB_SEL位为11B,优先级顺序是:

isREQ0,REQ4,REQ1,REQ2,REQ3,andREQ5.

注意:

REQ0总是具有最高优先级,REQ5总是具有最低优先级,改变ARB_SEL位只能改变REQ1-REQ4的优先级。

如果ARB_MODE位被置1,ARB_SEL不会自动改变,这会使仲裁器处于固定优先级模式(注意即使处于这种模式,还是可以通过手动改变ARB_SEL位来配置优先级)。

如果ARB_MODE位被置1,ARB_SEL改变以变换优先级,例如,如果REQ1被服务,ARB_SEL自动变成01把REQ1变为最低优先级,ARB_SEL的详细规则如下:

—如果REQ0或REQ5被服务,ARB_SEL位不会变

—如果REQ1被服务,ARB_SEL位置01B

—如果REQ2被服务,ARB_SEL位置10B

—如果REQ3被服务,ARB_SEL位置11B

—如果REQ4被服务,ARB_SEL位置00B

2.3寄存器工作原理

2.3.1程序状态寄存器PSR

如果PSR中的F位被置1,CPU不接收FIQ快速中断,同样如果I位PSR被置1,CPU不接收IRQ中断,因此中断控制器能够通过将PSR的F和I位和相应的INTMSK中的位清零来接收中断。

2.3.2中断模式

ARM920T有两种中断模式:

FIQ和IRQ。

在中断请求时所有的中断源决定使用哪个模式。

2.3.3中断请求寄存器

S3C2410有两种中断请求寄存器:

源请求寄存器(SRCPND)和中断请求寄存器(INTPND)。

这些请求寄存器揭示了一个中断是否正在请求。

当中断源请求中断服务时SRCPND寄存器中的相应位肯定被置1,然而,中断仲裁之后则只有INTPND寄存器的某1位被自动置1。

即使该中断被屏蔽,SRCPND寄存器中的相应位也会被置1,但是INTPND寄存器将不会改变。

当INTPND寄存器的某位被置1,且I位或者F位清零时中断服务即开始。

SRCPND和INTPND寄存器能够被读和写,因此服务函数必须通过向SRCPND和INTPND中相应位写入“1”来清除中断请求条件。

2.3.4中断屏蔽寄存器

通过中断屏蔽寄存器的哪个屏蔽位被置1可以知道哪个中断被禁止。

如果INTMSK的某个屏蔽位为0,此中断将会被正常服务。

如果中断源产生了一个请求,SRCPND中的源请求位被置位,即使相应屏蔽位为1。

2.4实验详解

中断控制器有5个控制寄存器:

源请求寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器和中断请求寄存器。

所有中断请求首先寄存入SRCPND,它们基于中断模式寄存器分为两组:

FIQ请求和IRQ请求。

多IRQ的仲裁过程基于优先级寄存器。

2.4.1源请求寄存器SRCPND

SRCPND由32位组成,每一位与一个中断源相关。

如果某个中断源产生中断请求并等待中断服务,某位将会被置1。

相应地,寄存器也指出了哪个中断源在请求服务。

注意SRCPND中的每个位是由中断源自动置位的,与INTMASK寄存器无关。

此外,SRCPND寄存器不会被优先级逻辑影响。

在中断服务函数中必须清零SRCPND的相应位,否则,中断控制器会认为同一个源的另一个中断,换句话说,如果SRCPND的某个位仍然为1,中断控制器会认为又有一个有效的新的中断在请求服务。

清零相应位的时机由用户需求决定。

如果想要从同一个中断源接收另外一个有效的中断,应该在刚进入ISR的时候清零,然后使能中断。

可以通过向SRCPND写入数据来清零某位,但是注意只有SRCPND中为1的位会被写成写入数据中的位,而SRCPND中为0的位不会改变(如图2-3)。

图2-3

2.4.2中断模式寄存器INTMOD

此寄存器由32个对应每个中断源的位组成。

如果某位被置1,相应的中断被设置为FIQ模式,否则,设置为IRQ模式。

注意:

只有1个中断源能够被设置为FIQ模式,因此INTMOD中只有1位能被置1。

2.4.3中断屏蔽寄存器INTMSK

每个中断源对应一个位,如果某位被置1,CPU不会响应相应的中断请求(注意即使这种情况下,SRCPND的位还是会置1),如果被置0,相应中断请求可以被响应。

相关图见图2-4、图2-5和图2-6。

图2-4

图2-5

图2-6

2.4.4中断请求寄存器INTPND

每个位显示了相应的中断请求(没有被屏蔽并等待中断服务)是否具有最高的优先级。

由于INTPND寄存器处于优先级逻辑之后,只有1位能被置1,只有这个中断请求向CPU产生IRQ中断。

在中断服务程序中,可以通过读此寄存器来知道哪个中断源正在被服务。

同SRCPND寄存器一样,寄存器必须在中断服务程序中清零(SRCPND清零之后)。

每个中断源对应一个位,如果某位被置1,CPU不会响应相应的中断请求,如果被置0,相应中断请求可以被响应。

(见图2-7)

图2-7

注意:

1、如果FIQ模式中断发生,INTPND的相应位不会turnon,因为INTPND寄存器仅在IRQ模式下有效。

2、清除INTPND寄存器时的注意事项:

INTPND寄存器通过写1来清零某位。

如果某位从1写成0,INTPND寄存器和INTOFFSET寄存器可能有非期望值出现。

因此,请不要向INTPND寄存器中为1的位写入0,最方便的清除INTPND寄存器的方法就是向INTPND寄存器中写入当前INTPND寄存器的值如:

INTPND=INTPND。

2.4.5中断偏移寄存器INTOFFSET

INTOFFSET寄存器中的值表示哪个中断请求在INTPND寄存器之中。

此位将会在清零SRCPND和INTPND之后自动清零。

注意:

FIQ中断不影响此寄存器,因为它只在IRQ模式下有效。

2.4.6子中断源请求寄存器SUBSRCPND

可以通过向SUBSRCPND写入数据来清零某位,但是注意只有SUBSRCPND中为1的位会被写成写入数据中的位,而SUBSRCPND中为0的位不会改变。

图2-8显示了寄存器的相关位。

图2-8

2.4.7子中断屏蔽寄存器INTSUBMSK

此寄存器有11位,每一位对应一个中断源,如果某位被置1,说明此位对应的中断请求不被CPU响应(注意即使在这种情况下,SUBSRCPND寄存器还是被置1的),如果屏蔽位为0,则相应中断请求能被响应。

图2-9

2.5实验环境

软件:

ADS1.2环境;

硬件:

1、PC机,奔腾Ⅳ以上CPU,512MB以上内存,80G以上硬盘;

2、JXARM2410教学实验平台。

3系统设计

3.1系统总体设计

系统总体设计流程,如图3-1

图3-1

3.2主函数设计

主函数就是通过一个While

(1)死循环来等待中断的发生,main函数调用了一个delay延时子程序。

相关代码如下:

#include"register.h"//包含register.h和comm_fun.h两个头文件

#include"comm_fun.h"

/*延时*/

voiddelay(intmsec)

{

inti,j;

for(i=1000;i>0;i--)

for(j=msec*10;j>0;j--)

/*donothing*/;

}

/*主函数*/

intmain()

{

while

(1)//while函数死循环等待外部中断的发生

{

delay(5);//delay延时,但什么都不做,就是等待中断的发生

}

return0;

}

3.3中断处理函数设计

当INTPND的某位被置1,且中断模式寄存器中断INTMOD的I位或者F位清零时,中断服务即开始。

在中断处理函数中,必须通过向SRCPND和INTPND中相应位写1来清除中断请求条件,对于SRCPND,通过向相应位写1来清除中断请求条件。

而对于INTPND来说,最好最方便的办法就是向中INTPND中写入当前INTPND的值,即INTPND=INTPND。

相关代码如下:

#include"register.h"//包含register.h和comm_fun.h两个头文件

#include"comm_fun.h"

/*系统中断处理函数*/

voidhandle_irq()

{

unsignedlongirqOffSet=INTOFFSET;//通过中断偏移寄存器

//取得中断信号,用irqOffSet存储

if(2==irqOffSet)//如果是外部中断2键被按下,则执行下面的程序

{

Led_Display

(2);//调用sys_init.c中显示LEDLed_Display()子程序

//LED2点亮

delay(100);

}

elseif(3==irqOffSet)//如果是中断3键被按下,则执行下面的程序

{

Led_Display(4);//调用sys_init.c中显示LED的Led_Display()子程序

//LED3点亮

delay(100);

}

SRCPND&=(1<

INTPND=INTPND;//清除中断结果,写1清0

}

3.4中断初始化及LED控制设计

中断初始化,INTMSK的相应位如果置0,则允许中断;如果相应位置1,即使发生了中断,中断控制器将屏蔽该中断请求CPU不会响应该中断。

在中断初始化函数中,将INTMSK2、3位置0,使能相关外部中断。

0x10000000对应的值的4、5、6、7位分别控制LED1、LED2、LED3、LED4的亮灭。

LED初始化,传入值15,即data=00001111B,执行Led_Display()函数后,output_0x10000000最后的值为00001111B,此时4个LED灯均被点亮。

当外部中断2触发时,Led_Display()函数的参数值为2时,data=00000010B,output_0x10000000最后的值为11011111B,此时第二个LED灯均被点亮。

当当外部中断3触发时,Led_Display()函数的参数值为3时,data=00000011B,output_0x10000000最后的值为10111111B,此时第三个LED灯均被点亮。

相关代码如下:

#include"register.h"//包含register.h和comm_fun.h两个头文件

#include"comm_fun.h"

unsignedcharoutput_0x10000000=0xff;

externvoidLed_Display(intdata)

{

output_0x10000000&=(~0xf0);

output_0x10000000|=(((~data)<<4)&0xf0);

*((unsignedchar*)0x10000000)=output_0x10000000;

}

intled_init()

{

Led_Display(15);

delay(10);

return0;

}

voidirq_init()

{

INTMSK&=~(3<<2);

}

3.5各种寄存器的设计

(1)LED控制寄存器和数据寄存器的定义

#defineGPBCON(*(volatileunsignedlong*)0x56000010)

#defineGPBDAT(*(volatileunsignedlong*)0x56000014)

(2)中断屏蔽寄存器、中断请求寄存器、三种外部中断寄存器的定义

#defineEINTMASK(*(volatileunsignedlong*)0x560000A4)

#defineEINTPEND(*(volatileunsignedlong*)0x560000A8)

#defineEXTINT0(*(volatileunsignedlong*)0x56000088)

#defineEXTINT1(*(volatileunsignedlong*)0x5600008C)

#defineEXTINT2(*(volatileunsignedlong*)0x56000090)

4实验截图

4.1硬件连接

通过ADT2000仿真器把计算机与JXARM9-2410-1ARM9嵌入式教学实验平台建立连接,打开试验箱电源。

4.2ADS中工程的相关配置

(1)首先,打开ADS软件,如图4-1所示。

图4-1ADS软件初始界面

(2)打开工程,如图4-2所示。

图4-2打开工程

(3)设置工程。

先点击左边的“ARMLinker”,然后选择右边的“Output”并在“ROBase”中设置为“0x30000000”,如图4-3所示。

图4-3ARMLinker的Output选项卡配置

(4)然后再点击Layout页,进行目标文件的设置。

如图4-4所示。

图4-4ARMLinker的Layout选项卡配置

4.3AXD的相关配置

(1)调试工程。

从开始菜单启动“AXDDebugger”。

启动后的界面如图4-5所示。

图4-5ADX的初始界面

(2)选择“Options”菜单中的“ConfigureTarget···”,在弹出的对话框中选择“Add”按钮,保证ADTIDE已经安装,添加adtrdi列表文件。

如图4-6所示。

图4-6添加adtrdi列表文件

(3)回到“ChooseTarget”对话框,在“TargetEnvironments”列表中选中刚才添加的列表文件,点击“Configure”按钮进行处理器类型、存储器存储方式等的配置。

如图4-7所示。

图4-7处理器类型等的配置

(4)如果设置正确并且硬件连接正确,串口连接成功,将出现如图4-8所示的提示。

图4-8串口连接成功

4.4工程JTAG调试执行

(1)点击ADS软件中的Debug 按钮,开始JTAG调试。

如图4-9所示。

图4-9开始调试

(2)如果编译成功,将出现如图4-10所示的提示,程序运行正常,在断点处停止。

图4-10开始执行程序

(3)点击GO按钮,跳过断点,继续执行,如图4-11所示。

图4-11执行成功

5总结

我们的选题是基于ARM9中断控制器的程序设计与实现,任务下达之后,我们首先利用三天的时间进行了相关资料的学习,比如中断的处理过程,跑马灯的工作原理等。

通过查找资料进一步的学习这些知识,我发现我们之前对于书本上的很多知识学得还不够深入,离应用还差得很远。

接着,我们开始进行系统的需求分析,根据需求分析做了总体设计,有了一个整体的框架,我们进行了小组内的任务分配。

通过分工合作,我们开始录入代码,并完善了系统,最终实现了课题的要求,通过产生外部中断来控制跑马灯的亮灭。

在实习过程中,我也遇到了一些麻烦。

比如,源中断挂起寄存器的清零实现不了,原来是因为ARM9中SRCPND和INTPND都是通过写一清零的。

还有,最初跑马灯不知如何控制,通过小组合作以及老师的帮助下,认真的分析了代码,终于搞懂了跑马灯的控制原理。

虽然这个课题基本完成了要求,但还有存在的问题需要改进和完善。

比如,如何把外部中断改为定时器中断,如何通过中断控制数码管的现实,这些问题都有待进一步研究。

通过这次的实践,我了解了ARM嵌入式系统开发的流程和技巧,懂得了团队协作的重要性,提高了我的实际动手能力,增强了自己的分析问题、解决问题的能力。

 

致谢

首先,衷心的感谢老师给了三精心的指导和热情的帮助,这样使得我们顺利的完成课程设计开发工作,感谢***老师和***老师的悉心指导,让我顺利的完成了这次的嵌入式系统开发与应用工程实习,让我对基于ARM微处理器的嵌入式系统开发的过程有了更多的解,更好地掌握嵌入式系统开发的知识。

这次课程设计是将理论与实践相结合的一个很好的过程,将大量书本中学到的知识运用到实际中,让我得到更好的锻炼机会。

首先,感谢***给我提供的这次课程设计学习机会,然后,我要特别感谢的是***老师,***老师过硬的技术能力、负责的教学态度、丰富的教学方法,让我通过这次课程设计得到的知识更加丰满,更加实用。

另外,我要感谢**工学院计算机学院给我提供的良好的实验环境,优质的实验器材、实验资料;感谢淮阴工学院图书馆提供的书籍,让我在遇到难题时有足够的文献资料查阅;还要感谢,我同组同学一起的协作,让实验变得更加轻松。

本课题在选题及进行过程中得到了***老师和**老师的悉心指导。

两位老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。

在此,再次向孙老师和刘老师致以诚挚的谢意和崇高的敬意。

 

参考文献

[1]王田苗.嵌入式系统设计与实例开发[M].2版.北京:

清华大学出版社,2003.

[2]黄智伟,邓月明,王彦《ARM9嵌入式系统设计基础教程》.北京:

北京航空航天大学出版社,2008.

[3]于明,等.ARM9嵌入式系统设计与开发教程[M].北京:

电子工业出版社,2006.

[4]魏洪兴.嵌入式系统设计师教程[M].北京清华大学出版社,2006.

[5]张绮文,等.ARM嵌入式常用模块与综合系统设计实例精讲[M].北京:

电子工业出版社,2006.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1