本文介绍了如何解决 STM32 芯片 Flash 写保护导致无法下载程序,无法在线调试的问题;如果您遇到相同的问题,希望本文可以带来一些帮助;
1 FLASH 的写保护
如果对 Flash 设置了写保护,那就无法对 Flash 进行编程和擦除。
在开发 STM32 的时候,如果出现这种情况,通常仿真器都支持对 Flash 进行解锁,像 jlink,stlink 等仿真器都支持这个功能。
2 错误提示
在使用 MDK 进行调试的时候,出现报错 ==Flash Timeout.Reset Target and try it again==,具体如下图所示;
折腾了一番之后,并没有解决问题,因为使用的仿真器是 stlink,因此下载了 stlink utility 尝试解决问题;
3 stlink utility
3.1 基本功能
stlink utility 是 ST 官方提供的免费软件,支持 STM32 ST-LINK 的程序包括带有命令行界面(CLI)的图形用户界面(GUI)。该工具还提供了较多的其他功能,具体如下;
可以对 STM32 内部存储器 (Flash,RAM,OTP 和其他存储器),外部存储器进行编程;
验证程序内容(校验和,在编程期间和之后进行校验,与文件进行比较等)
还能实现 STM32 编程自动化;
另外还提供其他的功能;
3.2 解锁 Flash
在 stlink 连接目标板的情况下,打开 stlink utility,在菜单栏的 Target 下选择 connect,因为这时候 Flash 已经被锁住了,所以同样地也看到相应的错误提示 Can not read memory Disable Read Out Protection and retry,具体如下图所示;
OK,下面只需要接触写保护就行了,所以在菜单栏 target 里打开 Option Bytes... 选项,或者直接通过快捷键 ctrl+B 打开,请确保当前已经正确连接了 stlink 和目标板,否则会出现报错;
正确连接的情况下,打开 Option Bytes...,发现在这里 Read Out Protection 选项是 enable,这个表示无法通过 swd 读取 STM32 内部 Flash 的程序。
关键点:将 Read Out Protection 选项设置为 disable,点击 Apply,这时候 Flash 已经成功解锁了。但是同时发现,内部 Flash 已经被擦除了;
这可能 STM32 的保护机制有关,防止程序被拷机,然后进行反编译破解,这样也可以提高破解的门槛。具体显示如下图所示;
完成以上步骤之后,在菜单栏 Target 下选择 Disconnect,或者通过快捷键 ctrl+D 断开和目标板的连接;重新进入 MDK,就能正常对目标板进行调试,仿真,以及程序的烧写。
3.3 写保护
在菜单栏 target 里打开 Option Bytes... 选项,我们还看到下面有 Flash sector protection 选项;选择 Select all 之后,发现所有 Page 都已经写保护了,只要选择 apply 选项就可以对 Flash 进行写保护;具体如下所示;
4 总结
对于 Flash 写保护的问题可以结合 STM32 参考手册进行相应的学习,其内部 Flash 提供相应的保护机制,本文只是结合 ST 官方工具 stlink utility 解决一下常见的这个简单的问题。