硬汉嵌入式论坛

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

[脱机烧录] H7-TOOL自制Flash读写保护算法系列,为领芯微LCM32F067制作使能和解除算法,支持在线烧录和脱机烧录使用2025-12-26

[复制链接]

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 2025-12-26 10:13:55 | 显示全部楼层 |阅读模式
脱机烧录控制LCM32F067选项字节全编程,稍微有点难度,与其他厂家的芯片略有不同,不过通过昨天一天的努力解决了。

说明:

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

实际上当前已经发布的TOOL版本,已经自制很多了,比如已经支持的兆易创新大部分型号,新唐的大部分型号等。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。

近期已经自制了STM32H7全系列,STM32U5全系列,国民技术N32G003,N32G031,  N32G43x,N32G030,复旦微FM33LE,FM33LG,FM33LC,  FM33FR系列,华大电子的CIU32F003,CIU32D655系列,凌欧的LKS32MC03X,LKS32MC45x,LKS32MC05x,LKS32MC08x,武汉芯源CW32L010,CW32L011, CW32L012提供Flash保护支持

这次为领芯微LCM32F067添加支持

实现效果:

从2.32版本开始将正式带此支持,支持解除和使能。这个芯片不管是否接了硬件复位引脚均可,这里选项硬件复位模式模式即可

134.png

实现代码和原理

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

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

[Lua] 纯文本查看 复制代码
-------------------------------------------------------
-- 文件名 : LCM32F067_64.lua
-- 版  本 : V1.0  2025-12-13
-- 说  明 :
-------------------------------------------------------

print("load \"LCM32F067_64.lua.lua\" ok")

IncludeList = {
        "0:/H7-TOOL/Programmer/Device/LINGXIN/Lib/LCM32F0xx_Lib.lua"
}

function config_cpu(void)
        CHIP_TYPE = "SWD"                --指定器件接口类型: "SWD", "SWIM", "SPI", "I2C", "UART"
        AlgoFile_FLASH = "0:/H7-TOOL/Programmer/Device/LINGXIN/LCM32F0xx/FLM/LCM32F067_FLASH.FLM"
        AlgoFile_EEPROM = ""
        AlgoFile_OTP   = ""
        AlgoFile_OPT   = ""
        AlgoFile_QSPI  = ""

        FLASH_ADDRESS = 0x08000000  --CPU内部FLASH起始地址
        FLASH_SIZE = 0x10000  --覆盖FLM中的 Device

        RAM_ADDRESS = 0x20000000  --CPU内部RAM起始地址
        RAM_SIZE = 0x2800

        --Flash算法文件加载内存地址和大小
        AlgoRamAddr = RAM_ADDRESS
        AlgoRamSize = RAM_SIZE

        MCU_ID = 0x0BC11477  --IDCODE

        UID_NONE = 1        --0表示有UID 1表示无UID
        UID_ADDR = 0x180000F0                   --UID地址,不同的CPU不同
        UID_BYTES = 0

        ERASE_CHIP_TIME = 3000                --全片擦除时间ms(STM32F207解除读保护会执行全面擦除,等待时间大概15秒)

        VALUE_ERASED = 0xFF        --芯片擦除后缺省值,一般是FF, 00。ARM从FLM中取,不用这个值。

        --OB使用文件方式烧录(适合256字节以上)
        OB_FILE_USED = 0                --1表示使用文件方式烧录,0表示用字符串方式烧录,-1表示不支持OB区烧录

        OB_ADDRESS     = "1FFFF600 FFFFFFFF 1FFFF602 FFFFFFFF "..   
                                         "1FFFF604 FFFFFFFF 1FFFF606 FFFFFFFF "..   
                                         "1FFFF608 FFFFFFFF 1FFFF60A FFFFFFFF "..  
                                         "1FFFF60C FFFFFFFF 1FFFF60E FFFFFFFF "..  
                                         "1FFFF610 FFFFFFFF 1FFFF612 FFFFFFFF "..  
                                         "1FFFF614 FFFFFFFF 1FFFF616 FFFFFFFF "..  
                                         "1FFFF618 FFFFFFFF 1FFFF61A FFFFFFFF "..
                                         "1FFFF61C FFFFFFFF 1FFFF61E FFFFFFFF "..
                                         "1FFFF620 FFFFFFFF 1FFFF622 FFFFFFFF "..
                                         "1FFFF624 FFFFFFFF 1FFFF626 FFFFFFFF "

        OB_SECURE_OFF  = "FB FF FF FF FF FF FF FF AA AA AA AA AA AA AA AA AA AA AA AA"        --SECURE_ENABLE = 0时,编程完毕后写入该值
        OB_SECURE_ON   = "FB FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 AA AA AA AA"        --SECURE_ENABLE = 1时,编程完毕后写入该值

        --判断读保护和写保护的条件(WRP = Write protection)
        OB_WRP_ADDRESS   = {0x1FFFF610, 0x1FFFF612, 0x1FFFF614, 0x1FFFF616, 0x1FFFF618, 0x1FFFF61A, 0x1FFFF61C, 0x1FFFF61E}         --内存地址 Read Only Register
        OB_WRP_MASK           = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}        --读出数据与此数相与
        OB_WRP_VALUE          = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}        --相与后与此数比较,相等表示没有写保护

        --额外的控制指令
        FLM_INIT_BEFOR_PROG = 1                --编程前需要重新执行一下Init
        FLM_INIT_BEFOR_VERIFY = 1        --FlM Verify前需要重新执行一下Init

        --DEBUG_AP = 0
        --DISABLE_BLOCK_ACCESS = 0

        --IGNORE_WRITE_OB_SECURE_OFF = 1 --解除读保护时全擦芯片,无需再写入OB缺省值
end

--用于PC软件, 设置缺省配置参数
function pc_default(void)
        TVCC_VOLT = 3.3                        --定义CPU供电电压TVCC

        VERIFY_MODE = 0                        --校验模式: 0:自动(FLM提供校验函数或读回) 1:读回  2:软件CRC32  3:STM32硬件CRC32

        REMOVE_RDP_POWEROFF = 1 --写完OB后需要断电
        POWEROFF_TIME1 = 0           --写完OB延迟时间ms
        POWEROFF_TIME2 = 100           --断电时间ms
        POWEROFF_TIME3 = 20           --上电后等待时间ms

        SWD_CLOCK_DELAY_0 = 0         --单路和多路烧录时的时钟延迟
        SWD_CLOCK_DELAY_INIT = SWD_CLOCK_DELAY_0 --初始化阶段的时钟延迟

        AUTO_REMOVE_PROTECT = 1 --自动解除读保护,-1表示不支持

        ISP_UNLOCK = 0                        --支持ISP串口解锁
        ISP_LOCK = 0                        --支持ISP串口加锁

        RESET_MODE = 2                        --复位模式 0:自动模式,  1:软件模式  2:硬件模式 3: UnderReset

        RESET_AFTER_PROG = 1    --编程结束后 0不复位  1复位 2断电重启 3断电

        ERASE_CHIP_MODE = 1                --0按扇区擦除 1擦除全片

        OB_CONFIG_ENABLE = 0        --启用OB配置旋钮

        --OB参数解析文件(和本文件同目录,无需全路径)
        --OB_PARAM_FILE = 

        CHECK_MCU_ID = 0                --缺省不启用IDCODE检查

        --供PC软件选择算法的列表 (算法文件名, 地址,大小,32bit控制字bit1表示禁止查空, 同时预留4个字段 )
        AlgoFile_ListA = {
                "AlgoFile_FLASH" , FLASH_ADDRESS, FLASH_SIZE,  0x00000000, 0, 0, 0, 0,
                --"AlgoFile_EE256B", 0x10000000,    0x0100,           0x00000002, 0, 0, 0, 0,                --EEPROM不支持加载算法查空
        }

        --将指定此地址范围内的文件单独分割出来
        --HEX_FILE_DIV = {
        --        0x90300000, 0x100000,                --起始地址, 大小
        --}

        NOTE_PC = ""  --在器件选择框下面显示重要提示内容

        --有如下行,将自动展示文件内容到LOG窗口
        --VIEW_HELP_FILE = "readme.txt"
end

--判断数据文件合法性
--flm 算法名,数据文件内容,写入地址
function pc_check_file(flm, data, addr)
        --return flm.." 加载的数据文件属于非法数据,可能导致芯片锁死"        --文件有效
        return "OK"
end


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

234.png

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-9 17:39 , Processed in 0.061012 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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