summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2018-05-01 23:44:00 -0700
committerKeith Packard <keithp@keithp.com>2018-05-01 23:44:00 -0700
commit08e543cd8b761e4cbbfa97404fcd5394f65a0e9e (patch)
tree0d34fe89503d5cc65ebec72dc8febc62d0b24058
parent980e3dc43ac4712680a370756e5112e9f330aa9a (diff)
altos/stmf0: Set 0x0 mapping to Main Flash for boot loader
When DFU finishes loading firmware and jumps to the application, it leaves the mapping of addresses starting at 0x0 set to System flash, which prevents the boot loader from receiving interrupts and requires a power cycle during flash & cal. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/stmf0/ao_interrupt.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/stmf0/ao_interrupt.c b/src/stmf0/ao_interrupt.c
index 0d6f6113..a67f6f1a 100644
--- a/src/stmf0/ao_interrupt.c
+++ b/src/stmf0/ao_interrupt.c
@@ -76,13 +76,17 @@ void start(void)
#endif
}
#endif
-#if RELOCATE_INTERRUPT
/* Turn on syscfg */
stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_SYSCFGCOMPEN);
+#if RELOCATE_INTERRUPT
memcpy(&__interrupt_start__, &__interrupt_rom__, &__interrupt_end__ - &__interrupt_start__);
stm_syscfg.cfgr1 = (stm_syscfg.cfgr1 & ~(STM_SYSCFG_CFGR1_MEM_MODE_MASK << STM_SYSCFG_CFGR1_MEM_MODE)) |
(STM_SYSCFG_CFGR1_MEM_MODE_SRAM << STM_SYSCFG_CFGR1_MEM_MODE);
+#else
+ /* Switch to Main Flash mode (DFU loader leaves us in System mode) */
+ stm_syscfg.cfgr1 = (stm_syscfg.cfgr1 & ~(STM_SYSCFG_CFGR1_MEM_MODE_MASK << STM_SYSCFG_CFGR1_MEM_MODE)) |
+ (STM_SYSCFG_CFGR1_MEM_MODE_MAIN_FLASH << STM_SYSCFG_CFGR1_MEM_MODE);
#endif
memcpy(&__data_start__, &__text_end__, &__data_end__ - &__data_start__);
memset(&__bss_start__, '\0', &__bss_end__ - &__bss_start__);