#include "main.h" #define APP_ADDRESS 0x08040000UL #define APP_FLASH_END 0x08100000UL #define SRAM_START 0x20000000UL #define SRAM_END 0x20020000UL /* Kept for legacy source files that remain in the Keil project. */ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; DMA_HandleTypeDef hdma_usart1_rx; DMA_HandleTypeDef hdma_usart2_rx; typedef void (*app_entry_t)(void); void MX_DMA_DeInit(void) { } void MX_USART_DeInit(void) { } static void boot_jump_to_app(void) { uint32_t app_stack = *(volatile uint32_t *)APP_ADDRESS; uint32_t app_reset = *(volatile uint32_t *)(APP_ADDRESS + 4U); app_entry_t app_entry; /* Do not branch through an erased or invalid application vector table. */ if ((app_stack < SRAM_START) || (app_stack >= SRAM_END) || (app_reset < APP_ADDRESS) || (app_reset >= APP_FLASH_END)) { while (1) { } } __disable_irq(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; for (uint32_t i = 0; i < 8U; i++) { NVIC->ICER[i] = 0xFFFFFFFFUL; NVIC->ICPR[i] = 0xFFFFFFFFUL; } HAL_DeInit(); SCB->VTOR = APP_ADDRESS; __set_MSP(app_stack); __set_CONTROL(0); __DSB(); __ISB(); app_entry = (app_entry_t)app_reset; app_entry(); while (1) { } } int main(void) { HAL_Init(); boot_jump_to_app(); while (1) { } }