No.64648 作者:quqw 邮件:quqw@qq.com ID:133208 登陆:4次 文章数:2篇 最后登陆IP:202.111.7.4 最后登陆:2009/5/5 16:42:08 注册:2009/4/7 22:11:20 财富:108 发帖时间:2009/4/7 22:22:00 发贴者IP:121.235.42.90 标题:quqw:自学arm遇到中断方面问题,s3c44b0进入中断服务程序后无法返回。 摘要:No.64648自学arm遇到中断方面问题,s3c44b0进入中断服务程序后无法返回。 我正在自学arm,中断方面遇到一些问题,rINTCON=0x5;时中断能够服务,但是无法返回。 rINTCON=0x1;中断产生时直接重启。有没有谁能帮我解释一下?谢谢!主要代码如下 void __irq EINT4567Isr(void) { rI_ISPC|=BIT_EINT4567; Uart_Printf("%dinterrupt happen\r\nINTPEND=%x\r\nr_ISPR=%x\r\n\r\n",temp++,rINTPND,rI_ISPR); Uart_GetString(buf); //while(1); } void Main(void) { #if (PLLON==1) ChangePllvalue(PLL_M,PLL_P,PLL_S); #endif Port_Init (); Uart_Init (0,115200); Uart_Select (0); Isr_Init(); while(1) { ; } } void Isr_Init(void) { rINTCON=0x5; // Vectored Int. IRQ enable,FIQ disable rINTMOD =0; rINTMSK |=BIT_GLOBAL; //disabled int //以下针对特定的中断口做初始化 rPCONG = rPCONG | 0xff00; //set GPG[7:4] interrupt rPUPG = rPUPG & 0x00;//pull up resistor disable setLLInt(4); setLLInt(5); setLLInt(6); setLLInt(7); rEXTINT &= 0xffff; rINTPND=0; rEXTINTPND=0; pISR_EINT4567=(unsigned)EINT4567Isr; pISR_TIMER1=(unsigned)TIMER1Isr; rINTMSK &=~(BIT_GLOBAL|BIT_EINT4567); } 启动代码如下: ; ******************************************************* ; * NAME : 44BINIT.S * ; * Version : 10.JAn.2003 * ; * Description: * ; * C start up codes * ; * Configure memory, Initialize ISR ,stacks * ; * Initialize C-variables * ; * Fill zeros into zero-initialized C-variables * ; ******************************************************* GET ..\inc\option.s GET ..\inc\memcfg.s ;Interrupt Control INTPND EQU 0x01e00004 INTMOD EQU 0x01e00008 INTMSK EQU 0x01e0000c I_ISPR EQU 0x01e00020 I_CMST EQU 0x01e0001c ;Watchdog timer WTCON EQU 0x01d30000 ;Clock Controller PLLCON EQU 0x01d80000 CLKCON EQU 0x01d80004 LOCKTIME EQU 0x01d8000c ;Memory Controller REFRESH EQU 0x01c80024 ;Pre-defined constants USERMODE EQU 0x10 FIQMODE EQU 0x11 IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABORTMODE EQU 0x17 UNDEFMODE EQU 0x1b MODEMASK EQU 0x1f NOINT EQU 0xc0 ;check if tasm.exe is used. GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 | THUMBCODE SETL {FALSE} ] [ THUMBCODE CODE32 ;for start-up code for Thumb mode ] MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address) ldr r0,=$HandleLabel;load the address of HandleXXX to r0 ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) MEND IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialise IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialise IMPORT Main ; The main entry of mon program EXPORT __ENTRY AREA Init,CODE,READONLY __ENTRY b ResetHandler ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ ;0x18 b HandlerFIQ ;***IMPORTANT NOTE*** ;If the H/W vectored interrutp mode is enabled, The above two instructions should ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. ; b HandlerIRQ -> subs pc,lr,#4 ; b HandlerIRQ -> subs pc,lr,#4 VECTOR_BRANCH ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table ldr pc,=HandlerEINT1 ; ldr pc,=HandlerEINT2 ; ldr pc,=HandlerEINT3 ; ldr pc,=HandlerEINT4567 ; ldr pc,=HandlerTICK ;mGA b . b . ldr pc,=HandlerZDMA0 ;mGB ldr pc,=HandlerZDMA1 ; ldr pc,=HandlerBDMA0 ; ldr pc,=HandlerBDMA1 ; ldr pc,=HandlerWDT ; ldr pc,=HandlerUERR01 ;mGB b . b . ldr pc,=HandlerTIMER0 ;mGC ldr pc,=HandlerTIMER1 ; ldr pc,=HandlerTIMER2 ; ldr pc,=HandlerTIMER3 ; ldr pc,=HandlerTIMER4 ; ldr pc,=HandlerTIMER5 ;mGC b . b . ldr pc,=HandlerURXD0 ;mGD ldr pc,=HandlerURXD1 ; ldr pc,=HandlerIIC ; ldr pc,=HandlerSIO ; ldr pc,=HandlerUTXD0 ; ldr pc,=HandlerUTXD1 ;mGD b . b . ldr pc,=HandlerRTC ;mGKA b . ; b . ; b . ; b . ; b . ;mGKA b . b . ldr pc,=HandlerADC ;mGKB b . ; b . ; b . ; b . ; b . ;mGKB b . b . ;0xe0=EnterPWDN ldr pc,=EnterPWDN LTORG HandlerFIQ HANDLER HandleFIQ HandlerIRQ HANDLER HandleIRQ HandlerUndef HANDLER HandleUndef HandlerSWI HANDLER HandleSWI HandlerDabort HANDLER HandleDabort HandlerPabort HANDLER HandlePabort HandlerADC HANDLER HandleADC HandlerRTC HANDLER HandleRTC HandlerUTXD1 HANDLER HandleUTXD1 HandlerUTXD0 HANDLER HandleUTXD0 HandlerSIO HANDLER HandleSIO HandlerIIC HANDLER HandleIIC HandlerURXD1 HANDLER HandleURXD1 HandlerURXD0 HANDLER HandleURXD0 HandlerTIMER5 HANDLER HandleTIMER5 HandlerTIMER4 HANDLER HandleTIMER4 HandlerTIMER3 HANDLER HandleTIMER3 HandlerTIMER2 HANDLER HandleTIMER2 HandlerTIMER1 HANDLER HandleTIMER1 HandlerTIMER0 HANDLER HandleTIMER0 HandlerUERR01 HANDLER HandleUERR01 HandlerWDT HANDLER HandleWDT HandlerBDMA1 HANDLER HandleBDMA1 HandlerBDMA0 HANDLER HandleBDMA0 HandlerZDMA1 HANDLER HandleZDMA1 HandlerZDMA0 HANDLER HandleZDMA0 HandlerTICK HANDLER HandleTICK HandlerEINT4567 HANDLER HandleEINT4567 HandlerEINT3 HANDLER HandleEINT3 HandlerEINT2 HANDLER HandleEINT2 HandlerEINT1 HANDLER HandleEINT1 HandlerEINT0 HANDLER HandleEINT0 ;One of the following two routines can be used for non-vectored interrupt. IsrIRQ ;using I_ISPR register. sub sp,sp,#4 ;reserved for PC stmfd sp!,{r8-r9} ;IMPORTANT CAUTION ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine. ldr r9,=I_ISPR ldr r9,[r9] mov r8,#0x0 0 movs r9,r9,lsr #1 bcs %F1 add r8,r8,#4 b %B0 1 ldr r9,=HandleADC add r9,r9,r8 ldr r9,[r9] str r9,[sp,#8] ldmfd sp!,{r8-r9,pc} ;**************************************************** ;* START * ;**************************************************** ResetHandler ldr r0,=WTCON ;watch dog disable ldr r1,=0x0 str r1,[r0] ldr r0,=INTMSK ldr r1,=0x07ffffff ;all interrupt disable str r1,[r0] ;**************************************************** ;* Set c ......
>>返回讨论的主题
|