Hello,
I'm using a lpc1766 and made a simple program to toggle a led from a timer interrupt. At first the interrupt vectors were in flash (see startup code below) and this worked just fine. So I assume that my timer initialisation and interrupt handling are ok.
Then I made a initialisation routine to copy the vector table to a ram table and then remap the vector table using the Vtor register.
When running the program it seems that the program constantly resets and thus something went wrong with the remapping.
Does anyone have an idea about what's going wrong?!
;/***********************************************************************/ ; INTERRUPT VECTOR TABLE ; Default interrupt vectors are mapped to the resetvector. Software sets ; the vector to the actual interrupt handler for that peripheral. ; ;/***********************************************************************/ AREA RESET, DATA, READONLY EXPORT __Vectors IMPORT timer_interrupt __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; 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 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 ; External Interrupts DCD Reset_Handler ; 16: Watchdog Timer DCD Reset_Handler ; 17: Timer0 DCD timer_interrupt ; 18: Timer1 DCD Reset_Handler ; 19: Timer2 DCD Reset_Handler ; 20: Timer3 DCD Reset_Handler ; 21: UART0 DCD Reset_Handler ; 22: UART1 DCD Reset_Handler ; 23: UART2 DCD Reset_Handler ; 24: UART3 DCD Reset_Handler ; 25: PWM1 DCD Reset_Handler ; 26: I2C0 DCD Reset_Handler ; 27: I2C1 DCD Reset_Handler ; 28: I2C2 DCD Reset_Handler ; 29: SPI DCD Reset_Handler ; 30: SSP0 DCD Reset_Handler ; 31: SSP1 DCD Reset_Handler ; 32: PLL0 Lock (Main PLL) DCD Reset_Handler ; 33: Real Time Clock DCD Reset_Handler ; 34: External Interrupt 0 DCD Reset_Handler ; 35: External Interrupt 1 DCD Reset_Handler ; 36: External Interrupt 2 DCD Reset_Handler ; 37: External Interrupt 3 DCD Reset_Handler ; 38: A/D Converter DCD Reset_Handler ; 39: Brown-Out Detect DCD Reset_Handler ; 40: USB DCD Reset_Handler ; 41: CAN DCD Reset_Handler ; 42: General Purpose DMA DCD Reset_Handler ; 43: I2S DCD Reset_Handler ; 44: Ethernet DCD Reset_Handler ; 45: Repetitive Interrupt Timer DCD Reset_Handler ; 46: Motor Control PWM DCD Reset_Handler ; 47: Quadrature Encoder Interface DCD Reset_Handler ; 48: PLL1 Lock (USB PLL) IF :LNOT::DEF:NO_CRP AREA |.ARM.__at_0x02FC|, CODE, READONLY CRP_Key DCD 0xFFFFFFFF ENDIF
The vector table remap routine:
volatile uint32 int_vector_table[VECTOR_TABLE_LEN] __attribute__((at(0x10000000))); /*************************** FUNCTION ************************************/ void init_interrupt_controller(void) /*************************** INFO **************************************** ** ** DESCRIPTION : Initialize the interrupt controller and the interrupt ** vector table. ** ** INPUT : ** ** OUTPUT : ** ** RETURN : **************************************************************************/ { uint8 int_number; volatile const uint32 *org_table = 0x00000000; nvic->cer[0] = 0xFFFFFFFF; nvic->cer[1] = 0x00000007; for(int_number = 0; int_number < VECTOR_TABLE_LEN; int_number++) int_vector_table[int_number] = org_table[int_number]; for(int_number = 0; int_number < MAX_INT_VECTORS; int_number++) { set_interrupt_prioriy(int_number, 15L); } scb->vtor = (uint32)(&int_vector_table) | (0x00000001 << 29); }