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?