说明:
很多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 = 0xCDEF89ABlocal OB_UNLOCK_KEY1 = 0x08192A3B local OB_UNLOCK_KEY2 = 0x4C5D6E7Flocal FLASH_FLAG_CRC_BUSY_BANK1 = 0x00000008 local FLASH_FLAG_CRC_BUSY_BANK2 = 0x80000008--判断data数组标志,全部为0则退出 function CheckFlagQuit0(data, mask)local ilocal retif (MULTI_MODE > 0) thenret = 0for i = 1, MULTI_MODE, 1 doret = ret | (data[i] & mask)endelseret = data[1] & maskendreturn ret end--等待超 function WaitForLastOperation(obreg, obflag)local ilocal reg = {}for i = 1, 5000, 1 doreg = {pg_read32(obreg)}if (CheckFlagQuit0(reg, obflag) == 0) thenbreakenddelayms(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_8local ob1local usertmpprint("MCU_ProgOptionBytes()")pg_write32(FLASH_FLASHKEYR1, UNLOCK_KEY1)pg_write32(FLASH_FLASHKEYR1, UNLOCK_KEY2)if(STM32H7Dual_BANK == 1) thenpg_write32(FLASH_FLASHKEYR2, UNLOCK_KEY1)pg_write32(FLASH_FLASHKEYR2, UNLOCK_KEY2)endpg_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) thenusertmp = (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 completedprint("等待OB编程完成.......")WaitForLastOperation(FLASH_OPTSR_CUR, FLASH_OPTSR_OPT_BUSY)delayms(1000)return err end
通过TOOL的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制: