说明:

很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。

实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。

最近好几个网友咨询H7系列芯片保护支持,马不停蹄,已经完成

 

实现效果:

对STM32H7全系列做了支持,从2.26版本开始将正式带此支持,支持解除和使能。

H7-TOOL自制Flash读写保护算法系列,为STM32H7全系列芯片制作读写使能和解除算法,支持在线烧录和脱机烧录使用(2024-07-30)_字符串

 

实现代码和原理

通过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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.

 

通过TOOL的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制:

H7-TOOL自制Flash读写保护算法系列,为STM32H7全系列芯片制作读写使能和解除算法,支持在线烧录和脱机烧录使用(2024-07-30)_字符串_02

 

微信公众号:armfly_com