




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、分类:ARM7学习 字号:大中小 在设计涉及到外中断的时候,比如按键中断就要研究一下怎么编了: 这里对 EINT4567研究: 首先ARM芯片要中断设置要使能中断向量,然后当有 IRQ中断来之后,CPU 自动的到0 x18地址处取指。0 x18处的指令呢是CPU根据中断源算好的(比如: 中断EINT4567来了,那么0 x18处的指令就是跳转到地址 0 x30处)。然后就 执行“ldrpc,=HandlerEINT4567 ”这条指令。这条指令的执行结果就是跳转到 “ HandlerEINT4567 HANDLER HandleEINT4567 ”处执行。这条是宏指令,你可 以看一下宏定义。执
2、行结果就是跳转到HandleEINT4567处执行。 那么HandleEINT4567处又是什么指令呢?这就要联系 44b.h文件的#define pISR_EINT4567 (*(u nsig ned *)(_ISR_STARTADDRESS+0 x74) 定义看了。 HandleEINT4567 处的地址就是 “_ISR_STARTADDRESS+0 x”4。到此还不知 道这个地址对应的指令是什么。 这时候就要去看Target.c文件的中断初始化了,其中pISR_EINT4567= (un sig ned) OSEINT4567ISR;这条语句就解释了中断去向何处。 OSEINT4567I
3、SR 就是在OS_CPU_A.s里面定义的中断处理程序了。 一、关于44B0中断系统。 44B0中断系统中有两张中断转移表,经过二重转移才跳到中断处理程序。第 一张中断向量表由硬件决定,所在区域为ROM(flash),地址空间从0X00开 始,其中0X00-0X1C 为异常向量入口地址,0X20-0XC0为中断向量入口地址。 另一张中断向量表在RAM中,可以随便改,其位置在程序连接后才定。 二、如何从第一张中断向量表跳到第二张中断向量表。 由于RAM放在地址空间的高端(距离中断向量超过了 32M),故在第一张中 断向量表对应位置上写上 ldr PC,# in terrupt_service 如
4、:ldr PC,=HandlerEINT4567 三、 如何在启动程序中设置异常向量,中断向量表。如何把C语言中的一个中 断函数对应到汇编的中断向量表中,示意图及举例如下: #defi ne _ISR_STARTADDRESS0 xc7fff00GCS6:16Mbit DRAM/SDRAM #defi ne pISR_EINT4567 (*(u nsig ned *)(_ISR_STARTADDRESS+0 x74) .macro HANDLER Han dleLabel subsp, sp, #4 stmfdsp!, r0 ldrr0,=Ha ndleLabel ldrr0, r0 str
5、r0, sp,# 4 ldmfd sp!, r0,pc .endm .text ENTRY: b ResetHa ndler VECTOR_BRANCH: Idr pc,=Ha ndlerEINTO ldr pc,=HandlerEINT4567 /* 0 x30 */ HandlerEINT4567:HANDLER HandleEINT4567 .equ HandleEINT4567, _ISR_STARTADDRESS+4*29 把C语言中的一个中断函数对应到汇编的中断向量表中 pISR_EINT4567 = (int)Eint4567Isr; 其实异常向量就是中断向量, ARM7 的内核
6、实际上只有 8 个(1 个保留)异常向 量,对于众多的中断源, ARM7 的内核是通过 IRQ、FRQ 的软件查询中断状态 寄存器的位来获得 ISR 的起始地址。而 44BO 为了克服这种方式所带来的中断延 迟,就加入了更多的中断向量表(0 x20到OxcO),要使用这种方式,必须在中断 控制寄存器中设置每个中断源的方式为 IRQ 方式,且使用向量中断。 S3C44B0X的中断控制器有30个中断源。S3C44B0X支持新的中断处理模式称 为(vectored interrupt mode ),在多个中段请求发生时,由硬件优先级逻辑确 定应该有哪个中断得到服务,同时硬件逻辑使中断相量表的跳转指令
7、加载到 (0X18或0X1C )位置,在该位置执行跳转指令使程序跳到相应的中断服务线 程,因此相对与传统的 ARM 的软件方法能够大大减少中断进入延时。有两种类 型的中断模式,FIQ (快速中断)和IRQ.所有的中断源在中断请求时应该确定 使用的 中断模式。在网络上广为流传的 44b0 开发板例程中,大部分使用的都是 IRQ 中 断模式(请查阅 寄存器 rINTCON )。 一般来讲,使用 44b0 开发板进行调试时,无需更改 44b.h,44blib.h,def.h,option.h,44binit.s,44blib.c,44blib_a.s,memcfg.s,option.s 等程序,甚至
8、无需看懂,即可编程使用 44b0 开发板。如前所述,硬件逻辑使中 断相量表的跳转指令加载到(0X18或0X1C )位置,在该位置执行跳转指令使 程序跳到相应的中断服务线程,用户只需定义相应的中断服务程序即可。中断向 量表的定义如下 (节选,请看 44b.h) /* ISR */ #define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0 x0) #define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0 x4) #define pISR_SWI (*(unsigned *)(_ISR_STARTAD
9、DRESS+0 x8) #define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0 xc) #define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0 x10) #define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0 x14) #define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0 x18) #define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+
10、0 x1c) #define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0 x74) #define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0 x78) #define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0 x7c) #define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0 x80) #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0
11、x84) 用户定义相应的中断服务程序,可以参考该语句, pISR_EINT4567=(unsigned)Key_Int;/ 将外部中断 4567 产生的中断,指向函数 Key_Init 当然,用户也可以根据自己的爱好,任意改变函数名, pISR_EINT4567=(unsigned)MyCat ; /函数名由用户定义 最好在程序开头声明一下, void _irq Mycat(void); 显然,至此可以基本理解 44b0 的中断,是如何与程序中的中断服务子程序联系 起来的了。中断的硬件逻辑,将检测到的中断,以某种方式指向中断服务程序的 地址,该地址在头文件中以宏定义的形式出现。用户在自己的程序
12、中,将中断服 务子程序的地址付给该指针,从而将其联系起来。 ARM7TDMI 在矢量模式下,当从 0X18 地址处取指令时候,中断控制器会在数 据总线上加载分支指令 ,这些分支指令使程序计数器能够对应到每一个中断源的 向量地址。这些跳转到每一个中断源向量地址的分支指令由中断控制器产生。 例如:假设EINTO是IRQ中断,EINTO的向量地址为:0X20 (见向量表),那 么中断控制器必须产生 0X18-0X20 的分支指令。 中断控制器产生的机器码为 : 0XEA000000 。在各个中断源对应的中断向量地址中,存放着跳转到相应中断服 务程序的程序代码。在相应向量地址处分支指令的机器代码如下计
13、算: 矢量中断模式的机器指令代码=0XEA000000+(v目标地址 -0X8)2) 机器代码一般由反汇编后自动产生。 结合这些,再看看程序中的代码。在无矢量中断模式,通过分析 IISPR/FISPR 寄存器,IRQ/FIQ处理器将移动PC到相应的ISR。HandleXXX地址包含每个 响应的 ISR 程序的起始地址。(见 44binit.S 文件) 编译器它自动有设置的(初始化的伪编译宏), |Image$RO$Limit| :表示 RO 区末地址后面的地址,即 RW 数据源的起始地 址 |lmage$RW$Base| : RW区在RAM里的执行区起始地址,也就是编译器选项 RW_Base
14、指定的地址 |Image$ZI$Base| : ZI 区在 RAM 里面的起始地址 |Image$ZI$Limit| : ZI 区在 RAM 里面的结束地址后面的一个地址 程序先把ROM里|lmage$RO$Limt|开始的RW 初始数据拷贝到 RAM里面 |Image$RW$Base| 开 始 的 地 址 , 当 RAM 这 边 的 目 标 地 址 到 达 |Image$ZI$Base| 后就表示 RW 区的结束和 ZI 区的开始,接下去就对这片 ZI 区进行清零操作,直到遇到结束地址 |Image$ZI$Limit| 面举例一个实际的程序设计方法: ARM44B0 实验 :外部中断测试实验
15、 一、实验预备知识 实现外部中断编程的一般步骤: ( 1)I/O 口设置 rPCONG=0 xff00;/0 xffff;keyint 47 rPUNPG=0 x00; 采用内部上拉。 (2)外部中断触发模式设置: rEXTINT=0 x22222222; /Falling edge mode rEXTINT=0 x4444444 ; /Rising edge mode rEXTINT=0 x777777;/Both Edge trigger mode rEXTINT=0 x0;/ Low level trigger mode (2) EXINT reg 设置 将 EXINT 47 设置为 I
16、RQ mode rINTCON=0 x5; rINTMOD=0 x0; /All=IRQ mode 修改中断处理指针 pISR_EINT4567=(unsigned)Key_Int; 开启中断 rINTMSK=(BIT_GLOBAL|BIT_EINT4567); /start INT 中断测试程序编写: oid Key_Init(void) rINTCON=0 x5; rINTMOD=0 x0; /All=IRQ mode / rEXTINT=0 x22222222; /Falling edge mode rEXTINT=0 x0; /0 level mode rPCONG=0 xffff;
17、/EINT70 rPUPG=0 x0; /pull up enable pISR_EINT4567=(unsigned)Key_Int; rINTMSK=(BIT_GLOBAL|BIT_EINT4567); /start INT 编写好了,编写中断处理程序: oid _irq Key_Int(void) which_int=rEXTINTPND;/ 识别是那个中断 rEXTINTPND=0 xf; /clear EXTINTPND reg. rI_ISPC=BIT_EINT4567; /clear pending_bit (处理模块) 本次实验任务:按键中断,并使相应 LED 亮起来,按 EX
18、INT4 则第一 个 LED 亮,依次类推。 处理程序 switch(which_int) case 1: Uart_Printf(EINT4 had been occured.n); Led_Display(1); which_int=0; break; case 2: Uart_Printf(EINT5 had been occured.n); Led_Display(2); which_int=0; break; case 4: Uart_Printf(EINT6 had been occured.n); Led_Display(4); which_int=0; break; case
19、8: Uart_Printf(EINT7 had been occured.n); Led_Display(0); which_int=0; break; default : break; / 注意理解上面程序。 实验结果: * FS44B0X FS44B0X key1 key2 key3 key4!EINT4 had been occured. EINT4 had been occured. EINT4 had been occured. EINT4 had been occured. EINT4 had been occured. EINT4 had been occured. EINT4
20、 had been occured. * * 开发板上 LED 的闪亮随按键依次变化。 实验例程序附录如下: i nclude option.h i nclude def.h i nclude 44b.h i nclude 44blib.h volatile char which_int=0; void _irq Key_Int(void) which_int=rEXTINTPND; rEXTINTPND=0 xf; /clear EXTINTPND reg. rI_ISPC=BIT_EINT4567; /clear pending_bit switch(which_int) case 1: Uart_Printf(EINT4 had been occured.n); Led_Display(1); which_int=0; break; case 2: Uart_Printf(EINT5 had been occured.n); Led_Display(2); which_int=0; break; case 4: Uart_Printf(EINT6 had been occured.n); Le
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 桩基冬季施工方案
- 农业项目资金筹措方案
- 汽车行业基础知识
- 大理石楼地面施工方案
- 红砖建筑加固施工方案
- 2025年非调质钢项目发展计划
- 山东省滨州市邹平市2024-2025学年七年级上学期期末考试数学试卷(原卷版+解析版)
- 非机动车棚工程施工方案
- 随州钢结构农村房施工方案
- 沂源公路标志牌施工方案
- 前言 马克思主义中国化时代化的历史进程与理论成果
- 思想道德与法治2023版教学设计第二章 追求远大理想 坚定崇高信念
- 21ZJ111 变形缝建筑构造
- 电子商务概论目录
- 装修返工合同
- 高等数学考研辅导课(一)学习通超星课后章节答案期末考试题库2023年
- 消力池砼施工工法
- 国家职业类别1-6类明细表
- 中国文艺美学要略·论著·《画学心法问答》
- 如何建立卓越地价值观
- 舞台搭建方面基础知识
评论
0/150
提交评论