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

news/2024/11/15 1:25:51/文章来源:https://www.cnblogs.com/armfly/p/18334976

说明:

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774667.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNS在架构中的使用

1 介绍 DNS(Domain Name System,域名系统)是一种服务,它是域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址数串。 简单来说,DNS就是一个将我们输入的网址(比如www.baidu.com )转换成对应的IP地址(比如19…

RPC核心原理

什么是RPC RPC就是远程过程调用 RPC的作用屏蔽远程调用和本地调用的区别,让我们感觉就是调用本地项目内的方法。 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。RPC通信流程 一个完整的RPC会涉及哪些步骤呢? 在调用方程序中,RPC框架根据调用的服务接口提前生成动态代理…

零代码GIS视效升级!一键添加环境效果,支持多种GIS影像协议

在当今的三维GIS领域,如何轻松实现视效升级?这款免费可视化工具——山海鲸可视化,可以给你提供零代码解决方案。山海鲸可视化从三维GIS需求出发,带来了一键添加环境效果的强大功能,显著提升视觉效果。无论是体积云、体积雾还是其他天气效果,只需简单操作,即可呈现逼真环…

springboot自学(5)自定义starter

测试文件可以删除掉了,配置文件改一下后缀修改pom业务代码开发添加自动配置类,并且加上spring.factories到此为止就初步完成了,install到本地的maven仓库然后在使用的项目里加上依赖就行了导入项目,并调用定时任务报表开发 先做个表格的打印方法表格右对齐的方式左对齐的方…

C#营业执照识别接口、营业执照ocr

营业执照识别接口,是基于光学字符识别技术的一种将图像中的字符转化为可编辑文本的技术。翔云营业执照识别接口,自主ocr核心技术,可快速精准识别营业执照上的全部字段信息,支持三证合一版营业执照和五证合一版营业执照。翔云营业执照识别接口提供免费测试体验服务,助力企业…

C#银行卡ocr识别接口的简单集成方式

银行卡识别接口是指:以文字识别技术为基础衍生的银行卡卡面信息识别接口,该接口可以快速、精准的将银行卡卡面上包含银行卡号、卡类型、银行名称等文字信息提取成功,以帮助需要支付的平台进行银行卡身份的快速核验。企业又该如何快速的对银行卡识别接口进行集成?可以选择翔…

umi——设置proxy代理后,请求status一直为500

参考:umi.js proxy设置https请求不验证证书-- 解决SELF_SIGNED_CERT_IN_CHAIN https://blog.csdn.net/u010974701/article/details/86940422我的情况 umi项目,设置proxy代理后,请求status一直为500 .umirc.ts:proxy: {/api: {target: https://xxx, // 服务端域名changeOrig…

STM32学习记录(七):ADC

STM32学习记录(七):ADC 模拟/数字转换器(Analog-to-digital converter:ADC)将模拟量转为数字量。STM32F103C8T6中的有2个12bit转换时间为1us的A/D转换器,内置了一个温度传感器,可以通过ADC读取。 ADC的系统框图ADC读取温度传感器 STM32内部有一个温度传感器,只有使用ADC1时…

国内备受好评PostgreSQL数据库性能如何?

为什么国内很多数据库采用PostgreSQL数据库作为基础,再次开发自己的产品呢?不仅仅是因为PostgreSQL数据库开源免费、PostgreSQL 数据库的性能也是相当出色的,具有以下几个方面的特点: 1. 处理大规模数据: - 能够有效地管理和处理海量的数据。例如,在大型电商网站中,面对…

Springboot集成Flyway详解

1、背景 随着项目的增多,各个项目的版本之间存在差异,因此在升级时,维护项目版本和最新版本之间增量的sql脚本成为一个严重的问题,非常耗时耗力,因此引入一个数据库变更管理工具迫在眉睫。目前比较常用的有flyway和liquibase,liquibase使用xml文件来定义和管理数据库脚本…

IO体系

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。 Java 中是通过流处理IO 的,那么什么是流? 流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。 当程序…

Java JDK8新增时间类

生成的都是不可变对象,改动内容会存入新对象,原对象不变