diff --git a/src/cmsis/src/st/startup_stm32f407xx.s b/src/cmsis/src/st/startup_stm32f407xx.s index b0a04d16c..c3c6f39e7 100644 --- a/src/cmsis/src/st/startup_stm32f407xx.s +++ b/src/cmsis/src/st/startup_stm32f407xx.s @@ -76,7 +76,20 @@ defined in linker script */ .section .text.Reset_Handler .weak Reset_Handler .type Reset_Handler, %function + Reset_Handler: + ldr r0,=0x20002000 /* load magic number location */ + ldr r2,[r0, #0] + str r0,[r0, #0] /* invalidate */ + ldr r1,=0xDEADBEEF /* if magic number found */ + cmp r2,r1 + bne EnableCCM /* run the bootloader, else... */ + +Reboot_Loader: + ldr r0,=0x1FFF0000 + ldr sp,[r0, #0] + ldr r0,[r0, #4] + bx r0 EnableCCM: /* enable ccm clock */ @@ -122,6 +135,7 @@ LoopFillZerobss: /* Call the application's entry point.*/ bl main bx lr + .size Reset_Handler, .-Reset_Handler /** diff --git a/src/omv/usbdbg.c b/src/omv/usbdbg.c index 8b40bafd9..301f62f94 100644 --- a/src/omv/usbdbg.c +++ b/src/omv/usbdbg.c @@ -14,7 +14,7 @@ #include "py/py_file.h" #include "core_cm4.h" #include "usbdbg.h" -#include "rcc_ctrl.h" +#include "stm32f4xx_hal_rcc.h" #define USB_TX_BUF_SIZE (64) static int xfer_bytes; @@ -192,26 +192,36 @@ void usbdbg_control(void *buffer, uint8_t request, uint16_t length) break; case USBDBG_BOOT: + /* http://goo.gl/VcKqst + * disable IRQ, reset USART1 and RCC before setting MSP/PC. + * Disable all peripheral clocks + * Disable used PLL + * Disable interrupts + * Clear pending interrupts + */ /* - rcc_ctrl_hsi(); // run off the HSI clock, no PLL - SysTick->CTRL = 0; // reset the SysTick timer + __set_PRIMASK(1); // disable interrupts + HAL_RCC_DeInit(); // reset RCC + HAL_USART_DeInit( ); // reset USART1 + SysTick->CTRL = 0; // reset the SysTick timer SysTick->LOAD = 0; SysTick->VAL = 0; - __set_PRIMASK(1); // disable interrupts - __set_MSP(0x20001000); // set main SP to its default - */ + //__set_MSP(0x20001000); // set main SP to its default asm volatile( - "ldr r0, =0x40023844\n\t" // RCC_APB2ENR - "ldr r1, =0x00004000\n\t" // enable SYSCFG clock - "str r1, [r0, #0]\n\t" "ldr r0, =0x40013800\n\t" // SYSCFG_MEMRMP "ldr r1, =0x00000001\n\t" // remap ROM at zero "str r1, [r0, #0]\n\t" - "ldr r0, =0x1fff000\n\t" // load ROM base - "ldr sp,[r0, #0]\n\t" // assign main stack pointer - "ldr r0,[r0, #4]\n\t" // load bootloader address + "ldr r0, =0x1fff000\n\t" // load ROM base + "ldr sp,[r0, #0]\n\t" // assign main stack pointer + "ldr r0,[r0, #4]\n\t" // load bootloader address "bx r0\n\t" ); + // STM32F40xxx e.g., 405, 407 : 0x1FFF77DE + // STM32F429xx : 0x1FFF76DE + */ + // set magic flag => reset handler will jump into boot loader + *((uint32_t *)0x20002000) = 0xDEADBEEF; + NVIC_SystemReset(); while (1); break; @@ -220,3 +230,5 @@ void usbdbg_control(void *buffer, uint8_t request, uint16_t length) break; } } + +