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

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

时间:2024-07-31 16:52:45浏览次数:10  
标签:烧录 CTRL -- 读写 FLASH value 算法 pg local

说明:

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

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

实现效果:

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

 

 

实现代码和原理

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

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

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

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

 

标签:烧录,CTRL,--,读写,FLASH,value,算法,pg,local
From: https://www.cnblogs.com/armfly/p/18334976

相关文章

  • Day 29 贪心算法 Part03
    今天的题目真是给我做恶心了134.加油站暴力方法很容易写出来,但在力扣上运行会超时。classSolution{int[]gas;int[]cost;publicintcanCompleteCircuit(int[]gas,int[]cost){this.gas=gas;this.cost=cost;for(inti=......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)
    1001循环位移双哈希1002星星简单\(dp\),使用\(dp[i][j]\)表示前\(i\)轮获取\(j\)颗星星的最小贡献。时间复杂度\(O(\sumn\timesk)\)。1003树树上启发式合并,当时只知道原理,没写过题目,不应该按照自己理解瞎写的,应该先简单学一下……考虑将一个节点\(j\)添加进......
  • 《关于钉钉 AI 助理智能生成算法的分析报告》
    一、算法全周期行为检查算法安全信息内容安全:需确保生成的文本和图像内容不包含违法、有害、误导或侵犯他人权益的信息。例如,避免生成涉及暴力、色情、欺诈等内容。信息源安全:严格审查输入数据的来源,防止恶意数据的混入,以保障生成结果的可靠性和合法性。信息安全监测:持续监......
  • 【算法 Java】排序
    排序所有的排序以从小到大排序为例模板题:牛客-简单的排序排序算法的稳定性体现在相同数值元素的相对位置会不会随排序改变,如果改变则不稳定,如果不改变则稳定冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。越大的元素会经由交换慢慢"浮"到数列的末端。时间复......
  • 代码随想录算法训练营第53天 | 图论2:岛屿数量相关问题
    99.岛屿数量https://kamacoder.com/problempage.php?pid=1171岛屿深搜https://www.programmercarl.com/kamacoder/0099.岛屿的数量深搜.html岛屿广搜https://www.programmercarl.com/kamacoder/0099.岛屿的数量广搜.html#思路100.岛屿的最大面积https://www.programmercar......
  • (10-2-02)智能行为决策算法:常用的智能行为决策算法(2)-------强化学习
    10.2.2 强化学习强化学习是一种机器学习方法,其核心思想是通过代理程序与环境的交互学习最优行为策略,以最大化累积奖励。在强化学习中,代理程序通过观察环境的状态,并选择动作来影响环境,从而学习如何在面对不同状态时做出最优的决策。和强化学习相关的关键概念包括:环境与代理......
  • 数学建模--拟合算法
    目录拟合与插值的区别常用的拟合算法应用实例总结最小二乘法在不同数据分布下的性能表现如何?傅里叶级数拟合在图像处理中的应用案例有哪些?贝叶斯估计法与最大似然估计法在参数估计中的优缺点分别是什么?最大似然估计法(MLE)优点:缺点:贝叶斯估计法(BayesianEstimation)优......
  • 国密算法概述
    国密即国家密码局认定的国产密码算法,即商用密码。国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中:SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括:SM1,......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 使用变动和观察(Perturb and Observe)最大功率点跟踪(MPPT)算法控制升压变换器的MOSFET/IG
     ......