打印
[ZLG-ARM]

我的中断为什么响应不了啊?

[复制链接]
1694|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云痕|  楼主 | 2008-4-22 18:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
char *pUART0;  //这个是全局的
main ()
{
int i=1;
UART0_IRQ_init (9600);

VICIntSelect = 0 ;
VICIntEnClr = 1<<6;;
VICVectCntl5 = 0x20|6;           // UART0中断通道分5
VICVectAddr5 = (int)UART0_Handler;        // 设置UART0向量地址
VICIntEnable = 1<<6;            // 使能UART0中断

Uart0_SendString_IRQ(" 12345678901234567890123456789 ");

i=1; //标号2

while(1);

return 0;
}
void UART0_IRQ_init(int UART0_BPS)
{
uint16 Fdiv0;

PINSEL0 &= ~(0xF << 4); 
PINSEL0 |=  (0x5 << 4);  
          
    U0LCR = 0x83;     // 设置除数锁存位,DLAB = 1
    
    Fdiv0 = (Fpclk / 16) / UART0_BPS;  // 设置波特率
    U0DLM = Fdiv0 / 256;       
    U0DLL = Fdiv0 % 256;
    
    U0LCR = 0x03;    //清除锁存,并设置工作模式  
    
    U0FCR = 0x87;   // 使能FIFO,并设置触发点为8字节,复位T0FIFO,R0FIFO 
    U0IER &= 0xf0;   //中断禁止
    U0IER |= 0x03;  //RBA,THRE中断使能
    Fdiv0 = U0IIR; //清除 
}

void Uart0_SendString_IRQ(char *pt)
{
    int i;
    pUART0 = pt;
    while (!(U0LSR & 0x40))
          ;                      //等待发送缓冲为空
   
    U0TER = 0; //禁止发送
    for (i=16;i>0;i--)
        {
            if(*pUART0)
              U0THR = *pUART0++;
        }     
    U0TER = 0x80; //开始发送            编号1
}

void __irq UART0_Handler (void){...}  

仿真时,编号1执行后,U0IIR寄存器=c2,显示产生了发送中断,查看VICRawIntr和VICIRQStatus,都已经标识UART0已经产生了中断的,但是Uart0_SendString_IRQ一旦返回,
箭头到了标号2的行首时,U0IIR=C1,程序顺序执行,不会进入中断.我的芯片是LPC2378,启动代码用的NXP给的,相关部分:LDR  PC, [PC, #-0x0120]     ; Vector from VicVectAddr
最后的CPSR:  MSR     CPSR_c, #Mode_USR
               MOV     SP, R0
               SUB     SL, SP, #USR_Stack_Size

相关帖子

沙发
zlgarm| | 2008-4-22 21:16 | 只看该作者

您好

云痕,您好:
   您使用的仿真工具可否说一下,我们会把您的程序在我们的开发板上调试一下后再给您个回答。希望您的问题能早日解决

使用特权

评论回复
板凳
云痕|  楼主 | 2008-4-23 09:21 | 只看该作者

问题越来越复杂了

PRESERVE8

Vectors         LDR     PC, Reset_Addr         
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector 
                LDR     PC, [PC, #-0x0120]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0xB9206E28             ; Reserved Address 
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler


; Reset Handler

                EXPORT  Reset_Handler
Reset_Handler   

; Setup Stack for each mode
                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR
                MOV     SP, R0                 ;标号1
                SUB     SL, SP, #USR_Stack_Size
                
                IMPORT    TargetResetInit
                BL TargetResetInit
; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0


; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =Heap_Mem
                MOV   pc,lr

                END

这是全部的启动代码,箭头在标号1的行首时,User/system里的r0=0x0006AB0,点击单步执行step in后,立马死循环,停止后
 7fffe154 [0x6948499f]   dcd      0x6948499f  .IHi
此时User/system里的r0=0x27ffffff
感觉是存储配置出了问题,可是想不出原因

        

使用特权

评论回复
地板
云痕|  楼主 | 2008-4-23 09:26 | 只看该作者

我的仿真是AXD+H_JTAGV0.6.0

使用特权

评论回复
5
云痕|  楼主 | 2008-4-23 09:32 | 只看该作者

MOV SP, R0 执行后循环

MOV     SP, R0                 ;标号1
此句单步执行后,程序在下面2行循环:7fffe150 执行1次,7fffe154执行2次,不断循环
7fffe150 [0x6948499f]   dcd      0x6948499f  .IHi    
7fffe154 [0xd4fc0700]   dcd      0xd4fc0700  ....
 

使用特权

评论回复
6
云痕|  楼主 | 2008-4-23 09:55 | 只看该作者

启动代码在ARMUL里仿真不会出这问题

Vectors之前的定义:
Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F

I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled


;// <h> Stack Configuration (Stack Sizes in Bytes)
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
;// </h>

UND_Stack_Size  EQU     0x00000000
SVC_Stack_Size  EQU     0x00000100
ABT_Stack_Size  EQU     0x00000000
FIQ_Stack_Size  EQU     0x00000000
IRQ_Stack_Size  EQU     0x00000100
USR_Stack_Size  EQU     0x00000200

Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + 
                         FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

Stack_Top       EQU     Stack_Mem + Stack_Size


;// <h> Heap Configuration
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
;// </h>

Heap_Size       EQU     0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem        SPACE   Heap_Size

; Area Definition and Entry Point
;  Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ENTRY

用ARMUL脱离硬件仿真,这段启动代码能够顺利执行的,结果也都在预计中

使用特权

评论回复
7
云痕|  楼主 | 2008-4-23 13:19 | 只看该作者

后面的问题解决了,H-flash 和server不匹配,可中断还是老样子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

75

帖子

0

粉丝