說明:
很多IC廠家僅釋出了內部Flash演算法檔案,並沒有提供讀防寫演算法檔案,也就是選項位元組演算法檔案,需要我們製作。
實際上當前已經發布的TOOL版本,已經自制很多了。但是依然有些廠家還沒自制,所以陸續開始為這些廠家提供讀防寫支援。
最近好幾個網友諮詢H7系列晶片保護支援,馬不停蹄,已經完成
實現效果:
對STM32H7全系列做了支援,從2.26版本開始將正式帶此支援,支援解除和使能。
實現程式碼和原理
透過H7-TOOL的LUA小程式就可以方便的實現保護解除和使能,不需要自制演算法檔案。
對應的程式碼如下,這個不需要使用者去管,已經封裝到TOOL裡面了,這裡給大家分享是方便大家瞭解:
--暫存器 local FLASH_FLASHKEYR1 = 0x52002004 local FLASH_FLASHKEYR2 = 0x52002104 local FLASH_OPTKEYR = 0x52002008 local FLASH_OPTSR_PRG = 0x52002020 local FLASH_OPTSR_CUR = 0x5200201C local FLASH_OPTCR = 0x52002018 local FLASH_SR1 = 0x52002010 local FLASH_SR2 = 0x52002110 --暫存器bit local FLASH_OPTCR_OPTSTART = 0x00000002 local FLASH_OPTSR_OPT_BUSY = 0x00000001 --常量值 local UNLOCK_KEY1 = 0x45670123 local UNLOCK_KEY2 = 0xCDEF89AB local OB_UNLOCK_KEY1 = 0x08192A3B local OB_UNLOCK_KEY2 = 0x4C5D6E7F local FLASH_FLAG_CRC_BUSY_BANK1 = 0x00000008 local FLASH_FLAG_CRC_BUSY_BANK2 = 0x80000008 --判斷data陣列標誌,全部為0則退出 function CheckFlagQuit0(data, mask) local i local ret if (MULTI_MODE > 0) then ret = 0 for i = 1, MULTI_MODE, 1 do ret = ret | (data[i] & mask) end else ret = data[1] & mask end return ret end --等待超 function WaitForLastOperation(obreg, obflag) local i local reg = {} for i = 1, 5000, 1 do reg = {pg_read32(obreg)} if (CheckFlagQuit0(reg, obflag) == 0) then break end delayms(10) end end --晶片專有的解除保護函式 function MCU_RemoveProtect(void) MCU_ProgOptionBytes(OB_SECURE_OFF) end --沒有FLM的MCU,用指令碼實現程式設計OB。 返回 "OK" or "error" function MCU_ProgOptionBytes(ob) local err = "OK" local ob_8 local ob1 local usertmp print("MCU_ProgOptionBytes()") pg_write32(FLASH_FLASHKEYR1, UNLOCK_KEY1) pg_write32(FLASH_FLASHKEYR1, UNLOCK_KEY2) if(STM32H7Dual_BANK == 1) then pg_write32(FLASH_FLASHKEYR2, UNLOCK_KEY1) pg_write32(FLASH_FLASHKEYR2, UNLOCK_KEY2) end pg_write32(FLASH_OPTKEYR, OB_UNLOCK_KEY1) pg_write32(FLASH_OPTKEYR, OB_UNLOCK_KEY2) -- Set the read protection level. ob_8 = hex_to_bin(ob) --hex字串轉為二進位制陣列 ob1 = string.byte(ob_8, 1) + (((string.byte(ob_8, 2)) << 8) & 0xFF00) + (((string.byte(ob_8, 3)) << 16) & 0xFF0000) + (((string.byte(ob_8, 4)) << 24) & 0xFF000000) pg_write32(FLASH_OPTSR_PRG, ob1) -- Wait for CRC computation to be completed WaitForLastOperation(FLASH_SR1, FLASH_FLAG_CRC_BUSY_BANK1) if(STM32H7Dual_BANK == 1) then usertmp = (FLASH_FLAG_CRC_BUSY_BANK2 & 0x7FFFFFFF) WaitForLastOperation(FLASH_SR2, usertmp) end -- Set OPTSTRT Bit pg_write32(FLASH_OPTCR, FLASH_OPTCR_OPTSTART) -- Wait for OB change operation to be completed print("等待OB程式設計完成.......") WaitForLastOperation(FLASH_OPTSR_CUR, FLASH_OPTSR_OPT_BUSY) delayms(1000) return err end
透過TOOL的暫存器檢測功能可以瞭解各種暫存器地址和狀態資訊,大大方便演算法檔案自制: