硬汉嵌入式论坛

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

[脱机烧录] H7-TOOL自制Flash读写保护算法系列,为武汉芯源CW32L012制作使能和解除算法,支持在线烧录和脱机烧录使用2025-09-23

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 3 天前 | 显示全部楼层 |阅读模式
说明:

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

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

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

这次为武汉芯源CW32L012提供支持

实现效果:

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


123.png

实现代码和原理

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

对应的代码如下,这个不需要用户去管,已经封装到TOOL里面了,这里给大家分享是方便大家了解:
[Lua] 纯文本查看 复制代码
-------------------------------------------------------
-- 文件名 : CW32L012_64K.lua
-- 版  本 : V1.0  2024-09-29
-- 说  明 :
-------------------------------------------------------

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

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

function config_cpu(void)
	CHIP_TYPE = "SWD"		--指定器件接口类型: "SWD", "SWIM", "SPI", "I2C", "UART"

	AlgoFile_FLASH = "0:/H7-TOOL/Programmer/Device/WHXY/CW32L012/FLM/FlashCW32L012_TEST.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 = 1		--编程前需要重新执行一下Init
	FLM_INIT_BEFOR_VERIFY = 1	--FlM Verify前需要重新执行一下Init
	
	--SB_FLASH_ADDR = 0
	--FLM_STATIC_BASE = 0x20000194 + 0x34   --GLOAL VAR + 0X34
	--FLM_BUFFER_ADDR = 0x200022f0	这个选项其实可以废除
	--FLM_INIT_CLK = 0x03d09000
	
	--SB_FLASH_ADDR2   = 0x00001E00
	--FLM_STATIC_BASE2 = 0x20000570	
	
	--DEBUG_AP = 0
	--DISABLE_BLOCK_ACCESS = 0	
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的寄存器检测功能可以了解各种寄存器地址和状态信息,大大方便算法文件自制:

123.png

相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 08:59 , Processed in 0.044178 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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