From 79e2376993434f92434c55a9c0dc5418171acf0a Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Mon, 9 Dec 2019 21:03:05 -0500 Subject: stm32: Add support for a bootloader on stm32f0 Signed-off-by: Kevin O'Connor --- src/stm32/stm32f0.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/stm32/stm32f0.c') 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; -- cgit v1.2.3-70-g09d2