aboutsummaryrefslogtreecommitdiff
path: root/lib/stm32/f1
diff options
context:
space:
mode:
authorJeff Ciesielski2012-10-22 14:45:44 -0700
committerJeff Ciesielski2012-10-22 14:45:44 -0700
commit94abf6e529a6ca3c9ed663113dedeef34e297661 (patch)
treeaa30e93588c5845d4ef04766c1a79b89ee7b8c96 /lib/stm32/f1
parentdd5e797d6187a48ed944a5f34630f200e9fc8649 (diff)
stm32/f1: Add user_reset_hook to reset_handler w/ jump_to_dfu preset
This allows for pragramatic jumping to the DFU bootloader on CL devices, or could be used for things like CRC checking of the firmware before boot
Diffstat (limited to 'lib/stm32/f1')
-rw-r--r--lib/stm32/f1/vector.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/stm32/f1/vector.c b/lib/stm32/f1/vector.c
index d660774..87fd655 100644
--- a/lib/stm32/f1/vector.c
+++ b/lib/stm32/f1/vector.c
@@ -18,7 +18,8 @@
*/
#define WEAK __attribute__ ((weak))
-
+#define NAKED __attribute__((naked))
+#include <stdint.h>
/* Symbols exported by the linker script(s): */
extern unsigned _data_loadaddr, _data, _edata, _ebss, _stack;
@@ -191,10 +192,10 @@ void (*const vector_table[]) (void) = {
otg_fs_isr, /* Addr: 0x0000_014C */
};
-#include <stdint.h>
-void reset_handler(void)
+void WEAK user_reset_hook(void);
+
+void handle_dfu_bootloader(void)
{
- volatile unsigned *src, *dest;
uint32_t reset_str = *((uint32_t *)0x2000FFF0);
if (reset_str == 0xDEADBEEF) {
@@ -204,8 +205,17 @@ void reset_handler(void)
asm("ldr r0, [r0, #4]");
asm("bx r0");
}
+
+}
+
+void NAKED reset_handler(void)
+{
+ volatile unsigned *src, *dest;
+
__asm__("MSR msp, %0" : : "r"(&_stack));
+ user_reset_hook();
+
for (src = &_data_loadaddr, dest = &_data; dest < &_edata; src++, dest++)
*dest = *src;
@@ -226,6 +236,7 @@ void null_handler(void)
/* Do nothing. */
}
+#pragma weak user_reset_hook = handle_dfu_bootloader
#pragma weak nmi_handler = null_handler
#pragma weak hard_fault_handler = blocking_handler
#pragma weak mem_manage_handler = blocking_handler