说明:
很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。
实际上当前已经发布的TOOL版本,已经自制很多了,比如已经支持的兆易创新大部分型号,新唐的大部分型号等。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。
近期已经自制了STM32H7全系列,N32G003,N32G031, N32G43x, STM32U5全系列和凌欧LKS32MC03X,复旦微FM33LE系列,华大电子的CIU32F003系列,凌欧的LKS32MC45x,LKS32MC05x,LKS32MC08x提供Flash保护支持
这次为武汉芯源CW32L010提供支持
实现效果:
从2.30版本开始将正式带此支持,支持解除和使能。
实现代码和原理
通过H7-TOOL的LUA小程序就可以方便的实现保护解除和使能,不需要自制算法文件。
对应的代码如下,这个不需要用户去管,已经封装到TOOL里面了,这里给大家分享是方便大家了解:
[Lua] 纯文本查看 复制代码 -------------------------------------------------------
-- 文件名 : CW32L010_64K.lua
-- 版 本 : V1.0 2024-09-29
-- 说 明 :
-------------------------------------------------------
print("load \"CW32L010_64K.lua\" ok")
IncludeList = {
"0:/H7-TOOL/Programmer/Device/WHXY/Lib/CW32L010_Lib.lua"
}
function config_cpu(void)
CHIP_TYPE = "SWD" --指定器件接口类型: "SWD", "SWIM", "SPI", "I2C", "UART"
AlgoFile_FLASH = "0:/H7-TOOL/Programmer/Device/WHXY/CW32L010/FLM/FlashCW32L010.FLM"
AlgoFile_EEPROM = ""
AlgoFile_OTP = ""
AlgoFile_OPT = ""
AlgoFile_QSPI = ""
OB_PARAM_FILE = "" --OB参数解析文件
FLASH_ADDRESS = 0x00000000 --CPU内部FLASH起始地址
FLASH_SIZE = 64 * 1024 --覆盖FLM中的 Device Size
--EEPROM_ADDRESS = 0 --CPU内部EEPROM起始地址
--EEPROM_SIZE = 0
--OTP_ADDRESS = 0x1FFF7800 --CPU内部OTP(1次可编程)起始地址
--OTP_SIZE = 0x210
RAM_ADDRESS = 0x20000000 --CPU内部RAM起始地址
RAM_SIZE = 4 * 1024
--Flash算法文件加载内存地址和大小
AlgoRamAddr = RAM_ADDRESS
AlgoRamSize = RAM_SIZE
MCU_ID = 0x0BC11477 --IDCODE
UID_NONE = 0 --0表示有UID 1表示无UID
UID_ADDR = 0x001007B0 --UID地址,不同的CPU不同 0x001007B0UL
UID_BYTES = 10
ERASE_CHIP_TIME = 3000 --全片擦除时间ms(STM32F207解除读保护会执行全面擦除,等待时间大概15秒)
VALUE_ERASED = 0xFF --芯片擦除后缺省值,一般是FF, 00。ARM从FLM中取,不用这个值。
OB_FILE_USED = 0 --1表示使用文件方式烧录,0表示用字符串方式烧录,-1表示不支持OB区烧录
--地址组中的FFFFFFFF表示原始数据中插入上个字节的反码 FFFFFFFE 表示原始数据中插入前2个字节的反码
OB_ADDRESS = "0x4000431C"
OB_SECURE_OFF = "50" --SECURE_ENABLE = 0时,编程完毕后写入该值
OB_SECURE_ON = "51" --SECURE_ENABLE = 1时,编程完毕后写入该值
--判断读保护和写保护的条件(WRP = Write protection)
OB_WRP_ADDRESS = {0x4000431C} --内存地址
OB_WRP_MASK = {0xFF} --读出数据与此数相与
OB_WRP_VALUE = {0x50} --相与后与此数比较,相等表示没有保护
--额外的控制指令
FLM_INIT_BEFOR_PROG = 0 --编程前需要重新执行一下Init
FLM_INIT_BEFOR_VERIFY = 0 --FlM Verify前需要重新执行一下Init
end
--用于PC软件, 设置缺省配置参数
function pc_default(void)
TVCC_VOLT = 3.3 --定义CPU供电电压TVCC
VERIFY_MODE = 1 --校验模式: 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 = 0 --复位模式 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 = "ob.lua"
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的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制:
|