#!/usr/bin/env bash # Flash / probe helper for the STM32H7S78-DK dual-boot project (macOS/Linux). # # Usage: gcc/flash.sh # # boot Flash Boot (internal flash 0x08000000) # appli Flash Appli (external OSPI flash 0x70000000, needs the external loader) # all Flash Boot then Appli (required order) # probe Connect to the board and print device info (no write) # reset Hardware reset of the board # verify Dump 4 KB of internal and external flash to /tmp for inspection # # The STM32H7RS core sits behind access port 1 and the running firmware can # prevent a hot-plug connection, so every command uses "ap=1 mode=UR". # # STM32_Programmer_CLI is looked up in: $STM32_PROGRAMMER_CLI, $PATH, # the standalone STM32CubeProgrammer app, then the STM32CubeIDE plugin. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BOOT_HEX="$ROOT/Boot/TouchGFX/build/bin/target.hex" APPLI_HEX="$ROOT/Appli/TouchGFX/build/bin/target.hex" LOADER="$ROOT/gcc/MX66UW1G45G_STM32H7S78-DK.stldr" find_cli() { if [[ -n "${STM32_PROGRAMMER_CLI:-}" && -x "$STM32_PROGRAMMER_CLI" ]]; then echo "$STM32_PROGRAMMER_CLI"; return fi if command -v STM32_Programmer_CLI >/dev/null 2>&1; then command -v STM32_Programmer_CLI; return fi local candidates=( "/Applications/STMicroelectronics/programmer/STM32CubeProgrammer.app/Contents/MacOs/bin/STM32_Programmer_CLI" "/Applications/STMicroelectronics/STM32Cube/STM32CubeProgrammer/STM32CubeProgrammer.app/Contents/MacOs/bin/STM32_Programmer_CLI" "/opt/st/stm32cubeclt/STM32CubeProgrammer/bin/STM32_Programmer_CLI" ) # STM32CubeIDE bundles its own copy; the plugin folder name changes with each update local ide for ide in /Applications/STMicroelectronics/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.*/tools/bin/STM32_Programmer_CLI; do candidates+=("$ide") done local c for c in "${candidates[@]}"; do [[ -x "$c" ]] && { echo "$c"; return; } done echo "error: STM32_Programmer_CLI not found (set STM32_PROGRAMMER_CLI)" >&2 exit 1 } require() { [[ -f "$1" ]] || { echo "error: $1 not found - build first (make -C gcc)" >&2; exit 1; } } CLI="$(find_cli)" CONNECT=(-c port=SWD ap=1 mode=UR) flash_boot() { require "$BOOT_HEX" echo ">>> Flashing Boot: $BOOT_HEX" "$CLI" "${CONNECT[@]}" -d "$BOOT_HEX" -v -hardRst } flash_appli() { require "$APPLI_HEX" require "$LOADER" echo ">>> Flashing Appli: $APPLI_HEX (external loader)" "$CLI" "${CONNECT[@]}" -el "$LOADER" -d "$APPLI_HEX" -hardRst } case "${1:-}" in boot) flash_boot ;; appli) flash_appli ;; all) flash_boot; flash_appli ;; probe) "$CLI" -l st; "$CLI" "${CONNECT[@]}" ;; reset) "$CLI" "${CONNECT[@]}" -hardRst ;; verify) "$CLI" "${CONNECT[@]}" -u 0x08000000 0x1000 /tmp/read_int.bin "$CLI" "${CONNECT[@]}" -el "$LOADER" -u 0x70000000 0x1000 /tmp/read_ext.bin ;; *) sed -n '4,12p' "$0" | sed 's/^# \{0,1\}//' exit 1 ;; esac