导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[quqw]自学arm遇到中断方面问题,s3c44b



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 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:47毫秒 最大:7276毫秒 查询6次