山东平台网站建设制作,阜阳市网站建设,wordpress修改样式表,网站开发中网页打印说明#xff1a;
很多IC厂家仅发布了内部Flash算法文件#xff0c;并没有提供读写保护算法文件#xff0c;也就是选项字节算法文件#xff0c;需要我们制作。
实际上当前已经发布的TOOL版本#xff0c;已经自制很多了。但是依然有些厂家还没自制#xff0c;所以陆续开始…说明
很多IC厂家仅发布了内部Flash算法文件并没有提供读写保护算法文件也就是选项字节算法文件需要我们制作。
实际上当前已经发布的TOOL版本已经自制很多了。但是依然有些厂家还没自制所以陆续开始为这些厂家提供读写保护支持。
近期已经自制了STM32H7全系列N32G003N32G031, STM32U5全系列和凌欧LKS32MC03X。
之前我们已经为兆易创新自制了GD32E50xGD32E10xGD32F3x0GD32F4xxGD32F10xGD32F20xGD32F30xGD32F1x0GD32C10x等系列的选项字节编程算法功能含读写保护。
这次为GD32E23x系列也提供支持。 实现效果
从2.27版本开始将正式带此支持支持解除和使能。 实现代码和原理
通过H7-TOOL的LUA小程序就可以方便的实现保护解除和使能不需要自制算法文件。
对应的代码如下这个不需要用户去管已经封装到TOOL里面了这里给大家分享是方便大家了解
FLASH_KEYR 0x40022004
FLASH_OPTKEYR 0x40022008FLASH_KEY1 0x45670123
FLASH_KEY2 0xCDEF89ABFMC_STAT 0x4002200C
FMC_CTL 0x40022010
FMC_CTL_OBPG 0x00000010
FMC_CTL_OBER 0x00000020
FMC_CTL_START 0x00000040FMC_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 ilocal retif (MULTI_MODE 0) thenret 0for i 1, MULTI_MODE, 1 doret ret | (data[i] mask)endelseret data[1] maskendreturn ret
end--芯片专有的解除保护函数
function MCU_RemoveProtect(void)MCU_ProgOptionBytes(OB_SECURE_OFF)
endfunction FMC_WaitBusy(ob)local ilocal regfor i 1, 50, 1 doreg {pg_read32(FMC_STAT)}if (CheckFlagQuit0(reg, FMC_STAT_BUSY) 0) thenbreakenddelayms(10)end
end--没有FLM的MCU用脚本实现编程OB。 返回 OK or error
function MCU_ProgOptionBytes(ob)local ilocal reglocal ob_8local ob_32local ob_read {} local err OKlocal ch_numif (MULTI_MODE 0) thench_num MULTI_MODEelsech_num 1end 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 bytespg_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_OBERpg_write32(FMC_CTL, reg) --reset the OBER bitpg_write32(FMC_CTL, pg_read32(FMC_CTL) | FMC_CTL_OBPG) --set the OBPG biob_8 hex_to_bin(ob) --hex字符串转为二进制数组for i 0, 3, 1 doob_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()endpg_write32(FMC_CTL, pg_read32(FMC_CTL) ~FMC_CTL_OBPG) --reset the OBPG bit--校验for i 0, 3, 1 doob_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]) thenerr errorend endendreturn err
end
通过TOOL的寄存器检测功能可以了解各种寄存器地址和状态信息大大方便算法文件自制