ARM嵌入式C编程标准教程 第四章 S3C2410的中断系统
- 格式:ppt
- 大小:832.50 KB
- 文档页数:30
使用中断的步骤:1、当发生中断IRQ时,CPU进入“中断模式”,这时使用“中断模式”下的堆栈;当发生快中断FIQ时,CPU进入“快中断模式”,这时使用“快中断模式”下的堆栈。
所以在使用中断前,先设置好相应模式下的堆栈。
2、对于“Request sources(without sub -register)”中的中断,将INTSUBMSK寄存器中相应位设为03、将INTMSK寄存器中相应位设为04、确定使用此的方式:是FIQ还是IRQ。
a.如果是FIQ,则在INTMOD寄存器设置相应位为1b.如果是IRQ,则在RIORITY寄存器中设置优先级使用中断的步骤:5、准备好中断处理函数,a.中断向量:在中断向量设置好当FIQ或IRQ被触发时的跳转函数,IRQ、FIQ的中断向量地址分别为0x00000018、0x0000001c b.对于IRQ,在跳转函数中读取INTPND寄存器或INTOFFSET 寄存器的值来确定中断源,然后调用具体的处理函数c.对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源d.中断处理函数进入和返回6、设置CPSR寄存器中的F-bit(对于FIQ)或I-bit(对于IRQ)为0,开中断s3c2410 中断异常处理在进入正题之前,我想先把ARM920T的异常向量表(Exception Vectors)做一个简短的介绍。
:]ARM920T的异常向量表有两种存放方式,一种是低端存放(从0x00000000处开始存放),另一种是高端存放(从0xfff000000处开始存放)。
关于为什么要分两种方式进行存放这点我将在介绍MMU的文章中进行说明,本文采用低端模式。
ARM920T能处理有8个异常,他们分别是:Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ下面是某个采用低端模式的系统源码片段:/****************************************************** ***********************_start:b Handle_Resetb HandleUndefb HandleSWIb HandlePrefetchAbortb HandleDataAbortb HandleNotUsedb HandleIRQb HandleFIQ…..…..other codes…...******************************************************* **********************/上面这部分片段一般出现在一个名叫“head.s”的汇编文件的里,“b Handle_Reset”这条语句就是系统上电之后运行的第一条语句。
第四章S3C2410A的I/O口从这一章开始,就进入了S3C2410A底层驱动程序开发的学习过程中了。
在第一章已经介绍了ARM系统开发的层级结构,本课程的内容符合层次结构中的第二层底层驱动开发,但是这里不包含启动代码的编写和操作系统移植。
一般来讲ARM开发系统如广州友善之臂的micro2440开发板,英贝特公司的开发板,在加上达盛公司的实验系统等等,出厂时各类底层的相关驱动程序和应用的操作系统移植都已经编写测试完毕,其中ARM的启动代码是现成可以使用的,不需要重新编写。
另外,出厂时的底层驱动代码都是可以直接使用的,这些代码可以提供给使用者自学时参考,当然如果觉得这些代码在结构上表达上都不尽如人意,读者随时都可以自行修改。
达盛公司的实验系统的底层驱动程序也是现成可以使用的,但是鉴于教学需要,本课程会引导读者在理解底层硬件的基础上对这些程序进行修改或者重写编写部分驱动程序,以便使读者能够熟练掌握S3C2410A底层的驱动开发。
4.1 S3C2410A的GPIO1.S3C2410A CPU有117个多功能复用的I/O口,共分为8组。
(1)16bit I/O端口为:Port C、Port D、Port E和Port G(2)11bit I/O端口为:Port B和Port H(3)23bit I/O端口为:Port A(4)8bit I/O端口为:Port F(5)在这里需要说明几个问题:①端口的bit数是什么意思?例如,Port C为16bit I/O端口,即Port C共有16位,从Port C[0]到Port C[15]都可以应用。
②多功能复用是什么意思?ARM7和ARM9这些CPU的I/O口都可以配置成不同的功能,也就是说这些端口可以作为普通的输入输出端口使用,也可以配置成UART使用,还可以配置成I2C、SPI和SSI等总线信号使用。
(6)如何操作这些I/O端口?用配置和访问S3C2410A的功能寄存器的方法可以操作S3C2410A的硬件资源。
S3C2410 中断程序的实现
在此要注意的是区别中断向量表和异常向量表。
中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码
将中断处理程序入口地址放入中断向量表:
代码
定义中断处理程序:
代码
定义异常向量表:
代码
定义异常处理函数:
代码
异常处理宏HANDLER的定义:代码
定义IRQ 中断处理宏IRQHandle:
代码
申明IRQ 异常的服务程序为:IsrIRQ,即,发生IRQ 异常时,执行“b HandlerIRQ”即是
运行IsrIRQ代码:
代码
IRQ 异常处理程序:
代码
由上可以知道,当一个IRQ 中断发生时,CPU将从0X18(IRQ 异常入口地址)取指执行,在这一步PC 的跳转是有硬件实现的。
在入口0x18 地址处放的是一条跳转指令,这条指令将跳到IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。
获得中断入口地址后,接着CPU 跳转中断处理程序运行。
在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。
而异常处理和中断处理程序都是运行在RAM中的。
实验6 S3C2410 PWM定时器中断实验一、实验目的掌握S3C2410 PWM定时器的工作原理和定时时间的计算方法,掌握和PWM定时器有关寄存器的使用方法,会用C语言对PWM定时器进行初始化编程,理解PWM定时器中断的触发过程,熟练掌握和中断相关寄存器的使用以及中断服务函数的编程方法。
二、实验内容UP-NETARM2410实验箱上两个LED数码管的控制地址为0x08000110和0x08000112。
借助于PWM定时计数器可实现简单的计数秒表。
由于只有两位数码管,秒表计到99秒后,从0开始重新计数。
同时三个发光二极管每隔一秒闪烁点亮。
三、PWM定时器相关知识S3C2410A具有5个16位的定时器,其中定时器0~3具有PWM波发生功能,即可以输出PWM波,定时器4没有外部输出。
定时器工作频率为PCLK/(预分频值+1)/分频值,在下面的工程中,将使用定时器1,并设置其工作频率为20 kHz,即为:48MHz/(149+1)/16 = 20 kHz所以定时时间为:0x4E20* 20 kHz=1S定时器1的初始化方法如下:首先,设置TCFG0(定时器配置寄存器0,地址为0x51000000)的值为0x95,即定时器1的预分频值为0x95,十进制数为149。
注意:定时器0和1共用同一个预分频值。
然后,设置TCFG1(定时器配置寄存器1,地址为0x51000004)的值为0x30,即定时器1的分频值为16。
其次,设置TCNTB1(定时器1计数寄存器,地址为0x51000018)和TCMPB1(定时器1比较寄存器,地址为0x5100001C)的值为0x4E20和0x4000。
这里没有用到TCMPB1,当TCNTB1减计数到0后,将触发定时器1中断再次,设置TCON(定时器控制寄存器,地址为0x51000008)的值为0xA00,即刷新TCNB1和TCMPB1的值。
最后,设置TCON的值为0x900,启动定时器1。
一 ARM9(S3C2440)的中断系统——理论知识转载自:骨Zi里德骄傲概述S3C2440A 中的中断控制器接受来自60 个中断源的请求。
提供这些中断源的是内部外设,如DMA 控制器、UART、IIC 等等。
在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。
当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ或IRQ。
仲裁步骤由硬件优先级逻辑决定并且写入结果到帮助用户通告是各种中断源中的哪个中断发生了的中断挂起寄存器中中断控制器操作程序状态寄存器(PSR)的F 位和I 位如果ARM920T CPU 中的PSR 的F 位被置位为1,CPU 不会接受来自中断控制器的快中断请求(FIQ)。
同样的如果PSR 的I 位被置位为1,CPU 不会接受来自中断控制器的中断请求(IRQ)。
因此,中断控制器可以通过清除PSR 的F 位和I 位为0 并且设置INTMSK 的相应位为0 来接收中断。
中断模式ARM920T 有两种中断模式的类型:FIQ 或IRQ。
所有中断源在中断请求时决定使用哪种类型。
中断挂起寄存器S3C2440A 有两个中断挂起寄存器:源挂起寄存器(SRCPND)和中断挂起寄存器(INTPND)。
这些挂起寄存器表明一个中断请求是否为挂起。
当中断源请求中断服务,SRCPND 寄存器的相应位被置位为1,并且同时在仲裁步骤后INTPND 寄存器仅有1 位自动置位为1。
如果屏蔽了中断,则SRCPND 寄存器的相应位被置位为1。
这并不会引起INTPND 寄存器的位的改变。
当INTPND 寄存器的挂起位为置位,每当I 标志或F 标志被清除为0 中断服务程序将开始。
SRCPND 和INTPND 寄存器可以被读取和写入,因此服务程序必须首先通过写1 到SRCPND寄存器的相应位来清除挂起状态并且通过相同方法来清除INTPND 寄存器中挂起状态。
S3C2440系统中断1.1S3C2440系统中断CPU和外设构成了计算机系统,CPU和外设之间通过总线进行连接,用于数据通信和控制,CPU管理监视计算机系统中所有硬件,通常以两种方式来对硬件进行管理监视:●查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。
好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。
这种方式实现起来简单,通常用在只有少量外设硬件的系统中,如果一个计算机系统中有很多硬件,这种方式无疑是耗时,低效的,同时还大量占用CPU资源,并且对多任务系统反应迟钝。
●中断方式:当某个硬件产生需要CPU处理的事件时,主动通过一根信号线“告知”CPU,同时设置某个寄存器里对应的位,CPU一旦发现这根信号线上的电平有变化,就会中断当前程序,然后去处理发出该中断请求。
这就像是医院重危病房,病房每张病床床头有一个应急按钮,该按钮连接到病房监控室里控制台一盏指示灯,只要该张病床出现紧急情况病人按下按钮,病房监控室里电铃会响起,通知医护人员有紧急情况,医护人员这时查看控制台上的指示灯,找出具体病房,病床号,直接过去处理紧急情况。
中断处理方式相对查询方式要复杂的多,并且需要硬件的支持,但是它处理的实时性更高,嵌入式系统里基本上都使用这种方式来处理。
系统中断是嵌入式硬件实时地处理内部或外部事件的一种机制。
对于不同CPU而言,中断的处理只是细节不同,大体处理流程都一样,S3C2440A的中断控制器结构如下图所示:图3-3 S3C2440中断控制器中断请求由硬件产生,根据中断源类型分别将中断信号送到SUBSRCPND(SubSourcePendi ng)和SRCPND(SourcePending)寄存器,SUBSRCPND是子中断源暂存寄存器,用来保存子中断源信号,SRCPND是中断源暂存寄存器,用来保存中断源信号。
中断信号可通过编程方式屏蔽掉,SUBMASK是子中断源屏蔽寄存器,可以屏蔽指定的子中断信号,MASK功能同SUBMASK 用来屏蔽中断源信号。