AI亂寫,還是得自己來!
void Write_OptionBytes_IWDG_STDBY(void)?
{
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASHEx_OBGetConfig(&OBInit); ?// 獲取當前選項字節配置[6,7](@ref)
? ? // 檢查當前nRST_STDBY位(IWDG_STDBY相關位)是否已為0,若否則修改
if ( ((OBInit.USERConfig & FLASH_OPTR_IWDG_STOP) != 0x00) ||?
((OBInit.USERConfig & FLASH_OPTR_IWDG_STDBY) != 0x00) ) ?
{
// 解鎖FLASH和選項字節寫操作
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
? ? ? ? // 配置選項字節:清除nRST_STDBY位(IWDG_STDBY=0)
OBInit.OptionType = OPTIONBYTE_USER;
OBInit.USERConfig = OBInit.USERConfig & (~FLASH_OPTR_IWDG_STOP) & (~FLASH_OPTR_IWDG_STDBY); ?// 置0[6,7](@ref)
OBInit.USERType = OB_USER_IWDG_STOP | OB_USER_IWDG_STDBY;
? ? ? ? // 寫入選項字節并觸發重新加載
if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK) {
Error_Handler(); ?// 處理錯誤
}
HAL_FLASH_OB_Launch(); ? //強制加載選項字 ?關鍵一步
HAL_FLASHEx_OBGetConfig(&OBInit); ?// 獲取當前選項字節配置[6,7](@ref)
? ? ? ? // 鎖定FLASH并復位MCU使配置生效
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
HAL_NVIC_SystemReset(); ?// 必須復位才能應用新配置[6](@ref)
}
}