硬汉嵌入式论坛

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

[脱机烧录] H7-TOOL自制Flash读写保护算法系列,为国民技术N32G031制作读写使能和解除算法,支持在线烧录和脱机烧录使用(2024-07-29)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2024-7-29 00:21:27 | 显示全部楼层 |阅读模式
说明:

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

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

实现效果:

本次添加国民技术的N32G031,从2.26版本开始将正式带此支持,支持解除和使能。

12243.jpg


实现代码和原理

通过H7-TOOL的LUA小程序就可以方便的实现保护解除和使能,不需要自制算法文件。

对应的代码如下,这个不需要用户去管,已经封装到TOOL里面了,这里给大家分享是方便大家了解:

ps:这里要感谢一位客户早期做的实现,我这里将其完善后,封装到TOOL里面了。

[Lua] 纯文本查看 复制代码
--寄存器
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",value))
    pg_write32(FLASH_CTRL, 0x220)

        --FLASH->CTRL |= CTRL_Set_START;
        --value,re = pg_read32(0x40022010)
        --value = (value | CTRL_Set_START)
        --print(string.format("(0x40022010) = 0x%x",value))
    pg_write32(FLASH_CTRL, 0x260)

        -- 等的操作完成
        FLASH_WaitForLastOpt()

        -- FLASH.FLASH_STS = 0x34 
        -- FLASH_ClearFlag(FLASH_STS_CLRFLAG)
    pg_write32(FLASH_FLASH_STS, FLASH_STS_CLRFLAG)

        -- if the erase operation is completed, disable the OPTER Bit
        -- FLASH->CTRL &= CTRL_Reset_OPTER;
        -- value,re = pg_read32(0x40022010)
        -- value = (value & CTRL_Reset_OPTER)
        -- print(string.format("(0x40022010) = 0x%x",value))
    pg_write32(FLASH_CTRL, 0x200)

        -- Enable the Option Bytes Programming operation
        -- FLASH->CTRL |= CTRL_Set_OPTPG;
        -- value,re = pg_read32(0x40022010)
    -- print(string.format("(0x40022010) = 0x%x",value))
        -- value = (value | CTRL_Set_OPTPG)
    pg_write32(FLASH_CTRL, 0x210)

        -- FLASH.FLASH_OB 解除保护 
    -- value,re = pg_read32(0x4002201C)
        -- usertmp = ((value & OBR_USER_MSK) << 0x0E)
        -- usertmp = ((L1_RDP_Key & FLASH_RDP_RDP1) | usertmp)
        -- print(string.format("(0x4002201C) = 0x%x",value))
        ob_8 = hex_to_bin(ob)        --hex字符串转为二进制数组
        ob1 = string.byte(ob_8, 1) + (((string.byte(ob_8, 2)) << 16) & 0xFF0000)
    pg_write32(FLASH_OB_Address, ob1)

        -- 等的操作完成
        FLASH_WaitForLastOpt()

        delayms(500)
        
        return err
end





通过TOOL的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制:

223456.jpg




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
 楼主| 发表于 2024-7-29 00:22:46 | 显示全部楼层
回复

使用道具 举报

0

主题

111

回帖

111

积分

初级会员

积分
111
发表于 2024-7-29 09:25:54 | 显示全部楼层
新版固件要发布了吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
 楼主| 发表于 2024-7-29 10:06:05 | 显示全部楼层
Vxworks 发表于 2024-7-29 09:25
新版固件要发布了吧

快了,已经完成第1轮新增的大量脱机烧录芯片的单路,1拖4和1拖16的验证,存在的问题已经在修改中
回复

使用道具 举报

0

主题

111

回帖

111

积分

初级会员

积分
111
发表于 2024-7-29 10:11:41 | 显示全部楼层
eric2013 发表于 2024-7-29 10:06
快了,已经完成第1轮新增的大量脱机烧录芯片的单路,1拖4和1拖16的验证,存在的问题已经在修改中



辛苦
回复

使用道具 举报

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2024-7-29 11:49:17 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 06:37 , Processed in 0.260247 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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