硬汉嵌入式论坛

 找回密码
 立即注册
查看: 908|回复: 1
收起左侧

[脱机烧录] H7-TOOL自制Flash读写保护算法系列,为STM32U5全系列芯片制作读写使能和解除算法,支持在线烧录和脱机烧录使用(2024-09-03)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2024-9-3 00:06:13 | 显示全部楼层 |阅读模式
说明:

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

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

近期已经自制了STM32H7全系列,N32G003,N32G031,  这次将STM32U5全系列做支持。

实现效果:

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

12345678.png


实现代码和原理

通过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

评分

参与人数 1金币 +10 收起 理由
Vxworks + 10 赞一个!

查看全部评分

回复

使用道具 举报

0

主题

111

回帖

111

积分

初级会员

积分
111
发表于 2024-9-3 16:01:35 | 显示全部楼层
辛苦,正需要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-20 06:54 , Processed in 0.283688 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表