版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EINT外部中断1、 ARM异常中断IRQ(一般中断)和FIQ(快速中断)不是具体的中断源,而是中断的类型。我们是可以将一个中断源的类型设置成FIQ也可以设置成IRQ。在使用FIQ响应的时间比IRQ要短,其他方面没有什么区别。但是一般情况下,在一个平台内,我们只能将一个中断源设置成FIQ。2、 S5PV210的中断源1、 总共有93个,其中外部中断有32个。2、 93个中断源分成了4个中断控制器(VIC)3、 具体中断源(210手册p1-5)注意:所有的中断源产生的中断最终都有VIC0中断控制器提交给S5PV210内核,所以,在中断服务函数中做清除中断处理时,要将4个的VICADDRESS寄存
2、器都要做写操作。3、 外部中断设计流程中断控制:1)程序状态寄存器CPSR的F位和I位 2)中断模式4、 S5PV210中断控制器的特点 Supports 93 vectored IRQ interrupts Fixed hardware interrupts priority levels Programmable interrupt priority levels Supports Hardware interrupt priority level masking Programmable interrupt priority level masking Generates IRQ and
3、 FIQ Generates Software interrupt Test registers Raw interrupt status Interrupt request status Supports Privileged mode for restricted access 5、 分析GEC210平台的原理图EINT16是一个二级中断,对应的一级入口是EINT16_31。6、 中断的初始化(设置SFR)1、 将GPH2_0设置成EINT162、 设置EINT16的触发方式3、 设置外部中断的滤波器4、外部中断pending(判断/清除寄存器)5、 外部中断的开关(屏蔽)寄存器6、 设置
4、中断类型EINT16->VIC0INTSELECT7、中断向量地址寄存器1) VIC0ADDRESS读:该寄存器放置的是正在响应的入口中断处理程序的入口地址。该入口地址是在对应中断源向量地址寄存器(VIC0VECTADDRn)中初始化的。写:向该寄存器写0,用来清除中断。2) VIC0VECTADDRn在中断初始化的时候,将中断处理程序的入口地址保存到该寄存器。8、 中断的开关寄存器7、 程序的设计1、 程序入口(start.S).global _start.global IRQ_handle_start:ldrsp, =0x40000000初始化栈,stack放在DDR2mov r0,
5、 #0x53msr CPSR_cxsf, r0 ARM进入管理模式,并关闭FIQ、打开IRQbl clock_init初始化210的系统时钟b main调用了main,进入中断初始化IRQ_handle: IRQ中断的处理程序,在ARM响应IRQ中断时,会进入该程序ldr sp, =0xD0037F80 初始化IRQ模式的stacksub lr, lr, #4修正返回地址stmfd sp!, r0-r12, lr 保存现场,入栈blIrq_Isr调用C环境的程序,去处理IRQ中断,在Irq_Isr函数中,确定中断源。ldmfd sp!, r0-r12, pc 退出现场,并实现中断的返回2、ma
6、in函数void isr_key(void) /EINT16中断处理程序GPJ2DAT = (1<<0);/toggle led intc_clearvectaddr(); / clear VIC0ADDRESS EXT_INT_2_PEND |= 1<<0; / clear pending bitint main(void)/GPJ2CON3:0 = 0001;GPJ2_0->outputGPJ2CON &= (0xf<<0);GPJ2CON |= (1<<0);/interrupt controller initint_init
7、(); GPH2CON |= 0xF;/ GPH2_0 -> EXT_INT16 /EXT_INT16: Falling edge triggeredEXT_INT_2_CON &= (7<0);EXT_INT_2_CON |= (2<<0);/initialize vector interrupt address with num of init and c_setvectaddr(NUM_EINT16_31, isr_key);/EINT16中断处理程序的安装 EXT_INT_2_MASK &= (1<<0); /unmas
8、ked EINT16intc_enable(NUM_EINT16_31); /enable EINT16_31while (1); /等待中断3、 IRQ中断初始化函数/exception and interrupt initializevoid int_init( void) /vector table of exception initialize pExceptionUNDEF =(unsigned long)exceptionundef;/undefine pExceptionSWI =(unsigned long)exceptionswi;/software interrupt pE
9、xceptionPABORT =(unsigned long)exceptionpabort;/pabort pExceptionDABORT =(unsigned long)exceptiondabort;/data abort pExceptionIRQ =(unsigned long)IRQ_handle;/IRQ中断处理程序的安装 pExceptionFIQ =(unsigned long)FIQ_handle;/FIQ /interrupt controller init /Disables Interrupt in VICxINTENABLE Register VIC0INTENC
10、LEAR = 0xffffffff; VIC1INTENCLEAR = 0xffffffff; VIC2INTENCLEAR = 0xffffffff; VIC3INTENCLEAR = 0xffffffff; /Selects interrupt type for interrupt request (IRQ) VIC0INTSELECT = 0x0; VIC1INTSELECT = 0x0; VIC2INTSELECT = 0x0; VIC3INTSELECT = 0x0; /*Contains the address of the currently active ISR, with r
11、eset value 0x00000000. A read of this register returns the address of the ISR and sets the current interrupt as being serviced. A read must be performed while there is an active interrupt. A write of any value to this register clears the current interrupt. A write must only be performed at the end o
12、f an interrupt service routine.*/ VIC0ADDRESS = 0; VIC1ADDRESS = 0; VIC2ADDRESS = 0; VIC3ADDRESS = 0;4、 具体中断源的ISR安装函数void intc_setvectaddr(unsigned long intnum, void (*handler)(void) /VIC0 if(intnum<32) *( (volatile unsigned long *)(VIC0VECTADDR + 4*intnum) ) = (unsigned)handler; /VIC1 else if(in
13、tnum<64) *( (volatile unsigned long *)(VIC1VECTADDR + 4*(intnum-32) ) = (unsigned)handler; /VIC2 else if(intnum<96) *( (volatile unsigned long *)(VIC2VECTADDR + 4*(intnum-64) ) = (unsigned)handler; /VIC3 else *( (volatile unsigned long *)(VIC3VECTADDR + 4*(intnum-96) ) = (unsigned)handler; ret
14、urn;8、 中断响应过程1) 异常中断的向量地址当ARM接收到IRQ中断后,PC就会指向0x0000_0018。一般在0x0000_0018上放一个跳转到IRQ中断处理的函数位置。2) S5PV210的BL0BL0是一个启动加载程序,存放在210的IROM,用户是不能改写的。BL0的作用:3) 中断的响应过程(EINT16)1、 当ARM接收到EINT16(IRQ)时,PC=0x0000_0018,IROM中BL0会将PC由0x0000_0018跳到IRAM中0xD003_7418。我们在int.h文件中定义如下:#define pExceptionIRQ( *(volatile unsig
15、ned long *)(0xD0037400 + 0x18) 2、 PC=pExceptionIRQ我们在int.c文件的 void int_init( void)函数做了下面工作: pExceptionIRQ =(unsigned long)IRQ_handle;/IRQ3、 PC=IRQ_handle我们在start.s中,由如下代码:IRQ_handle:ldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, r0-r12, lr/入栈,现场保存,和返回地址blIrq_Isrldmfd sp!, r0-r12, pc/出栈,现场恢复,PC=lr4、 PC=
16、Irq_Isr我们在int.c源文件中定义了函数Irq_Isr()void Irq_Isr(void)int i; unsigned long vicaddr4 = VIC0ADDRESS,VIC1ADDRESS,VIC2ADDRESS,VIC3ADDRESS; void (*isr)(void) = (void *)0; for(i=0; i<4; i+) if(intc_getvicirqstatus(i) != 0) isr = (void (*)(void) vicaddri; break; (*isr)();5、 PC->VIC0ADDRESS当EINT16有效的时候,VIC0ADDRESS=VIC0VECTADDR166、 PC->VIC0VECTADDR16我们在main.c里面调用函数intc_setvectaddr(NUM_EINT16_31, isr_key);,下一步分析ntc_setvectaddr(),该函数定义在int.c。7、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年知识产权授权委托合同书3篇
- 2025年都市悬疑微电影摄制与悬疑小说改编合同3篇
- 2024跨区域扶贫协作框架合同版B版
- 2024水电站设备维护与承包经营合同样本3篇
- 二零二五年度金融资产承债式收购股权转让及资产包交易合同3篇
- 2025年教育机构托管班教师职位聘用合同(全新版)2篇
- 2025年水塘承包渔业资源养殖与推广合同3篇
- 2024项目介绍居间合同协议
- 2024版无锡二手房买卖合同范本
- 2025年可视电话终端项目评估报告
- 第14课《叶圣陶先生二三事》导学案 统编版语文七年级下册
- 汽车配件购销合同范文
- 贵州省2024年中考英语真题(含答案)
- 施工项目平移合同范本
- 北师大版八年级上册数学期中综合测试卷(含答案解析)
- 幼儿园创意美劳培训
- 同济大学第四版线性代数课后习题答案
- 医疗领域人工智能技术应用的伦理与法规
- 工地春节停工复工计划安排
- 美容面部皮肤知识课件
- 胰岛素注射的护理
评论
0/150
提交评论