使用內建bootloader進行串列埠IAP韌體升級——STM32F103RCT6
阿新 • • 發佈:2022-03-03
STM系列有內建的bootloader,支援通過CAN、SPI、I2C、USB DFU、USART進行韌體升級。
需配合STM32CubeProgrammer使用,以下為串列埠接收到0x55後,進入內建bootloader的例子,其中地址0x1FFFF000
需要查詢《AN2606
Application note—STM32 microcontroller system memory boot mode》
/* ********************************************************************************************************* * 函 數 名: JumpToBootloader * 功能說明: 跳轉到系統BootLoader * 形 參: 無 * 返 回 值: 無 ********************************************************************************************************* */ void JumpToBootloader(void) { uint32_t i = 0; void (*SysMemBootJump)(void); /* 宣告一個函式指標 */ __IO uint32_t BootAddr = 0x1FFFF000; // STM32F1系列內建bootloader地址 /* 關閉全域性中斷 */ __set_PRIMASK(1); /* 關閉滴答定時器,復位到預設值 */ SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; /* 設定所有時鐘到預設狀態,使用HSI時鐘 */ HAL_RCC_DeInit(); /* 關閉所有中斷,清除所有中斷掛起標誌 */ for (i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } /* 使能全域性中斷 */ __set_PRIMASK(0); /* 跳轉到系統BootLoader,首地址是MSP,地址+4是復位中斷服務程式地址 */ SysMemBootJump = (void (*)(void))(*((uint32_t *)(BootAddr + 4))); /* 設定主堆疊指標 */ __set_MSP(*(uint32_t *)BootAddr); /* 在RTOS工程,這條語句很重要,設定為特權級模式,使用MSP指標 */ __set_CONTROL(0); /* 跳轉到系統BootLoader */ SysMemBootJump(); /* 跳轉成功的話,不會執行到這裡,使用者可以在這裡新增程式碼 */ while (1) { } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (aRxBuffer[0] == 0x55) { JumpToBootloader(); } HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); }
- 選擇串列埠,“偶校驗”
- 連線成功
3.選擇檔案,寫入
參考
《安富萊_STM32-V6開發板_使用者手冊 第28-30章》