首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分享LUA小程序自制Flash读写保护算法,支持在线烧录和脱机烧录使用

前言

  一般使用IDE或者脱机下载器给芯片得内置Flash或者外置Flash烧录程序,主要是通过制作烧录算法文件来实现,比如之前分享得这个帖子:

  本帖子给大家分享个使用H7-TOOL的LUA小程序直接为芯片的选项字节读写保护提供支持,无需再专门制作文件。

起因

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

  实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。

  这两天已经完成了STM32H7全系列和国民技术N32G031的读写保护算法自制,特别是H7系列芯片,最近好几个网友咨询H7系列芯片保护支持,马不停地,都已经完成。

效果:

对STM32H7全系列做了支持,从2.26版本开始将正式带此支持,支持解除和使能。

国民技术N32G031

原理

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

  对应的代码如下,这个不需要用户去管,已经封装到TOOL里面了,这里给大家分享是方便大家了解,  这个代码就跟C差不多,直接操作目标芯片的选项字节控制寄存器即可,比如H7系列芯片的使能和解除读保护支持。

--寄存器local FLASH_FLASHKEY = 0x40022004local FLASH_OPTKEY = 0x40022008local FLASH_CTRL = 0x40022010local FLASH_FLASH_STS = 0x4002200Clocal FLASH_OB_Address = 0x1FFFF600 --寄存器bitlocal CTRL_Set_OPTER = 0x00000020local CTRL_Set_START = 0x00000040local CTRL_Reset_OPTER = 0x00003FDFlocal CTRL_Set_OPTPG = 0x00000010 local FLASH_FLAG_PGERR = 0x00000004 -- /*!< FLASH Program error flag */local FLASH_FLAG_WRPERR = 0x00000010 -- /*!< FLASH Write protected error flag */local FLASH_FLAG_EOP = 0x00000020 -- /*!< FLASH End of Operation flag */local FLASH_STS_CLRFLAG = 0x34 -- (FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR | FLASH_FLAG_EOP)local FLASH_RDP_RDP1 = 0x000000FF -- /*!< Read protection option byte */local FLASH_USER_USER = 0x00FF0000 -- /*!< User option byte */local FLASH_FLAG_BUSY = 0x00000001 -- /*!< FLASH Busy flag */ local OBR_USER_MSK = 0x000000FClocal L1_RDP_Key = 0xFFFF00A5 --常量值local UNLOCK_KEY1 = 0x45670123local UNLOCK_KEY2 = 0xCDEF89AB local OB_UNLOCK_KEY1 = 0x45670123local OB_UNLOCK_KEY2 = 0xCDEF89AB --判断data数组标志,全部为0则退出function CheckFlagQuit0(data, mask) local i local ret if (MULTI_MODE > 0) then ret = 0 for i = 1, MULTI_MODE, 1 do ret = ret | (data[i] & mask) end else ret = data[1] & mask end return retend --等待超时,(解除读保护时会执行全面擦除) function FLASH_WaitForLastOpt(void) local i local reg = {} for i = 1, 5000, 1 do reg = {pg_read32(FLASH_FLASH_STS)} if (CheckFlagQuit0(reg, FLASH_FLAG_BUSY) == 0) then break end delayms(1) endend --芯片专有的解除保护函数function MCU_RemoveProtect(void) MCU_ProgOptionBytes(OB_SECURE_OFF)end --没有FLM的MCU,用脚本实现编程OB。返回 "OK" or "error"function MCU_ProgOptionBytes(ob) local err = "OK" local ob_8 local ob1 --local usertmp print("MCU_ProgOptionBytes()") pg_write32(FLASH_FLASHKEY, UNLOCK_KEY1) pg_write32(FLASH_FLASHKEY, UNLOCK_KEY2) pg_write32(FLASH_OPTKEY, OB_UNLOCK_KEY1) pg_write32(FLASH_OPTKEY, OB_UNLOCK_KEY2) --FLASH->CTRL |= CTRL_Set_OPTER; --value,re = pg_read32(0x40022010) --value = (value | CTRL_Set_OPTER) --print(string.format("(0x40022010) = 0x%x",value)) pg_write32(FLASH_CTRL, 0x220) --FLASH->CTRL |= CTRL_Set_START; --value,re = pg_read32(0x40022010) --value = (value | CTRL_Set_START) --print(string.format("(0x40022010) = 0x%x",value)) pg_write32(FLASH_CTRL, 0x260) -- 等的操作完成 FLASH_WaitForLastOpt() -- FLASH.FLASH_STS = 0x34 -- FLASH_ClearFlag(FLASH_STS_CLRFLAG) pg_write32(FLASH_FLASH_STS, FLASH_STS_CLRFLAG) -- if the erase operation is completed, disable the OPTER Bit -- FLASH->CTRL &= CTRL_Reset_OPTER; -- value,re = pg_read32(0x40022010) -- value = (value & CTRL_Reset_OPTER) -- print(string.format("(0x40022010) = 0x%x",value)) pg_write32(FLASH_CTRL, 0x200) -- Enable the Option Bytes Programming operation -- FLASH->CTRL |= CTRL_Set_OPTPG; -- value,re = pg_read32(0x40022010) -- print(string.format("(0x40022010) = 0x%x",value)) -- value = (value | CTRL_Set_OPTPG) pg_write32(FLASH_CTRL, 0x210) -- FLASH.FLASH_OB 解除保护 -- value,re = pg_read32(0x4002201C) -- usertmp = ((value & OBR_USER_MSK) << 0x0E) -- usertmp = ((L1_RDP_Key & FLASH_RDP_RDP1) | usertmp) -- print(string.format("(0x4002201C) = 0x%x",value)) ob_8 = hex_to_bin(ob) --hex字符串转为二进制数组 ob1 = string.byte(ob_8, 1) + (((string.byte(ob_8, 2)) << 16) & 0xFF0000) pg_write32(FLASH_OB_Address, ob1) -- 等的操作完成 FLASH_WaitForLastOpt() delayms(500) return errend

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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OCcGo8pIZ8h_fgNCNXCccW9Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券