硬汉嵌入式论坛

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

[脱机烧录] H7-TOOL自制Flash读写保护算法系列,为凌欧LKS32MC45x/MC05x/MC08x制作使能和解除算法,支持在线烧录和脱机烧录使用2024-12-15

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2024-12-15 00:25:41 | 显示全部楼层 |阅读模式
说明:

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

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

近期已经自制了STM32H7全系列,N32G003,N32G031,  STM32U5全系列和凌欧LKS32MC03X,复旦微FM33LE系列

这次为凌欧的LKS32MC45x,LKS32MC05x,LKS32MC08x提供Flash保护支持

实现效果:

从2.27版本开始将正式带此支持,支持解除和使能。这款芯片没有选项字节的概念,是通过Flash末尾的4字节来解除和使能(LKS32MC45x通过末尾16个字节)。

解除保护已经在TOOL上位机集成:


12134.png

写保护的时候,大家可以TOOL的滚码常量功能,将Flash末尾设置非0xFFFF FFFF数值即可,比如我这里使用LKS32MC45x的256KB容量Flash,设置地址0x0003FFF0开始的16个字节为0x0000 0000,就可以使能保护。

省事些,直接配置末尾4个为0即可

QQ20241215-002054.png

实现代码和原理

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

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

[Lua] 纯文本查看 复制代码
--芯片专有的解除保护函数
function MCU_RemoveProtect(void)
	--MCU_ProgOptionBytes(OB_SECURE_OFF)

	for j = 1, 2, 1 do
		-- SYS_PROTECT = 0x7a83 开启写使能
		if (pg_write32(0x400198A8, 0x7a83) == 0) then
			--print("pg_write32(0x400000A8, 0x7a83)")
		end

		-- clock 192M
		-- SYS_AFE_REGB = 0 Sel RC
		if (pg_write32(0x4001983C, 0) == 0) then
			--print("pg_write32(0x400000D0, 0x8FCA)")
		end

		-- RC 12MHz ON, XTAL OFF, PLLPDN使能,XTALPDN关闭,RCHPD开
		-- SYS_AFE_REGA = ((1<<1)|(0<<6)|(1<<7)) 
		if (pg_write32(0x40019838, ((1<<1)|(0<<6)|(1<<7))) == 0) then
			--print("pg_write32(0x400000D0, 0x8FCA)")
		end

		--SYS_CLK_CFG = (0xFF|(1<<8)) 192M
		if (pg_write32(0x40019880, (0xFF|(1<<8))) == 0) then
			--print("pg_write32(0x400000D0, 0x8FCA)")
		end	 
		--delayms(100)

		-- SYS_FLSE = 0x8FCA,写入密钥,解除擦除保护
		if (pg_write32(0x400198D0, 0x8FCA) == 0) then
			--print("pg_write32(0x400000D0, 0x8FCA)")
		end

		-- FSMC_ICFG |= BIT31
		pg_write32(0x4001A080, 0x80000000)

		--delayms(50) 

		-- SYS_CLK_CFG = 0x000001FF 48MHz
		--if (pg_write32(0x40000080, 0x000001FF) == 0) then
		--	--print("pg_write32(0x40000080, 0x000001FF)")
		--end

		-- FSMC_IDIV 
		pg_write32(0x4001A09C, 0x54004022)

		--delayms(50) 

		-- FSMC_ADDR = adr; 擦除最后一个扇区
		pg_write32(0x4001A084, 0x0003FC00)

		-- FLASH_ERASE = 0x7654DCBA 触发 On-Chip FLASH 擦除操作
		pg_write32(0x4001A090, 0x7654DCBA)

		-- FSMC_REDY
		pg_read32(0x4001A098)
		delayms(50) 
		pg_read32(0x4001A098)

		--  FSMC_ICFG &= ~BIT31
		pg_write32(0x4001A080, 0x00000000)

		-- SYS_FLSE = 0
		pg_write32(0x400198D0, 0)

		-- SYS_PROTECT = 0x0;  关闭写使能
		if (pg_write32(0x400198A8, 0) == 0) then
			--print("pg_write32(0x400000A8, 0x7a83)")
		end

		delayms(200)
	end

--pg_enter_debug()
end


124.png


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 00:05 , Processed in 0.334997 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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