aboutsummaryrefslogtreecommitdiffstats
path: root/src/stm32/stm32f0.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2019-12-09 21:03:05 -0500
committerKevin O'Connor <kevin@koconnor.net>2020-03-04 19:50:56 -0500
commit79e2376993434f92434c55a9c0dc5418171acf0a (patch)
treea1e004f3a6c5bfe0f3c22847ad47e0fbe1a0b579 /src/stm32/stm32f0.c
parentc9cb462f90a68deb73cacb179f7bbcde2cb9aeed (diff)
downloadkutter-79e2376993434f92434c55a9c0dc5418171acf0a.tar.gz
kutter-79e2376993434f92434c55a9c0dc5418171acf0a.tar.xz
kutter-79e2376993434f92434c55a9c0dc5418171acf0a.zip
stm32: Add support for a bootloader on stm32f0
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/stm32/stm32f0.c')
-rw-r--r--src/stm32/stm32f0.c19
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;