mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-19 22:35:23 +03:00
Merge pull request #7383 from jflyper/bfdev-f4-vector-table-relocation
[F4] Relocate ISR vector table to RAM
This commit is contained in:
commit
2bf2ded102
4 changed files with 33 additions and 9 deletions
|
@ -187,9 +187,12 @@ void systemInit(void)
|
||||||
// cache RCC->CSR value to use it in isMPUSoftReset() and others
|
// cache RCC->CSR value to use it in isMPUSoftReset() and others
|
||||||
cachedRccCsrValue = RCC->CSR;
|
cachedRccCsrValue = RCC->CSR;
|
||||||
|
|
||||||
/* Accounts for OP Bootloader, set the Vector Table base address as specified in .ld file */
|
// Although VTOR is already loaded with a possible vector table in RAM,
|
||||||
extern void *isr_vector_table_base;
|
// removing the call to NVIC_SetVectorTable causes USB not to become active,
|
||||||
|
|
||||||
|
extern uint8_t isr_vector_table_base;
|
||||||
NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0);
|
NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0);
|
||||||
|
|
||||||
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, DISABLE);
|
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, DISABLE);
|
||||||
|
|
||||||
RCC_ClearFlag();
|
RCC_ClearFlag();
|
||||||
|
|
|
@ -36,5 +36,6 @@ MEMORY
|
||||||
|
|
||||||
REGION_ALIAS("STACKRAM", CCM)
|
REGION_ALIAS("STACKRAM", CCM)
|
||||||
REGION_ALIAS("FASTRAM", CCM)
|
REGION_ALIAS("FASTRAM", CCM)
|
||||||
|
REGION_ALIAS("VECTAB", RAM)
|
||||||
|
|
||||||
INCLUDE "stm32_flash_split.ld"
|
INCLUDE "stm32_flash_split.ld"
|
||||||
|
|
|
@ -26,14 +26,25 @@ _Min_Stack_Size = 0x800; /* required amount of stack */
|
||||||
/* Define output sections */
|
/* Define output sections */
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
/* The startup code goes first into FLASH */
|
/*
|
||||||
|
* The ISR vector table is loaded at the beginning of the FLASH,
|
||||||
|
* But it is linked (space reserved) at the beginning of the VECTAB region,
|
||||||
|
* which is aliased either to FLASH or RAM.
|
||||||
|
* When linked to RAM, the table can optionally be copied from FLASH to RAM
|
||||||
|
* for table relocation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
_isr_vector_table_flash_base = LOADADDR(.isr_vector);
|
||||||
|
PROVIDE (isr_vector_table_flash_base = _isr_vector_table_flash_base);
|
||||||
|
|
||||||
.isr_vector :
|
.isr_vector :
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
PROVIDE (isr_vector_table_base = .);
|
PROVIDE (isr_vector_table_base = .);
|
||||||
KEEP(*(.isr_vector)) /* Startup code */
|
KEEP(*(.isr_vector)) /* Startup code */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} >FLASH
|
PROVIDE (isr_vector_table_end = .);
|
||||||
|
} >VECTAB AT> FLASH
|
||||||
|
|
||||||
/* System memory (read-only bootloader) interrupt vector */
|
/* System memory (read-only bootloader) interrupt vector */
|
||||||
.system_isr_vector (NOLOAD) :
|
.system_isr_vector (NOLOAD) :
|
||||||
|
|
|
@ -314,6 +314,7 @@
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include "stm32f4xx.h"
|
#include "stm32f4xx.h"
|
||||||
#include "system_stm32f4xx.h"
|
#include "system_stm32f4xx.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
@ -349,9 +350,7 @@
|
||||||
|
|
||||||
/*!< Uncomment the following line if you need to relocate your vector Table in
|
/*!< Uncomment the following line if you need to relocate your vector Table in
|
||||||
Internal SRAM. */
|
Internal SRAM. */
|
||||||
/* #define VECT_TAB_SRAM */
|
#define VECT_TAB_SRAM
|
||||||
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
|
|
||||||
This value must be a multiple of 0x200. */
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -539,10 +538,20 @@ void SystemInit(void)
|
||||||
//SetSysClock();
|
//SetSysClock();
|
||||||
|
|
||||||
/* Configure the Vector Table location add offset address ------------------*/
|
/* Configure the Vector Table location add offset address ------------------*/
|
||||||
|
|
||||||
#ifdef VECT_TAB_SRAM
|
#ifdef VECT_TAB_SRAM
|
||||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
|
// Copy vector table from isr_vector_table_flash_base to isr_vector_table_base.
|
||||||
|
// If these two regions are the same, the copy will have no effect
|
||||||
|
// (Happens when linker script aliases VECTAB to FLASH).
|
||||||
|
|
||||||
|
extern uint8_t isr_vector_table_flash_base;
|
||||||
|
extern uint8_t isr_vector_table_base;
|
||||||
|
extern uint8_t isr_vector_table_end;
|
||||||
|
|
||||||
|
memcpy(&isr_vector_table_base, &isr_vector_table_flash_base, &isr_vector_table_end - &isr_vector_table_base);
|
||||||
|
SCB->VTOR = (uint32_t)&isr_vector_table_base;
|
||||||
#else
|
#else
|
||||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
|
SCB->VTOR = (uint32_t)&isr_vector_table_flash_base;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SystemCoreClockUpdate();
|
SystemCoreClockUpdate();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue