当前位置: 首页 > 科技观察

如何优雅地使用MDK解除芯片读保护?

时间:2023-03-15 11:04:20 科技观察

经历过产品量产的同学应该都知道,芯片出厂一般都会开启读保护:要么在代码中添加,要么在烧录程序后通过软件手动开启这个功能,比如STM32ST-LINKUtility:当然你也可以使用这个工具来关闭读保护功能。大多数产品为了保证程序不被读取,应该直接在量产代码中加入这个功能,但这会带来一个麻烦的问题:无法正常调试。每次下载后,如果代码有问题,需要在线调试。为了不忘记你的代码,读保护功能是默认开启的,所以每次下载后,如果发现问题,可能需要找个工具,比如J-Flash或者上面的软件负责关闭读保护,大大降低了我们的开发效率。有没有更好的方法来解锁读保护?今天Osprey介绍一种使用MDK解锁读保护的方法。毕竟大部分道友都会安装MDK软件,所以用起来最合适。首先说说它的读保护原理。读保护功能通过设置相应的OptionBytes实现,掉电不消失,类似于ROM。释放是通过复位相应的OptionBytes来实现的,掉电也不会消失。但不同的是,设置后芯片会自动擦除整个芯片,这样你就不能通过解除读保护来读取读保护了。整个芯片被编码。但是,你会发现一个现象,即使你无法读取FLASH代码,你仍然可以通过上面的工具连接芯片,这就为我们使用MDK解除读保护创造了条件。在Osprey之前的笔记中,有介绍如何让代码运行在RAM中。既然读保护保护的是FLASH区域,RAM不受影响,那么我们就可以把我们释放的代码加载到RAM中运行,这样我们就可以通过MDK解除芯片的读保护。具体操作如下:1、设置一个新的target,例如:然后设置target的输出目录,这样只需要编译一次,然后就可以直接切换target,直接点debug,不行需要反复编译,比较方便(不同于普通的输出目录)。新建两个目录,并选择对应的目录。2.切换到新目标,然后在C/C++选项卡中添加一个新的宏READ_PROTECT。然后根据宏在代码中添加读保护代码3.将代码地址重定位到RAM(0x20000000为RAM首地址,假设64K空间)4.新建run_ram文件,内容如下:save把它放在工程目录下,然后正确添加:去掉勾选(这样程序就不会下载到FLASH):5.编译,然后点击Debug。这时程序应该会自动停在断点__breakpoint(0)处,说明代码已经释放顺利运行完成。好好享受!!!每次需要释放芯片的读保护功能时,只需切换目标即可成功释放(前提是已经编译过一次),相当方便。当然,如果不想编译,也可以直接生成一个axf文件保存起来,只要每次加载这个文件,就可以成功去除。一次设置,不用担心,非常实用!