altos/stmf0: Set 0x0 mapping to Main Flash for boot loader
authorKeith Packard <keithp@keithp.com>
Wed, 2 May 2018 06:44:00 +0000 (23:44 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 2 May 2018 06:44:00 +0000 (23:44 -0700)
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>
src/stmf0/ao_interrupt.c

index 0d6f61131c0532d87e4daac9a9dafd8a895d2320..a67f6f1a26e2f4fb4dcef390d9bc6db7d6d99ded 100644 (file)
@@ -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__);