 Vector table remapping lpc17xx Sander Wiggers 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);
}
|