Skip to content

How to Unlock MCU Flash

EmanuelFeru edited this page Feb 8, 2020 · 23 revisions

This wiki page explains how to unlock the flash of an STM32 or a GD32 to allow re-flashing with a custom firmware.

WARNING: This procedure can erase the MCU firmware irreversibly! Perform these steps at your own risk!

Method 1: Using ST-Link Utility

  • Step 1: Download and install the ST-Link Utility
  • Step 2: Connect the ST-Link programmer to the MCU programming pins GND, SWDIO, SWCLK. Connect the 3V3 pin only if your MCU is not powered externally.
  • Step 3: Open the ST-Link utility and press Connect to target

unlock1

  • Step 4: If you get the message "Can not read memory!" the MCU is most probably locked
  • Step 5: Go to Target and click Option Bytes

unlock2

  • Step 6: Select Disable in Read Out Protection drop-down menu and click Apply

unlock3

  • Step 7: Click Connect to target

unlock4

  • Step 8: If you see the window above, then you have successfully unlocked your MCU. You can now flash the MCU.

Method 2: Using Ubuntu

  • Step 1: Install the ST-Flash Utility
  • Step 2: Install OpenOCD
  • Step 2: Connect the ST-Link programmer to the MCU programming pins GND, SWDIO, SWCLK. Connect the 3V3 pin only if your MCU is not powered externally.
  • Step 3: Open a terminal and send the following OpenOCD command:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x unlock 0"
  • Step 4: If that does not work. Try:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c "mww 0x40022010 0x220" -c "mww 0x40022010 0x260" -c "sleep 100" -c "mww 0x40022010 0x230" -c "mwh 0x1ffff800 0x5AA5" -c "sleep 1000" -c "mww 0x40022010 0x2220" -c "sleep 100" -c "mdw 0x40022010" -c "mdw 0x4002201c" -c "mdw 0x1ffff800" -c targets -c "halt" -c "stm32f1x unlock 0"
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c targets -c "halt" -c "stm32f1x unlock 0"