嵌入式技术应用教程——基于S3C2410第五章.doc

上传人:hw****26 文档编号:4209299 上传时间:2019-10-04 格式:DOC 页数:8 大小:644KB
下载 相关 举报
嵌入式技术应用教程——基于S3C2410第五章.doc_第1页
第1页 / 共8页
嵌入式技术应用教程——基于S3C2410第五章.doc_第2页
第2页 / 共8页
嵌入式技术应用教程——基于S3C2410第五章.doc_第3页
第3页 / 共8页
嵌入式技术应用教程——基于S3C2410第五章.doc_第4页
第4页 / 共8页
嵌入式技术应用教程——基于S3C2410第五章.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、第五章 中断 中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现 行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间 断处,继续执行原程序。 中断是单片机或 ARM 实时地处理内部或外部事件的一种机制。换言之,中断可以作为 ARM 外围设备与 CPU 之间的一种联系或通信方式。 S3C2410A 中有 56 个中断源,这些中断源分别为: 表 5.1 中断源 具体描述 INT_ADC ADC EOC 中断和 Touch 中断,INT_ADC/INT_TC INT_RTC RTC 报警中断 INT_SPI1 SPI1 中断 INT_UART0 通

2、用异步收发器 0 的 ERR(错误)中断、RXD 和 TXD 中断 INT_UART1 通用异步收发器 1 的 ERR(错误)中断、RXD 和 TXD 中断 INT_UART2 通用异步收发器 2 的 ERR(错误)中断、RXD 和 TXD 中断 INT_USBH USB 主机中断 INT_USBD USB 设备中断 INT_SPI0 SPI0 中断 INT_SDI SDI 中断 INT_DMA DMA03 中断 INT_LCD LCD 中断 INT_IIC I2C 中断 INT_TIMER 定时器 04 中断 INT_WDT 看门狗定时器中断 INT_TICK RTC 实时时钟节拍中断 nB

3、ATT_FLT 电池错误中断 EINT 外部中断 023 假如 UART0 的接收缓存收到了来自外部的数据,那么设备 UART0 要通知 CPU 已经收 到数据,请示 CPU 进行下一步工作。那么 UART0 要通过什么方式告知 CPU 收到数据了呢? 设想一下,UART 是通用异步收发器的英文缩写,一般在 ARM 芯片与外部进行数据传输的 时候并不是一直不断地进行数据交换,而是断断续续地进行数据通信,那么 CPU 不可能一 直监视着 UART 设备。在 UART 设备不进行数据收发时, CPU 可以去进行别的程序处理。一 旦 UART 设备需要和外部进行数据传输的时候,比如收到了来自外部设备

4、的一帧数据,此 时 CPU 还在进行着别的程序处理,那么 UART 设备就要告知 CPU 收到数据了,需要对数据 进行处理,UART 会通过中断的方式通知 CPU,打断 CPU 正在进行的工作,让 CPU 对 UART 收到的数据进行处理。此时 CPU 收到 UART 的中断通知,那么他会停下正在处理的工作, 保存当前的数据,转向 UART 的数据处理程序(UART 中断服务程序)对 UART 收到的数据 进行处理,处理完毕后如果没有其他设备的中断请求,CPU 会跳转回 UART 中断之前的程 序,调出中断时保存的数据继续运行中断之前的程序。 S3C2410A 是以 ARM920T 为内核的

5、ARM,ARM920T 内核有两种中断模式:FIQ 和 IRQ。IRQ 全 称 为 Interrupt Request, 即 是 “中 断 请 求 ”的 意 思 。 FIQ 全 称 为 Fast Interrupt Request, 即 是 “快 速 中 断 请 求 ”的 意 思 。 FIQ 模式是特权模式中的一种,同 时也属于异常模式一类。用于高速数据传输或通道处理,在触发快速中断请求(FIQ)时 进入。一般情况下,我们只用到 IRQ 而很少用到 FIQ。 5.1 S3C2410A 中和中断相关的寄存器 1. SOURCE PENDIND REGISTER(SRCPND ) 这个寄存器名称为

6、中断源挂起寄存器。 该寄存器是 32 位寄存器,每一位都代表着相应的中断源是否发出中断请求。当其中 某一位值为“1 ”时,表明其相应的中断源发出了中断请求,否则这个中断源没有发出中 断请求。 比如,SRCPND10=1,则说明定时器 0 请求中断。 2. SUB SOURCE PENDING REGISTER(SUBSRCPND) 这个寄存器与 SRCPND 寄存器功能相同,只不过这个寄存器有效 bit 为 11 位。这个 寄存器中主要是更细地列出了 UART 中具体的中断类型。 3. INTERRUPT PENDING REGISTER(INTPND ) 这个寄存器名称为中断挂起寄存器。 该

7、寄存器为 32 位寄存器,每一位都代表着相应的中断源是否发出中断请求。当其中 某一位值为“1 ”时,表明其相应的中断源发出了中断请求,否则这个中断源没有发出中 断请求。这个寄存器的每一位功能描述和寄存器 SRCPND 是相同的。 4. INTERRUPT MASK REGISTER(INTMSK ) 这个寄存器名称为中断屏蔽寄存器。 该寄存器为 32 位寄存器,每一位都代表着相应的中断源是否可用。当其中某一位值 为“1”时,表明其相应的中断源被屏蔽掉了,反之相应中断源是可用的。 下面对上述三个寄存器进行说明。S3C2410A 中有两个中断挂起寄存器分别为 SRCPND 和 INTPND。这些寄

8、存器指明了一个中断是否要被进行处理。当中断源请求中断 服务时,SRCPND 的相应 bit 位会被置位,同时 INTPND 中仅有与 SRCPND 相对应的一 位数值在判决程序执行后被置位。如果中断被 INTMSK 寄存器所屏蔽,那么当有中断请求 时,SRCPND 的相应 bit 位会置位,而 INTPND 中与 SRCPND 相对应的 bit 位不会发生变 化。SRCPND 和 INTPND 都是可读写的,在中断服务程序中为了清除相应的中断请求, 需要向 SRCPND 的相应 bit 位和 INTPND 的相应 bit 位写 “1”,这样就清除了中断服务 请求。(注:此处是向 SRCPND

9、和 INTPND 中写“1” 进行清除操作,而不是写“0 ”) 另外,在中断服务程序中,我们可以读寄存器 INTPND,看看其中哪一位被置位了(这个 寄存器中的值同时只能有 1bit 被置位),就可以知道是哪个设备向 CPU 请求了中断。 5. INTERRUPT SUB MASK REGISTER(INTSUBMSK ) 这个寄存器功能与 INTMSK 相同,这个寄存器主要用来屏蔽 UART 的具体中断类型。 6. INTERRUPT MODE REGISTER(INTMOD) 这个寄存器名称为中断模式寄存器。 其相应 bit 为“1 ”时,按 FIQ 模式处理,否则按 IRQ 模式处理。注

10、意,同时只能有 一个中断源按照 FIQ 模式处理,即 INTMOD 寄存器中只能有一个 bit 为“1 ”。 7. INTERRUPT OFFSET REGISTER (INTOFFSET) 这个寄存器名称为中断偏移量寄存器。 这个寄存器说明了 IRQ 模式下,哪个中断请求正在 INTPND 寄存器当中。在清零 SRCPND 和 INTPND 之后,这个寄存器自动清零。 8. PRIORITY REGISTER (PRIORITY) 此寄存器为中断优先级寄存器。 在此处需要讲述 S3C2410A 的中断优先级逻辑。图 5.1.1 为 S3C2410A 的中断优先级 产生模块。32 个中断请求的

11、优先级逻辑由 7 级判决器组成,其中有 6 个 fisrt-level 判决器 和 1 个 second-level 判决器。每个中断判决器基于 1 个 bit 模式控制(ARB_MODE)和 2 个 bit 选择控制信号(ARB_SEL)来处理中断请求。如图 5.1.1 所示,从 05 六个判决器 中生成 REQ0REQ6 六个中断请求,再由判决器 6 生成最终的中断请求。 优先级规则为: 如果 ARB_SEL 为 00,那么优先级顺序由高到低为 REQ0、 REQ1、REQ2、REQ3 、REQ4、REQ5。 如果 ARB_SEL 为 01,那么优先级顺序由高到低为 REQ0、 REQ2、

12、REQ3、REQ4 、REQ1、REQ5。 如果 ARB_SEL 为 10,那么优先级顺序由高到低为 REQ0、 REQ3、REQ4、REQ1 、REQ2、REQ5。 如果 ARB_SEL 为 11,那么优先级顺序由高到低为 REQ0、 REQ4、REQ1、REQ2 、REQ3、REQ5。 注:判决器中 REQ0 永远是优先级最高的,REQ5 永远是优先级最低的,改变 ARB_SEL 的值可以重新排列 REQ1REQ5 的优先级次序。 如果 ARB_MODE 被设置为“0”,那么 ARB_SEL 的值就不会自动改变,则判决器 会工作在固定优先级的模式(我们可以手动改变优先级)。 如果 ARB_

13、MODE 被设置为“1”,那么 ARB_SEL 就处于滚动模式。例如:如果 REQ1 输出请求,ARB_SEL 就会自动变为“01”,然后 REQ1 就会被放到最低优先级 REQ5 的前面一级。 ARB_SEL 的变化规律为: 如果 REQ0 和 REQ5 输出请求,则 ARB_SEL 保持不变; 如果 REQ1 输出请求,则 ARB_SEL 变为 01; 如果 REQ2 输出请求,则 ARB_SEL 变为 10; 如果 REQ3 输出请求,则 ARB_SEL 变为 11; 如果 REQ4 输出请求,则 ARB_SEL 变为 00; 图 5.1 5.2 程序分析 此程序用定时器中断来控制两个

14、LED 闪烁。定时器的内容下一章再具体讲述。 1. 中断初始化程序 void Isr_Init(void) pISR_UNDEF = (unsigned)HaltUndef;/调试信息定义 pISR_SWI = (unsigned)HaltSwi; /调试信息定义 pISR_PABORT = (unsigned)HaltPabort; /调试信息定义 pISR_DABORT = (unsigned)HaltDabort; /调试信息定义 rINTMOD = 0x0; rINTMSK = BIT_ALLMSK; rINTSUBMSK = BIT_SUB_ALLMSK; 在程序中,调试信息定义不用

15、去理睬,实际程序中没有这些调试信息程序一样能够正 常工作。有关中断的寄存器定义全部都在文件 2410ADDR.H 中,读者可以自行查阅。 rINTMOD = 0x0;将 INTMOD 寄存器的所有值都设置为“0”,即全部中断都是 IRQ 中断。 rINTMSK = BIT_ALLMSK;将 INTMSK 寄存器的所有值都设置为“1”,即屏蔽所有中 断。BIT_ALLMSK 在文件 2410ADDR.S 中有定义,BIT_ALLMSK= 0xffffffff。 rINTSUBMSK = BIT_SUB_ALLMSK;将 INTSUBMSK 寄存器的所有值都设置为 “1”, 即屏蔽所有子中断。BI

16、T_SUB_ALLMSK 在 2410ADDR.H 中进行了定义,#define BIT_SUB_ALLMSK (0x7ff),即 BIT_SUB_ALLMSK=0x7ff。 2. 定时器中断初始化 void Timer1INT_Init(void) if (rINTPND pISR_TIMER1 = (int)Timer1_ISR; rINTMSK /开中断; BIT_TIMER1 在文件 2410ADDR.S 中有定义,BIT_TIMER1= 0x111,rINTPND 即 SRCPND11 =1。 pISR_TIMER1 在文件 2410ADDR.S 中有定义,它是定时器 1 中断服务函

17、数的入口, Timer1_ISR 是中断服务函数, pISR_TIMER1 = (int)Timer1_ISR;就是将中断服务函数的地 址赋给定时器 1 中断服务函数的入口。rINTMSK 即 INTPND11=0, 开启定时器 1 中断。 3. 中断服务函数 int flag; void _irq Timer1_ISR( void ) if (flag = 0) rGPGDAT = rGPGDAT flag = 1; else rGPGDAT = rGPGDAT flag = 0; rSRCPND |= BIT_TIMER1;/清除中断挂起条件 rINTPND |= BIT_TIMER1;/

18、清除中断挂起条件 void _irq Timer1_ISR( void )为中断服务函数的固定写法, Timer1_ISR 为中断函数 名,这个函数名可以根据不同的中断加以修改。一旦定时器 1 中断,那么程序就会自动跳 转到这里执行中断处理函数,执行完毕后返回程序中断前的位置继续执行后面的程序。 在这个程序中 if else 结构里的程序就是让两个 LED 闪烁。在中断服务程序中需要特 别注意的是最后两句程序,rSRCPND |= BIT_TIMER1;是清除源挂起寄存器中定时器 1 的 中断请求;rINTPND |= BIT_TIMER1;是清除中断挂起寄存器中定时器 1 的中断请求。只 有执行了这两句后,定时器 1 中断条件才被清除,否则 CPU 会一直认为定时器 1 有可用 的中断请求。 以上三个函数就是中断处理所必须的基本函数。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。