专栏名称: 安富莱电子
由武汉安富莱电子有限公司负责维护。每周发布嵌入式周报,嵌入式领域最新消息和技术分享。内容原创。
目录
相关文章推荐
FM1007福建交通广播  ·  男星大仓忠义宣布结婚,女方已怀孕!公开信:我 ... ·  昨天  
FM1007福建交通广播  ·  男星大仓忠义宣布结婚,女方已怀孕!公开信:我 ... ·  昨天  
51好读  ›  专栏  ›  安富莱电子

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

安富莱电子  · 公众号  ·  · 2024-07-30 01:08

正文


前言
一般使用IDE或者脱机下载器给芯片得内置Flash或者外置Flash烧录程序,主要是通过制作烧录算法文件来实现,比如之前分享得这个帖子:
【实战技能】任何支持SWD接口的单片机都可以方便移植的SPI 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"






请到「今天看啥」查看全文