mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Added feature to reset into DFU from omv onboard software when receiving USBDB_BOOT
This commit is contained in:
parent
9618f383ea
commit
dbb2019b9a
@ -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
|
||||
|
||||
/**
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user