#include "stm32f0xx_hal.h" // Unset bootloader option bytes void bootloader_unset(void) { FLASH_OBProgramInitTypeDef OBParam; HAL_FLASHEx_OBGetConfig(&OBParam); if(OBParam.USERConfig != 0xFF) { OBParam.OptionType = OPTIONBYTE_USER; OBParam.USERConfig = 0xFF; HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); HAL_FLASHEx_OBErase(); HAL_FLASHEx_OBProgram(&OBParam); HAL_FLASH_OB_Lock(); HAL_FLASH_OB_Launch(); } } // See thread: https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fJump%20to%20USB%20DFU%20Bootloader%20in%20startup%20code%20on%20STM32F042&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=185 // Set option bytes to enter bootloader upon reset void bootloader_enter(void) { FLASH_OBProgramInitTypeDef OBParam; HAL_FLASHEx_OBGetConfig(&OBParam); OBParam.OptionType = OPTIONBYTE_USER; /*Reset NBOOT0 and BOOT_SEL, see: RM 2.5 Boot configuration*/ OBParam.USERConfig = 0x77; //Sorry for magic number :) HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); HAL_FLASHEx_OBErase(); HAL_FLASHEx_OBProgram(&OBParam); HAL_FLASH_OB_Lock(); HAL_FLASH_Lock(); HAL_FLASH_OB_Launch(); }