Skip to content

Commit 14409cd

Browse files
author
Bogdan Marinescu
committed
Change the check for vector table relocation
Allows the user to specify his own VTOR location. Fixes PRMBED-1065.
1 parent 5f0bd9d commit 14409cd

File tree

8 files changed

+21
-8
lines changed

8 files changed

+21
-8
lines changed

libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_KL05Z/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
#define NVIC_NUM_VECTORS (16 + 32) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x1FFFFC00) // Vectors positioned at start of RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t *vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
uint32_t i;
1415

1516
// Copy and switch to dynamic vectors if the first time called
16-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
17+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1718
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1819
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1920
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_KL25Z/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
#define NVIC_NUM_VECTORS (16 + 32) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x1FFFF000) // Vectors positioned at start of RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415

1516
// Copy and switch to dynamic vectors if first time called
16-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
17+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1718
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1819
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1920
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC13XX/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
#define NVIC_NUM_VECTORS (16 + 32) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x10000000) // Location of vectors in RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415
// Copy and switch to dynamic vectors if first time called
15-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
16+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1617
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1718
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1819
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC176X/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
#define NVIC_NUM_VECTORS (16 + 33) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x10000000) // Location of vectors in RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415
// Copy and switch to dynamic vectors if first time called
15-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
16+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1617
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1718
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1819
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC408X/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
#define NVIC_NUM_VECTORS (16 + 41) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x10000000) // Location of vectors in RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415
// Copy and switch to dynamic vectors if first time called
15-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
16+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1617
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1718
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1819
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC43XX/cmsis_nvic.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,22 @@
88
#define NVIC_NUM_VECTORS (16 + 53) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x10000000) // Location of vectors in RAM
1010

11+
// The LPC43xx can boot from multiple memories (internal Flash, external NOR,
12+
// external SPIFI) so we don't know the initial value of VTOR. Thus we use
13+
// a variable to keep track if the vector table was relocated or not
14+
static unsigned char vtor_relocated;
15+
1116
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1217
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1318
int i;
1419
// Copy and switch to dynamic vectors if first time called
15-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
20+
if (!vtor_relocated) {
1621
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1722
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1823
vectors[i] = old_vectors[i];
1924
}
2025
SCB->VTOR = (uint32_t)vectors;
26+
vtor_relocated = 1;
2127
}
2228

2329
vectors[IRQn + 16] = vector;

libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC81X/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
#define NVIC_NUM_VECTORS (16 + 32) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x10000000) // Vectors positioned at start of RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415

1516
// Copy and switch to dynamic vectors if first time called
16-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
17+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1718
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1819
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1920
vectors[i] = old_vectors[i];

libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4XX/cmsis_nvic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
#define NVIC_NUM_VECTORS (16 + 81) // CORE + MCU Peripherals
99
#define NVIC_RAM_VECTOR_ADDRESS (0x20000000) // Location of vectors in RAM
10+
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
1011

1112
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
1213
static volatile uint32_t* vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
1314
int i;
1415
// Copy and switch to dynamic vectors if first time called
15-
if (SCB->VTOR != NVIC_RAM_VECTOR_ADDRESS) {
16+
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
1617
uint32_t *old_vectors = (uint32_t*)SCB->VTOR;
1718
for (i=0; i<NVIC_NUM_VECTORS; i++) {
1819
vectors[i] = old_vectors[i];

0 commit comments

Comments
 (0)