View all posts

pyOCD 0.37.0 released

Jul 4, 2025
Teo Mahnic

Version 0.37.0 of pyOCD has just been released and is available from PyPI. It’s been several months since a feature release, and this one includes a major new addition. Some smaller changes and bug fixes have also been included in this release. The complete list is shown below.

To upgrade pyOCD, just run pip:

pip install --upgrade pyocd

This release marks a significant milestone by introducing a built-in support for CMSIS-Toolbox Run and Debug Management, enabling a standardized, YAML-driven workflow for specifying debug targets. By passing the new --cbuild-run command-line option followed by the path to a *.cbuild-run.yml file, the following is imported directly into the active debug session:

  • target selection,
  • flash algorithms,
  • memory layout description,
  • device debug topology,
  • debug sequences

Because each YAML file fully describes a single target type, explicit use of --target is no longer required. This implementation integrates seamlessly with Arm CMSIS Debugger extension for VS Code, streamlining end-to-end debug setup for CMSIS-Pack based projects.

Thanks again to all the contributors who helped make this release possible! ❤️

v0.37.0 on GitHub
v0.37.0 on PyPI


Important note

With this release, Python 3.7 is no longer supported. The minimum Python version is now 3.8.0.

Improvements

  • CMSIS-Toolbox Run and Debug Management integration:
    • add a --cbuild-run option across subcommands
    • select target based on cbuild-run
    • debugger-clock setting from cbuild-run
    • default memory map
    • primary-core and GDB server port selection based on cbuild-run
  • GDB server:
    • add option for stetting soft breakpoints as hard
    • add option for resetting and running the target without halting
    • stricter qC command handling (@tlyu)
  • Coresight:
    • add apid handling
    • add AP CSW register SPROT bit handling
    • fix offset for APv2 in discovery step
  • Loader: generate reset when loading to RAM
  • RTOS: add hint for Zephyr’s thread info configuration
  • RTT: allow no down-channels (@laurensmiers)
  • Debug sequence: increase robustness
  • Memory map: add pname based filtering
  • Probe: filter out Cypress KitProg3 bridge

Fixes

  • Fix progress bar reprinting the same value when no progress is made
  • Typing: fix typing of chip_erase from bool to str (@NilsIrl)
  • pytest: use assert_not_called instead of not_called
  • target: disable reads of erased sectors if Verify function is provided in the algorithm
  • flash:
    • disable builder double buffering by default
    • write XPSR register on init on Cortex-M devices

Targets

  • Add MPS2 AN521 target
  • Add Ambiq Apollo3 target and NM180410 board (@joshua-nmi)
  • Add RP2350 target (@konkers)
  • Add nRF54L15 target (@maxd-nordic)
  • Add STM32H750 target (@nattgris)
  • Add HC32F115/155/334/467/472 targets (@wuze)
  • Update HC32F448/45x/460/4A0(2) targets (@wuze)
  • Fix sector size and RDP check on STM32H743 and H723 (@nattgris)

Other

  • Docs:
    • fix incorrect documentation for default GDB server port (@FredeHoey)
    • document cbuild-run support
    • enhance load subcommand guidance
  • CI:
    • drop Python 3.7 and add 3.12 and 3.13
    • update upload-artifact following deprecation
    • update CodeQL workflow
    • add workflow for generating standalone binaries using PyInstaller
  • Session: add missing return in UserScriptFunctionProxy
  • Optional use of libusb-package with fallback to pyusb (@dvzrv)

View Full Changelog