This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Vector table remapping lpc17xx

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);
}

0