H7-TOOL自制Flash讀防寫演算法系列,為STM32H7全系列晶片製作讀寫使能和解除演算法,支援線上燒錄和離線燒錄使用(2024-07-30)

硬汉嵌入式發表於2024-07-31

說明:

很多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的暫存器檢測功能可以瞭解各種暫存器地址和狀態資訊,大大方便演算法檔案自制:

相關文章