单片机
返回首页

H7-TOOL自制Flash读写保护算法,为STM32H7全系列芯片添加支持,支持在线和脱机烧录

2025-11-05 来源:bilibili

说明:很多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的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制:

进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外遥控音量控制

  • LM317过压保护

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章