diff --git a/bootlib.c b/bootlib.c new file mode 100644 --- /dev/null +++ b/bootlib.c @@ -0,0 +1,51 @@ +#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(); +} + +