application: add action to start embedded bootloader

This commit is contained in:
King Kévin 2020-03-05 14:10:15 +01:00
parent fdef34e663
commit ebbea376a6
1 changed files with 31 additions and 3 deletions

View File

@ -133,7 +133,12 @@ static void command_reset(void* argument);
/** switch to DFU bootloader
* @param[in] argument no argument required
*/
static void command_bootloader(void* argument);
static void command_bootloader_dfu(void* argument);
/** switch to system memory / embedded USART bootloader
* @param[in] argument no argument required
*/
static void command_bootloader_embedded(void* argument);
/** list of all supported commands */
static const struct menu_command_t menu_commands[] = {
@ -185,7 +190,15 @@ static const struct menu_command_t menu_commands[] = {
.command_description = "reboot into DFU bootloader",
.argument = MENU_ARGUMENT_NONE,
.argument_description = NULL,
.command_handler = &command_bootloader,
.command_handler = &command_bootloader_dfu,
},
{
.shortcut = 'B',
.name = "embedded",
.command_description = "boot embedded USART bootloader",
.argument = MENU_ARGUMENT_NONE,
.argument_description = NULL,
.command_handler = &command_bootloader_embedded,
},
};
@ -479,7 +492,7 @@ static void command_reset(void* argument)
while (true); // wait for the reset to happen
}
static void command_bootloader(void* argument)
static void command_bootloader_dfu(void* argument)
{
(void)argument; // we won't use the argument
// set DFU magic to specific RAM location
@ -491,6 +504,21 @@ static void command_bootloader(void* argument)
while (true); // wait for the reset to happen
}
static void command_bootloader_embedded(void* argument)
{
(void)argument; // we won't use the argument
// set watchdog to exit system memory after some time
iwdg_set_period_ms(25000); // set independent watchdog period (26214.4 ms if the max timeout)
iwdg_start(); // start independent watchdog
iwdg_reset(); // restart timer
// start system memory
const uint32_t address = 0x1FFFF000; // system memory address
SCB_VTOR = (volatile uint32_t)(address); // set vector table to application vector table (store at the beginning of the application)
__asm__ volatile ("MSR msp,%0" : :"r"(*(uint32_t*)address)); // set stack pointer to address provided in the beginning of the application (loaded into a register first)
(*(void(**)(void))((uint32_t)address + 4))(); // start system memory (by jumping to the reset function which address is stored as second entry of the vector table)
while (true); // this should not be reached
}
/** process user command
* @param[in] str user command string (\0 ended)
*/