首页 > 编程语言 >H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

时间:2024-10-30 16:11:58浏览次数:1  
标签:烧录 FLASH Flash ob 算法 pg CTL local FMC

说明:

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

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

近期已经自制了STM32H7全系列,N32G003,N32G031,  STM32U5全系列和凌欧LKS32MC03X。

之前我们已经为兆易创新自制了GD32E50x,GD32E10x,GD32F3x0,GD32F4xx,GD32F10x,GD32F20x,GD32F30x,GD32F1x0,GD32C10x等系列的选项字节编程算法功能,含读写保护。

这次为GD32E23x系列也提供支持。


实现效果:

从2.27版本开始将正式带此支持,支持解除和使能。


实现代码和原理

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

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

FLASH_KEYR                = 0x40022004
FLASH_OPTKEYR   = 0x40022008
 
FLASH_KEY1      = 0x45670123
FLASH_KEY2      = 0xCDEF89AB
 
FMC_STAT                = 0x4002200C
FMC_CTL         = 0x40022010
FMC_CTL_OBPG    = 0x00000010
FMC_CTL_OBER    = 0x00000020
FMC_CTL_START   = 0x00000040
 
FMC_STAT_BUSY   = 0x00000001
FMC_STAT_PGERR  = 0x00000004
FMC_STAT_PGAERR = 0x00000008
FMC_STAT_WPERR  = 0x00000010
FMC_STAT_ENDF   = 0x00000020
 
--判断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 MCU_RemoveProtect(void)
        MCU_ProgOptionBytes(OB_SECURE_OFF)
end
 
function FMC_WaitBusy(ob)
        local i
        local reg
 
         for i = 1, 50, 1 do
                 reg = {pg_read32(FMC_STAT)}
                if (CheckFlagQuit0(reg, FMC_STAT_BUSY) == 0) then
                        break
                end
                delayms(10)
        end
end
 
--没有FLM的MCU,用脚本实现编程OB。 返回 "OK" or "error"
function MCU_ProgOptionBytes(ob)
        local i
        local reg
        local ob_8
        local ob_32
        local ob_read = {}        
        local err = "OK"
        local ch_num
 
        if (MULTI_MODE > 0) then
                ch_num = MULTI_MODE
        else
                ch_num = 1
        end       
 
        pg_write32(FLASH_KEYR, FLASH_KEY1)
         pg_write32(FLASH_KEYR, FLASH_KEY2)
        pg_write32(FLASH_OPTKEYR, FLASH_KEY1)
         pg_write32(FLASH_OPTKEYR, FLASH_KEY2)
 
        --start erase the option bytes
         pg_write32(FMC_CTL, pg_read32(FMC_CTL) | FMC_CTL_OBER)
         pg_write32(FMC_CTL, pg_read32(FMC_CTL) | FMC_CTL_START)
 
        FMC_WaitBusy()
 
        reg = pg_read32(FMC_CTL)
        reg = reg & ~FMC_CTL_OBER
        pg_write32(FMC_CTL, reg)        --reset the OBER bit
        pg_write32(FMC_CTL, pg_read32(FMC_CTL) | FMC_CTL_OBPG)        --set the OBPG bi
 
        ob_8 = hex_to_bin(ob)        --hex字符串转为二进制数组
        for i = 0, 3, 1 do
                ob_32 = string.byte(ob_8, 2 * i + 1) + (((~string.byte(ob_8, 2 * i + 1)) << 8) & 0xFF00) +
                        (((string.byte(ob_8, 2 * i + 2)) << 16) & 0xFF0000) + (((~string.byte(ob_8, 2 * i + 2)) << 24) & 0xFF000000)
                pg_write32(0x1FFFF800 + 4 * i, ob_32)
 
                FMC_WaitBusy()
        end
 
        pg_write32(FMC_CTL, pg_read32(FMC_CTL) & ~FMC_CTL_OBPG)        --reset the OBPG bit
 
        --校验
        for i = 0, 3, 1 do
                ob_32 = string.byte(ob_8, 2 * i + 1) + (((~string.byte(ob_8, 2 * i + 1)) << 8) & 0xFF00) +
                        (((string.byte(ob_8, 2 * i + 2)) << 16) & 0xFF0000) + (((~string.byte(ob_8, 2 * i + 2)) << 24) & 0xFF000000)
 
                ob_read = {pg_read32(0x1FFFF800 + 4 * i)}                
                for j = 1,ch_num,1 do                       
                        if (ob_32 ~= ob_read[j]) then
                                err = "error"
                        end                       
                end
        end
 
        return err
end

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

 

标签:烧录,FLASH,Flash,ob,算法,pg,CTL,local,FMC
From: https://www.cnblogs.com/armfly/p/18516016

相关文章

  • 《贪婪算法实战:寻找最短无序连续子数组的深度解析与实现》
    ......
  • 百度二面算法:合法的括号字符串(贪心解法)
    目录标题1.题目1.1示例2.利用贪心算法求解2.1代码结构分析2.1.1代码优缺点2.1.2星号的角色分析2.1.2.1处理星号的逻辑2.1.2.2整体逻辑2.1.2.3代码逻辑总结2.2贪心的策略体现2.2.1贪心策略的应用1.题目给定一个字符串s,字符串......
  • 算法网关视频分析网关算法定制:适合视频分析的深度学习架构及视频分析原理和应用
    随着信息技术的突飞猛进,视频监控技术已经从模拟监控时代跨入了高清、智能化的新纪元。在这场技术革新中,算法定制视频分析网关扮演着至关重要的角色,它作为连接前端摄像头与后端管理平台的桥梁,其作用日益凸显,不可或缺。一、适合视频分析的深度学习架构深度学习在视频监控系统中的......
  • 【算法】前缀树
    基本内容以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀入门例子PHONELST-PhoneList-洛谷|计算机科学教育新生态题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”,“91140”,“20”,“912”}中,“911”......
  • 基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) BO优化前 BO优化过程 BO优化后  2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)MBsize=32;Lr=0.1;%CNNLSTM构建卷积神经网络laye......
  • 安全帽检测视频分析网关算法定制安全帽检测算法的原理及应用
    安全帽在建筑和制造业等企业的生产活动中扮演着至关重要的劳动保护角色,其佩戴情况的实时监控是企业安全生产管理的关键组成部分。以往依赖人工巡检的安全监管方式不仅效率低,而且难以实现全面监督。应用安全帽检测视频分析网关,安全监管已经从被动式监察转变为主动式监控,利用技术手......
  • AI智能分析视频分析网关算法定制AI赋能视频监控技术的进化之路
    随着人工智能(AI)技术的快速进步,其在众多领域的应用日益广泛,特别是在视频监控行业中表现出了强大的潜力和显著的价值。AI视频监控技术不仅增强了监控系统的智能化程度,还显著提高了安全管理的效率与精确度。本文将详细讨论AI智能分析视频分析网关的关键技术和在各个领域的应用情况。......
  • C++算法练习-day26——239.滑动窗口的最大值
    题目来源:.-力扣(LeetCode)题目思路分析题目:给定一个整数数组 nums 和一个整数 k,请找出该数组中所有长度为 k 的子数组中的最大元素,并返回这些最大元素组成的数组。思路:滑动窗口:这是一个典型的滑动窗口问题,其中窗口的大小为 k。我们需要遍历整个数组,同时保持一......
  • C++算法练习-day27——347.前k个高频元素
    题目来源:.-力扣(LeetCode)题目思路分析题目:找出数组中出现频率最高的前K个元素。这个问题要求我们从给定的数组nums中找出频率最高的前k个元素。这通常意味着我们需要统计每个元素的出现次数,然后根据这些次数进行排序,并提取前k个元素。以下是解决这个问题的思路:统计频率:首......
  • 算法学习笔记5: 排序算法
    排序算法归并排序时间复杂度O(nlogn)空间复杂度O(n),稳定排序就是给定两个有序数组,将两个数组合并在一起升序。定义一个更大的数组,给定两个指针分别指向两个数组,每次取较小值放入新数组。voidmergeSort(inta[],intl,intr){ if(l>=r)return; intmid=l+r>>1;......