一般使用IDE或者脱机下载器给芯片得内置Flash或者外置Flash烧录程序,主要是通过制作烧录算法文件来实现,比如之前分享得这个帖子:
本帖子给大家分享个使用H7-TOOL的LUA小程序直接为芯片的选项字节读写保护提供支持,无需再专门制作文件。
起因
很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。
实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。
这两天已经完成了STM32H7全系列和国民技术N32G031的读写保护算法自制,特别是H7系列芯片,
最近好几
个网友咨询H7系列芯片保护支持,马不停地,都已经完成。
对STM32H7全系列做了支持,从2.26版本开始将正式带此支持,支持解除和使能。
原理
通过H7-TOOL的LUA小程序就可以方便的实现保护解除和使能,不需要自制算法文件。
对应的代码如下,
这个不需要用户去管,已经封装到TOOL里面了
,这里给大家分享是方便大家了解, 这个代码就跟C差不多,直接操作目标芯片的选项字节控制寄存器即可,比如H7系列芯片的使能和解除读保护支持。
--寄存器
local FLASH_FLASHKEY = 0x40022004
local FLASH_OPTKEY = 0x40022008
local FLASH_CTRL = 0x40022010
local FLASH_FLASH_STS = 0x4002200C
local FLASH_OB_Address = 0x1FFFF600
--寄存器bit
local CTRL_Set_OPTER = 0x00000020
local CTRL_Set_START = 0x00000040
local CTRL_Reset_OPTER = 0x00003FDF
local CTRL_Set_OPTPG = 0x00000010
local FLASH_FLAG_PGERR = 0x00000004 -- /*!< FLASH Program error flag */
local FLASH_FLAG_WRPERR = 0x00000010 -- /*!< FLASH Write protected error flag */
local FLASH_FLAG_EOP = 0x00000020 -- /*!< FLASH End of Operation flag */
local FLASH_STS_CLRFLAG = 0x34 -- (FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR | FLASH_FLAG_EOP)
local FLASH_RDP_RDP1 = 0x000000FF -- /*!< Read protection option byte */
local FLASH_USER_USER = 0x00FF0000 -- /*!< User option byte */
local FLASH_FLAG_BUSY = 0x00000001 -- /*!< FLASH Busy flag */
local OBR_USER_MSK = 0x000000FC
local L1_RDP_Key = 0xFFFF00A5
--常量值
local UNLOCK_KEY1 = 0x45670123
local UNLOCK_KEY2 = 0xCDEF89AB
local OB_UNLOCK_KEY1 = 0x45670123
local OB_UNLOCK_KEY2 = 0xCDEF89AB
--判断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 FLASH_WaitForLastOpt(void)
local i
local reg = {}
for i = 1, 5000, 1 do
reg = {pg_read32(FLASH_FLASH_STS)}
if (CheckFlagQuit0(reg, FLASH_FLAG_BUSY) == 0) then
break
end
delayms(1)
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_FLASHKEY, UNLOCK_KEY1)
pg_write32(FLASH_FLASHKEY, UNLOCK_KEY2)
pg_write32(FLASH_OPTKEY, OB_UNLOCK_KEY1)
pg_write32(FLASH_OPTKEY, OB_UNLOCK_KEY2)
--FLASH->CTRL |= CTRL_Set_OPTER;
--value,re = pg_read32(0x40022010)
--value = (value | CTRL_Set_OPTER)
--print(string.format("(0x40022010) = 0x%x"