Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions ports/stm32/modmachine.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ STATIC mp_obj_t machine_soft_reset(void) {
MP_DEFINE_CONST_FUN_OBJ_0(machine_soft_reset_obj, machine_soft_reset);

// Activate the bootloader without BOOT* pins.
#if defined(STM32F7) || defined(STM32H7)
uint8_t machine_bootloader_request = 0;
#endif

STATIC NORETURN mp_obj_t machine_bootloader(void) {
#if MICROPY_HW_ENABLE_USB
pyb_usb_dev_deinit();
Expand All @@ -264,12 +268,10 @@ STATIC NORETURN mp_obj_t machine_bootloader(void) {
#endif

#if defined(STM32F7) || defined(STM32H7)
// arm-none-eabi-gcc 4.9.0 does not correctly inline this
// MSP function, so we write it out explicitly here.
//__set_MSP(*((uint32_t*) 0x1FF00000));
__ASM volatile ("movw r3, #0x0000\nmovt r3, #0x1FF0\nldr r3, [r3, #0]\nMSR msp, r3\n" : : : "r3", "sp");

((void (*)(void)) *((uint32_t*) 0x1FF00004))();
SCB_DisableDCache();
machine_bootloader_request = 1; // Set BL Request marker to be checked in resethandler.s
__DSB();
NVIC_SystemReset();
#else
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();

Expand Down
20 changes: 20 additions & 0 deletions ports/stm32/resethandler.s
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,23 @@
.global Reset_Handler
.type Reset_Handler, %function

/* The Bootloader request pattern is stored here in machine.bootloader() */
.extern machine_bootloader_request

Reset_Handler:
/* Save the first argument to pass through to stm32_main */
mov r4, r0

#if defined(STM32F7) || defined(STM32H7)
/* Check for and handle bootloader request */
ldr r0, =machine_bootloader_request
ldr r1, =0x01
ldr r2, [r0, #0]
str r0, [r0, #0] /* Invalidate */
cmp r2, r1
beq Jump_Bootloader
#endif

/* Load the stack pointer */
ldr sp, =_estack

Expand Down Expand Up @@ -67,4 +80,11 @@ Reset_Handler:
mov r0, r4
b stm32_main

#if defined(STM32F7) || defined(STM32H7)
Jump_Bootloader:
ldr r0, =0x1FF00000 /* ROM Bootloader base address */
ldr sp, [r0, #0] /* SP @ +0 */
ldr r0, [r0, #4] /* PC @ +4 */
bx r0
#endif
.size Reset_Handler, .-Reset_Handler