Skip to content
Open
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
16 changes: 16 additions & 0 deletions src/main/drivers/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ void systemResetToBootloader(void)
systemResetRequest(RESET_BOOTLOADER_REQUEST_ROM);
}


typedef void resetHandler_t(void);

typedef struct isrVector_s {
Expand All @@ -119,14 +120,29 @@ void checkForBootLoaderRequest(void)
if (bootloaderRequest != RESET_BOOTLOADER_REQUEST_ROM) {
return;
}

// Clear the reset reason before jumping
persistentObjectWrite(PERSISTENT_OBJECT_RESET_REASON, RESET_NONE);

#if defined(STM32H7)

// Enable SYSCFG clock (required for bootloader)
__HAL_RCC_SYSCFG_CLK_ENABLE();

// Jump to bootloader
volatile isrVector_t *bootloaderVector = (isrVector_t *)systemBootloaderAddress();
__set_MSP(bootloaderVector->stackEnd);
bootloaderVector->resetHandler();

while (1);
#else
// On F4/F7, jump to bootloader
volatile isrVector_t *bootloaderVector = (isrVector_t *)systemBootloaderAddress();
__set_MSP(bootloaderVector->stackEnd);
bootloaderVector->resetHandler();

while (1);
#endif
}

#define SHORT_FLASH_DURATION 50
Expand Down
2 changes: 0 additions & 2 deletions src/main/drivers/system_stm32h7xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ uint32_t systemBootloaderAddress(void)

void systemInit(void)
{
checkForBootLoaderRequest();

// Configure NVIC preempt/priority groups
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUPING);

Expand Down
3 changes: 3 additions & 0 deletions src/main/target/system_stm32h7xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,9 @@ void SystemInit (void)

initialiseMemorySections();

// Check for bootloader request BEFORE any clock/peripheral configuration
checkForBootLoaderRequest();

// FPU settings
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); // Set CP10 and CP11 Full Access
Expand Down