第七章EINT外部中斷_第1頁
第七章EINT外部中斷_第2頁
第七章EINT外部中斷_第3頁
第七章EINT外部中斷_第4頁
第七章EINT外部中斷_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、EINT外部中斷1、 ARM異常中斷IRQ(一般中斷)和FIQ(快速中斷)不是具體的中斷源,而是中斷的類型。我們是可以將一個中斷源的類型設置成FIQ也可以設置成IRQ。在使用FIQ響應的時間比IRQ要短,其他方面沒有什么區(qū)別。但是一般情況下,在一個平臺內(nèi),我們只能將一個中斷源設置成FIQ。2、 S5PV210的中斷源1、 總共有93個,其中外部中斷有32個。2、 93個中斷源分成了4個中斷控制器(VIC)3、 具體中斷源(210手冊p1-5)注意:所有的中斷源產(chǎn)生的中斷最終都有VIC0中斷控制器提交給S5PV210內(nèi)核,所以,在中斷服務函數(shù)中做清除中斷處理時,要將4個的VICADDRESS寄存

2、器都要做寫操作。3、 外部中斷設計流程中斷控制:1)程序狀態(tài)寄存器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的觸發(fā)方式3、 設置外部中斷的濾波器4、外部中斷pending(判斷/清除寄存器)5、 外部中斷的開關(guān)(屏蔽)寄存器6、 設置

4、中斷類型EINT16->VIC0INTSELECT7、中斷向量地址寄存器1) VIC0ADDRESS讀:該寄存器放置的是正在響應的入口中斷處理程序的入口地址。該入口地址是在對應中斷源向量地址寄存器(VIC0VECTADDRn)中初始化的。寫:向該寄存器寫0,用來清除中斷。2) VIC0VECTADDRn在中斷初始化的時候,將中斷處理程序的入口地址保存到該寄存器。8、 中斷的開關(guān)寄存器7、 程序的設計1、 程序入口(start.S).global _start.global IRQ_handle_start:ldrsp, =0x40000000初始化棧,stack放在DDR2mov r0,

5、 #0x53msr CPSR_cxsf, r0 ARM進入管理模式,并關(guān)閉FIQ、打開IRQbl clock_init初始化210的系統(tǒng)時鐘b main調(diào)用了main,進入中斷初始化IRQ_handle: IRQ中斷的處理程序,在ARM響應IRQ中斷時,會進入該程序ldr sp, =0xD0037F80 初始化IRQ模式的stacksub lr, lr, #4修正返回地址stmfd sp!, r0-r12, lr 保存現(xiàn)場,入棧blIrq_Isr調(diào)用C環(huán)境的程序,去處理IRQ中斷,在Irq_Isr函數(shù)中,確定中斷源。ldmfd sp!, r0-r12, pc 退出現(xiàn)場,并實現(xiàn)中斷的返回2、ma

6、in函數(shù)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中斷初始化函數(shù)/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安裝函數(shù)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上放一個跳轉(zhuǎn)到IRQ中斷處理的函數(shù)位置。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)函數(shù)做了下面工作: pExceptionIRQ =(unsigned long)IRQ_handle;/IRQ3、 PC=IRQ_handle我們在start.s中,由如下代碼:IRQ_handle:ldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, r0-r12, lr/入棧,現(xiàn)場保存,和返回地址blIrq_Isrldmfd sp!, r0-r12, pc/出棧,現(xiàn)場恢復,PC=lr4、 PC=

16、Irq_Isr我們在int.c源文件中定義了函數(shù)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里面調(diào)用函數(shù)intc_setvectaddr(NUM_EINT16_31, isr_key);,下一步分析ntc_setvectaddr(),該函數(shù)定義在int.c。7、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論