stm32f4一直没法解除读保护怎么办

如题,已经试过STM32CubeProgrammer
stm32ST_LINKunility
keil5带的复位功能
还有flash Loader Demonstrator
全都不行,情况如下
STM32CubeProgrammer

img


stm32ST_LINKunility

img

img

img

keil5

img

img


flash Loader Demonstrator
这个是一直卡在这个界面

img


我现在感觉就是我的指令写不进去,但是不知道为什么,也不知道怎么办……有没有人救一下啊!这是学校的板子,我们自己买都不知道去哪……

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    我有一些解决读保护问题的建议:

    1.检查芯片是否损坏或非法:

    使用 ST_LINK 解除 STM32F4 的读保护模式时,需要设置 Option Bytes 的值,如果之前用户执行了 FLASH 编程操作或者设置了不正确的 Option Bytes 值,就可能会导致读保护无法解除。因此,首先建议您检查芯片是否存在损坏或非法操作。

    2.使用 STLINK Utility 重新刷写 Option Bytes:

    如果您尝试使用 STM32CubeProgrammer、Keil5、Flash Loader Demonstrator 等工具无法解除读保护模式,此时您可以尝试使用 STLINK Utility 工具重新刷写 Option Bytes。

    具体步骤如下:

    a.连接 STM32F4 板子并打开 STLINK Utility 工具;

    b.选择 Target -> Option Bytes 页面,设置 RDP 密码为 Level 0;

    c.单击 Read Out Protection 的下拉框,选择禁用选项 Disable Read Out Protection,然后单击 Apply 按钮;

    d.单击 Program & Verify 按钮,将新的 Option Bytes 代码刷写到芯片中,这样您就成功将 STM32F4 的读保护模式禁用了。

    代码示例:

    #include "stm32f4xx.h"
    
    #define FLASH_BASE_ADDRESS 0x08000000
    
    void Disable_ReadOutProtection(void)
    {
      /* Unlock the Flash Bank1 Program Erase controller */
      FLASH_Unlock();
    
      /* Wait until Flash Program area unlocked flag is set*/
      while (FLASH_GetFlagStatus(FLASH_FLAG_EOP) == RESET) {}
    
      /* Clear all FLASH flags */
      FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR|FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
    
      /* Set Start Address of the sector to be erased */
      FLASH_EraseSector(FLASH_Sector_0, VoltageRange_3);
    
      /* Wait until End of peripheral operation flag is set */
      while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)==RESET) {}
    
      /* Override the default RCC clock configuration, in order to 
         enable the flash programming during device Run phase 
         (see System_stm32f4xx.c file) */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
      PWR_CR |= PWR_CR_BYTE1_ADDRESS;
      FLASH->OPTCR |= 0x01;
    
      /* Lock the Flash Bank1 Program Erase controller */
      FLASH_Lock();
    }
    
    int main(void)
    {
      /* Disable Readout Protection */
      Disable_ReadOutProtection();
    
      return 0;
    }
    

    3.使用 JLink 调试器解除读保护模式:

    使用 JLink 调试器解除 STM32F4 的读保护模式需要以下步骤:

    a.连接 STM32F4 板子和 JLink 调试器;

    b.打开 JLinkGDBServer,并输入以下命令:unlock kinetis_flash

    c.然后在 gdb 控制台中输入:monitor mass_erase,mass_erase 命令将删除所有 Flash 数据;

    d.输入 savebin 0x08000000 0x00010000 test.bin 命令将 Flash 数据保存到 test.bin 文件中;

    e.最后输入 quit 命令退出 gdb。

    4.使用 OpenOCD 解除读保护模式:

    如果您希望使用 OpenOCD 解除 STM32F4 的读保护模式,您需要使用以下命令:

    a.启动 OpenOCD:openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg

    b.在 gdb 控制台中输入以下命令:

    source [find interface/stlink-v2.cfg]
    source [find target/stm32f4x.cfg]
    
    # Erase entire flash except BOOTLOADER
    init
    reset halt
    flash protect 0 0x08000000 last off
    flash erase_sector 0 0 11
    flash write_bank 0 path/to/your/file.bin 0
    reset run
    exit
    

    以上两个命令文件可以用一个 .cfg 代替,路径在 openocd 的安装目录下。

    以上是一些解决读保护问题的建议,希望对您有所帮助。如果您还有任何疑问,请随时与我联系。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你用的具体什么型号

整片擦除自然就可以了。
你该不会是想擦除读保护,然后读取别人的程序吧?这个用脚后跟想想也不可能啊,如果这样可以,那代码保护功能还有个屁用啊。