2025-09-30 1:47 AM
譬如說我使用一個按鍵,按下去之後執行函式"jump_to_sys_memory_bootloader",再搭配STM32CubeProgrammer,使用uart來更新我的MCU,但是一直無法連接成功,以下是我的函式請問哪邊有遺漏嗎?
static void jump_to_sys_memory_bootloader(void)
{
uint32_t i;
void (*SysMemBootJump)(void);
__IO uint32_t sys_memory_address = SYSMEM_BOOT_BASE;
// 1. 關閉全域中斷
__disable_irq();
// 2. 停止 SysTick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
// 3. 釋放所有已初始化的外設
HAL_ADC_DeInit(&hadc1);
HAL_I2C_DeInit(&hi2c1);
HAL_SPI_DeInit(&hspi1);
HAL_SPI_DeInit(&hspi2);
HAL_UART_DeInit(&huart1);
HAL_UART_DeInit(&huart2);
HAL_TIM_Base_DeInit(&htim14);
// 4. Reset RCC (回到預設 HSI 狀態)
HAL_RCC_DeInit();
// 5. 關閉 NVIC 所有中斷
for (i = 0; i < (sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0])); i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
// 6. 記憶體重映射到 System Flash
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
// 7. 設定主堆疊指標 (MSP)
__set_MSP(*(uint32_t *)sys_memory_address);
// 8. 取得 Bootloader Reset Handler 入口點
SysMemBootJump = (void (*)(void)) (*((uint32_t *)(sys_memory_address + 4)));
// 9. 跳轉到 System Bootloader
SysMemBootJump();
// 10. 如果跳轉失敗 (理論上不會到這裡)
while (1)
{
LOG("jump sys memory fail\r\n");
// 可以加上錯誤處理或 LED 提示
}
}
2025-09-30 1:48 AM
For example, I use a button that executes the function "jump_to_sys_memory_bootloader" when pressed. I then use STM32CubeProgrammer to update my MCU via UART, but I'm having trouble connecting. Below is my function. Is there anything I'm missing?
static void jump_to_sys_memory_bootloader(void)
{
uint32_t i;
void (*SysMemBootJump)(void);
__IO uint32_t sys_memory_address = SYSMEM_BOOT_BASE;
// 1. 關閉全域中斷
__disable_irq();
// 2. 停止 SysTick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
// 3. 釋放所有已初始化的外設
HAL_ADC_DeInit(&hadc1);
HAL_I2C_DeInit(&hi2c1);
HAL_SPI_DeInit(&hspi1);
HAL_SPI_DeInit(&hspi2);
HAL_UART_DeInit(&huart1);
HAL_UART_DeInit(&huart2);
HAL_TIM_Base_DeInit(&htim14);
// 4. Reset RCC (回到預設 HSI 狀態)
HAL_RCC_DeInit();
// 5. 關閉 NVIC 所有中斷
for (i = 0; i < (sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0])); i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
// 6. 記憶體重映射到 System Flash
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
// 7. 設定主堆疊指標 (MSP)
__set_MSP(*(uint32_t *)sys_memory_address);
// 8. 取得 Bootloader Reset Handler 入口點
SysMemBootJump = (void (*)(void)) (*((uint32_t *)(sys_memory_address + 4)));
// 9. 跳轉到 System Bootloader
SysMemBootJump();
// 10. 如果跳轉失敗 (理論上不會到這裡)
while (1)
{
LOG("jump sys memory fail\r\n");
// 可以加上錯誤處理或 LED 提示
}
}