STM32 的 Flash information block 部分,包含有特殊的選項字節,可以用於系統配置等信息, 其中還有兩個有效字節(實際四個字節,兩個是校驗字節)的用戶自定義數據字節。
在嘗試寫入用戶自定義字節時,我遇到了寫入錯誤,但是比對用戶手冊,已經完成了應有的步驟。
后來通過對比系統庫的 example 中的 Flash 相關例子,看到正確的寫字節方式,還應該包含有“擦除”和對原有inform 的“復制”和再“寫入”,代碼如下。
HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); FLASH_OBProgramInitTypeDef obData; HAL_FLASHEx_OBGetConfig(&obData); HAL_FLASHEx_OBErase(); obData.DATAAddress = OB_DATA_ADDRESS_DATA0; obData.DATAData = 0xAE; //自定義數據 obData.OptionType = OPTIONBYTE_DATA; if ( (ret = HAL_FLASHEx_OBProgram(&obData)) != HAL_OK){ extern FLASH_ProcessTypeDef pFlash; char tmp[50] = {0}; sprintf(tmp, "write optby fail for %x, %08x", ret, pFlash.ErrorCode); debug(tmp, strlen(tmp)); return -1; } obData.DATAAddress = OB_DATA_ADDRESS_DATA1; obData.DATAData = 0xC9; //自定義數據 if ((ret = HAL_FLASHEx_OBProgram(&obData)) != HAL_OK){ char tmp[50] = {0}; sprintf(tmp, "write optby fail for %x", ret); debug(tmp, strlen(tmp)); return -1; }
當然,也可以使用工具,更加便利。
比如 mcpisp。