Problem with vector table and interrupt handler

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Problem with vector table and interrupt handler

3,254 次查看
phil1
Contributor I

I inherited a firmware project that is supposed to be mostly complete with some cleanup required (debounce switches, etc.).  It uses an NXP LPC1756, the IDE is IAR Embedded Workbench (8.11) for ARM, and the debugger is a J-Link .  It compiles and links without error and downloads to the target with any problem.  It has one interrupt handler and that's where I'm having a problem.  Stepping through the code in the initialization stage, it comes to the point where it sets the interrupt enable in the NVIC for the SSP1 peripheral and immediately hangs up in the B Default_Handler.  

Here is the cstartup_M.s file that was provided with the project:

; Cortex-M version
;
        MODULE  ?cstartup
        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION .intvec:CODE:NOROOT(2)
        EXTERN  __iar_program_start
        PUBLIC  __vector_table
        PUBLIC  __vector_table_0x1c
        DATA
__vector_table
        DCD     sfe(CSTACK)                 ; Top of Stack
        DCD     __iar_program_start         ; Reset Handler
        DCD     NMI_Handler                 ; NMI Handler
        DCD     HardFault_Handler           ; Hard Fault Handler
        DCD     MemManage_Handler           ; MPU Fault Handler
        DCD     BusFault_Handler            ; Bus Fault Handler
        DCD     UsageFault_Handler          ; Usage Fault Handler
__vector_table_0x1c
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     SVC_Handler                 ; SVCall Handler
        DCD     DebugMon_Handler            ; Debug Monitor Handler
        DCD     0                           ; Reserved
        DCD     PendSV_Handler              ; PendSV Handler
        DCD     SysTick_Handler             ; SysTick Handler
        DCD     WDT_IRQHandler              ; Watchdog Handler
        DCD     TMR0_IRQHandler             ; TIMER0 Handler
        DCD     TMR1_IRQHandler             ; TIMER1 Handler
        DCD     TMR2_IRQHandler             ; TIMER2 Handler
        DCD     TMR3_IRQHandler             ; TIMER3 Handler
        DCD     UART0_IRQHandler            ; UART0 Handler
        DCD     UART1_IRQHandler            ; UART1 Handler
        DCD     UART2_IRQHandler            ; UART2 Handler
        DCD     UART3_IRQHandler            ; UART3 Handler
        DCD     PWM1_IRQHandler             ; PWM1 Handler
        DCD     I2C0_IRQHandler             ; I2C0 Handler
        DCD     I2C1_IRQHandler             ; I2C1 Handler
        DCD     I2C2_IRQHandler             ; I2C2 Handler
        DCD     SPI_IRQHandler              ; SPI Handler
        DCD     SSP0_IRQHandler             ; SSP0 Handler
        DCD     SSP1_IRQHandler             ; SSP1 Handler
        DCD     PLL0_IRQHandler             ; PLL0 Handler
        DCD     RTC_IRQHandler              ; RTC Handler
        DCD     EINT0_IRQHandler            ; EXT Interupt 0 Handler
        DCD     EINT1_IRQHandler            ; EXT Interupt 1 Handler
        DCD     EINT2_IRQHandler            ; EXT Interupt 2 Handler
        DCD     EINT3_IRQHandler            ; EXT Interupt 3 Handler
        DCD     ADC_IRQHandler              ; ADC Handler
        DCD     BOD_IRQHandler              ; BOD Handler
        DCD     USB_IRQHandler              ; USB Handler
        DCD     CAN_IRQHandler              ; CAN Handler
        DCD     GPDMA_IRQHandler            ; General Purpose DMA Handler
        DCD     I2S_IRQHandler              ; I2S Handler
        DCD     Ethernet_IRQHandler         ; Ethernet Handler
        DCD     RIT_IRQHandler              ; Repetitive Interrupt Timer Handler
        DCD     MotorControlPWM_IRQHandler  ; Motor Control PWM Handler
        DCD     QE_IRQHandler               ; Quadrature Encoder Handler
        DCD     PLL1_IRQHandler             ; PLL1 Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
      PUBWEAK NMI_Handler
      PUBWEAK HardFault_Handler
      PUBWEAK MemManage_Handler
      PUBWEAK BusFault_Handler
      PUBWEAK UsageFault_Handler
      PUBWEAK SVC_Handler
      PUBWEAK DebugMon_Handler
      PUBWEAK PendSV_Handler
      PUBWEAK SysTick_Handler
      PUBWEAK WDT_IRQHandler
      PUBWEAK TMR0_IRQHandler
      PUBWEAK TMR1_IRQHandler
      PUBWEAK TMR2_IRQHandler
      PUBWEAK TMR3_IRQHandler
      PUBWEAK UART0_IRQHandler
      PUBWEAK UART1_IRQHandler
      PUBWEAK UART2_IRQHandler
      PUBWEAK UART3_IRQHandler
      PUBWEAK PWM1_IRQHandler
      PUBWEAK I2C0_IRQHandler
      PUBWEAK I2C1_IRQHandler
      PUBWEAK I2C2_IRQHandler
      PUBWEAK SPI_IRQHandler
      PUBWEAK SSP0_IRQHandler
      PUBWEAK SSP1_IRQHandler
      PUBWEAK PLL0_IRQHandler
      PUBWEAK RTC_IRQHandler
      PUBWEAK EINT0_IRQHandler
      PUBWEAK EINT1_IRQHandler
      PUBWEAK EINT2_IRQHandler
      PUBWEAK EINT3_IRQHandler
      PUBWEAK ADC_IRQHandler
      PUBWEAK BOD_IRQHandler
      PUBWEAK USB_IRQHandler
      PUBWEAK CAN_IRQHandler
      PUBWEAK GPDMA_IRQHandler
      PUBWEAK I2S_IRQHandler
      PUBWEAK Ethernet_IRQHandler
      PUBWEAK RIT_IRQHandler
      PUBWEAK MotorControlPWM_IRQHandler
      PUBWEAK QE_IRQHandler
      PUBWEAK PLL1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
        THUMB
NMI_Handler
HardFault_Handler
MemManage_Handler
BusFault_Handler
UsageFault_Handler
SVC_Handler
DebugMon_Handler
PendSV_Handler
SysTick_Handler
WDT_IRQHandler
TMR0_IRQHandler
TMR1_IRQHandler
TMR2_IRQHandler
TMR3_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
UART2_IRQHandler
UART3_IRQHandler
PWM1_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI_IRQHandler
SSP0_IRQHandler
SSP1_IRQHandler
PLL0_IRQHandler
RTC_IRQHandler
EINT0_IRQHandler
EINT1_IRQHandler
EINT2_IRQHandler
EINT3_IRQHandler
ADC_IRQHandler
BOD_IRQHandler
USB_IRQHandler
CAN_IRQHandler
GPDMA_IRQHandler
I2S_IRQHandler
Ethernet_IRQHandler
RIT_IRQHandler
MotorControlPWM_IRQHandler
QE_IRQHandler
PLL1_IRQHandler
Default_Handler
        B Default_Handler
        END

However, looking at vector table in the disassembly starting at 0x0, it looks like this:

                  0x0: 0x28           DC8       40                      ; '('
__vector_table:
          0x1: 0x36           DC8       54                      ; '6'
          0x2: 0x1000         DC16      4096                    ; '..'
          0x4: 0x00029b21     DC32      __iar_program_start
          0x8: 0x00026497     DC32      ADC_IRQHandler
          0xc: 0x00026497     DC32      ADC_IRQHandler
         0x10: 0x00026497     DC32      ADC_IRQHandler
         0x14: 0x00026497     DC32      ADC_IRQHandler
         0x18: 0x00026497     DC32      ADC_IRQHandler
__vector_table_0x1c:
         0x1c: 0xeff137c4     DC32      __vector_table_value
         0x20: 0x00000000     DC32      0x0 (0)
         0x24: 0x00000000     DC32      0x0 (0)
         0x28: 0x00000000     DC32      0x0 (0)
         0x2c: 0x00026497     DC32      ADC_IRQHandler
         0x30: 0x00026497     DC32      ADC_IRQHandler
         0x34: 0x00000000     DC32      0x0 (0)
         0x38: 0x00026497     DC32      ADC_IRQHandler
         0x3c: 0x00026497     DC32      ADC_IRQHandler
         0x40: 0x00026497     DC32      ADC_IRQHandler
         0x44: 0x00026497     DC32      ADC_IRQHandler
         0x48: 0x00026497     DC32      ADC_IRQHandler
         0x4c: 0x00026497     DC32      ADC_IRQHandler
         0x50: 0x00026497     DC32      ADC_IRQHandler
         0x54: 0x00026497     DC32      ADC_IRQHandler
         0x58: 0x00026497     DC32      ADC_IRQHandler
         0x5c: 0x00026497     DC32      ADC_IRQHandler
         0x60: 0x00026497     DC32      ADC_IRQHandler
         0x64: 0x00026497     DC32      ADC_IRQHandler
         0x68: 0x00026497     DC32      ADC_IRQHandler
         0x6c: 0x00026497     DC32      ADC_IRQHandler
         0x70: 0x00026497     DC32      ADC_IRQHandler
         0x74: 0x00026497     DC32      ADC_IRQHandler
         0x78: 0x00026497     DC32      ADC_IRQHandler
         0x7c: 0x00026497     DC32      ADC_IRQHandler
         0x80: 0x00026497     DC32      ADC_IRQHandler
         0x84: 0x00026497     DC32      ADC_IRQHandler
         0x88: 0x00026497     DC32      ADC_IRQHandler
         0x8c: 0x00026497     DC32      ADC_IRQHandler
         0x90: 0x00026497     DC32      ADC_IRQHandler
         0x94: 0x00026497     DC32      ADC_IRQHandler
         0x98: 0x00026497     DC32      ADC_IRQHandler
         0x9c: 0x00026497     DC32      ADC_IRQHandler
         0xa0: 0x00026497     DC32      ADC_IRQHandler
         0xa4: 0x00026497     DC32      ADC_IRQHandler
         0xa8: 0x00026497     DC32      ADC_IRQHandler
         0xac: 0x00026497     DC32      ADC_IRQHandler
         0xb0: 0x00026497     DC32      ADC_IRQHandler
         0xb4: 0x00026497     DC32      ADC_IRQHandler
         0xb8: 0x00026497     DC32      ADC_IRQHandler
         0xbc: 0x00026497     DC32      ADC_IRQHandler
         0xc0: 0x00026497     DC32      ADC_IRQHandler
__iar_SB:
         0xc4: 0x000291c4     DC32      numerals_tens_minute

The other thing is that I can set breakpoints in the code anywhere except in the interrupt handler.  Looking in the .map file, I can't find any reference to the handler.  The interrupt handler is in a file that initializes an ADC and all the other functions in that file show up in the .map.  I suspect something is not right in setup in the project options, but I've experimented with everything I can think of without resolving the problem.

Has anyone seen anything like this?

0 项奖励
回复
2 回复数

3,131 次查看
phil1
Contributor I

Yes, it is: void SSP1_IRQHandler(void)

0 项奖励
回复

3,131 次查看
converse
Senior Contributor V

What is the name of your SSP interrupt handler? Unless it is
  SSP1_IRQHandler

(exactly as spelt) then you will use the default handler.
  

0 项奖励
回复