Skip to main content

Flash firmware to STM32 microcontrollers using Python.

Project description


PyPI package Build Status License Downloads

Python script to upload or download firmware to / from ST Microelectronics STM32 microcontrollers over UART.

Also supports ST BlueNRG devices, and the SweetPeas bootloader for Wiznet W7500.

Compatible with Python version 3.4 to 3.8 or 2.7.


./ [-hqVewvrsRB] [-l length] [-p port] [-b baud] [-P parity] [-a address] [-g address] [-f family] [file.bin]
    -e          Erase (note: this is required on previously written memory)
    -u          Readout unprotect
    -w          Write file content to flash
    -v          Verify flash content versus local file (recommended)
    -r          Read from flash and store in local file
    -l length   Length of read
    -p port     Serial port (default: /dev/tty.usbserial-ftCYPMYJ)
    -b baud     Baud speed (default: 115200)
    -a address  Target address (default: 0x08000000)
    -g address  Start executing from address (0x08000000, usually)
    -f family   Device family to read out device UID and flash size; e.g F1 for STM32F1xx

    -h          Print this help text
    -q          Quiet mode
    -V          Verbose mode

    -s          Swap RTS and DTR: use RTS for reset and DTR for boot0
    -R          Make reset active high
    -B          Make boot0 active low
    -u          Readout unprotect
    -n          No progress: don't show progress bar
    -P parity   Parity: "even" for STM32 (default), "none" for BlueNRG

Example -p /dev/tty.usbserial-ftCYPMYJ -e -w -v somefile.bin

This will pre-erase flash, write somefile.bin to the flash on the device, and then perform a verification after writing is finished.

You can skip the -p option by configuring environment variable STM32LOADER_SERIAL_PORT. Similarly, -f may be supplied through STM32LOADER_FAMILY.

To read out firmware and store it in a file: -r -p /dev/cu.usbserial-A5XK3RJT -f F1 -l 0x10000 -a 0x08000000 dump.bin 

Reference documents

  • ST AN2606: STM32 microcontroller system memory boot mode
  • ST AN3155: USART protocol used in the STM32 bootloader
  • ST AN4872: BlueNRG-1 and BlueNRG-2 UART bootloader protocol


Original Version by Ivan A-R ( Contributions by Domen Puncer, James Snyder, Floris Lambrechts, Atokulus, sam-bristow, NINI1988, Omer Kilic, Szymon Szantula, rdaforno, Mikolaj Stawiski, Tyler Coy, Alex Klimaj, Ondrej Mikle.

Inspiration for features from:


The below assumes you are connecting an STM32F10x. For other chips, the serial pins and/or the BOOT0 / BOOT1 values may differ.

Make the following connections:

  • Serial adapter GND to MCU GND.
  • Serial adapter power to MCU power or vice versa (either 3.3 or 5 Volt).
  • Note if you're using 5 Volt signaling or 3V3 on the serial adapter.
  • Serial TX to MCU RX (PA10).
  • Serial RX to MCU TX (PA9).
  • Serial DTR to MCU RESET.
  • Serial RTS to MCU BOOT0 (or BOOT0 to 3.3V).
  • MCU BOOT1 to GND.

If either RTS or DTR are not available on your serial adapter, you'll have to manually push buttons or work with jumpers. When given a choice, set BOOT0 manually high and drive reset through the serial adepter (it needs to toggle, whereas BOOT0 does not).

Not currently supported

  • Command-line argument for readout protection
  • Command-line argument for write protection/unprotection
  • STM8 devices (ST UM0560)
  • Paged flash erase for devices with page size <> 1 KiB
  • Other bootloader protocols (e.g. I2C, HEX -> implemented in stm32flash)

Future work

  • Use proper logging instead of print statements
  • Try Azure pipelines for CI
  • Support PyPy, PyPy3
  • Drop Python2 support; start using intenum for commands and replies
  • Determine flash page size or make this configurable

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for stm32loader, version 0.5.1
Filename, size File type Python version Upload date Hashes
Filename, size stm32loader-0.5.1-py2.py3-none-any.whl (31.0 kB) File type Wheel Python version py2.py3 Upload date Hashes View
Filename, size stm32loader-0.5.1.tar.gz (36.3 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page