ImageVerifierCode 换一换
格式:DOC , 页数:8 ,大小:644KB ,
资源ID:4209299      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-4209299.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式技术应用教程——基于S3C2410第五章.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

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

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个工作日内予以改正。