Added feature to reset into DFU from omv onboard software when receiving USBDB_BOOT

This commit is contained in:
shimniok@gmail.com 2014-09-26 22:55:01 -06:00
parent 9618f383ea
commit dbb2019b9a
2 changed files with 38 additions and 12 deletions

View File

@ -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
/**

View File

@ -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;
}
}