说明:
很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。
实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。
近期已经自制了STM32H7全系列,N32G003,N32G031, 这次将STM32U5全系列做支持。
实现效果:
对STM32U5全系列做了支持,从2.27版本开始将正式带此支持,支持解除和使能。
实现代码和原理
通过H7-TOOL的LUA小程序就可以方便的实现保护解除和使能,不需要自制算法文件。
对应的代码如下,这个不需要用户去管,已经封装到TOOL里面了,这里给大家分享是方便大家了解:
[Lua] 纯文本查看 复制代码 --寄存器
local FLASH_NSKEYR = 0x40022008
local FLASH_SECKEYR = 0x4002200C
local FLASH_OPTKEYR = 0x40022010
local FLASH_OPTR = 0x40022040
local FLASH_SECSR = 0x40022024
local FLASH_NSSR = 0x40022020
local FLASH_NSCR = 0x40022028
--寄存器bit
local FLASH_NSSR_BSY_WDW = 0x00030000 --BSY 0x00010000 WDW 0x00020000
local FLASH_SECSR_BSY_WDW = 0x00030000 --BSY 0x00010000 WDW 0x00020000
local FLASH_NSCR_OPTSTRT = 0x00020000
--常量值
local UNLOCK_KEY1 = 0x45670123
local UNLOCK_KEY2 = 0xCDEF89AB
local OB_UNLOCK_KEY1 = 0x08192A3B
local OB_UNLOCK_KEY2 = 0x4C5D6E7F
--判断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
--判断CPU是否已保护, 返回1表示已保护,返回0表示未保护
function MCU_CheckProtect(void)
local ch_num
local re = 0
local data = {}
local tmp
if (MULTI_MODE == 0) then
ch_num = 1
else
ch_num = MULTI_MODE
end
--pg_init()
--InitUnderReset()
data = {pg_read32(FLASH_OPTR)}
for j = 1, ch_num, 1 do
tmp = (data[j]&0x000000FF)
if (tmp ~= 0xAA) then
re = 1
break
end
end
return re
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
local re
print("MCU_ProgOptionBytes()")
pg_write32(FLASH_NSKEYR, UNLOCK_KEY1)
pg_write32(FLASH_NSKEYR, UNLOCK_KEY2)
--pg_write32(FLASH_SECKEYR, UNLOCK_KEY1)
--pg_write32(FLASH_SECKEYR, UNLOCK_KEY2)
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_OPTR, ob1)
--Set OPTSTRT Bit
--re = pg_read32(FLASH_NSCR)
--print_hex(re)
--pg_write32(FLASH_NSCR, re|0x00020000)
pg_write32(FLASH_NSCR, 0x00020000)
-- Wait for OB change operation to be completed
print("等待OB编程完成.......")
WaitForLastOperation(FLASH_NSSR, FLASH_NSSR_BSY_WDW)
delayms(1000)
return err
end
|