diff options
Diffstat (limited to 'src/stm32/stm32f0.c')
-rw-r--r-- | src/stm32/stm32f0.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/stm32/stm32f0.c b/src/stm32/stm32f0.c index 437747d8..4153f526 100644 --- a/src/stm32/stm32f0.c +++ b/src/stm32/stm32f0.c @@ -99,6 +99,22 @@ usb_request_bootloader(void) NVIC_SystemReset(); } +// Copy vector table and remap ram so new vector table is used +static void +enable_ram_vectortable(void) +{ + // Symbols created by armcm_link.lds.S linker script + extern uint32_t _ram_vectortable_start, _ram_vectortable_end; + extern uint32_t _text_vectortable_start; + + uint32_t count = (&_ram_vectortable_end - &_ram_vectortable_start) * 4; + __builtin_memcpy(&_ram_vectortable_start, &_text_vectortable_start, count); + barrier(); + + enable_pclock(SYSCFG_BASE); + SYSCFG->CFGR1 |= 3 << SYSCFG_CFGR1_MEM_MODE_Pos; +} + #if !CONFIG_STM32_CLOCK_REF_INTERNAL DECL_CONSTANT_STR("RESERVE_PINS_crystal", "PF0,PF1"); #endif @@ -188,6 +204,9 @@ armcm_main(void) SystemInit(); + if (CONFIG_ARMCM_RAM_VECTORTABLE) + enable_ram_vectortable(); + // Set flash latency FLASH->ACR = (1 << FLASH_ACR_LATENCY_Pos) | FLASH_ACR_PRFTBE; |