From f3cf2b4bc8f2943b0565fdd21e471c7bbd9fad8d Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Tue, 21 Jul 2026 14:01:29 +0200 Subject: [PATCH 1/4] feat(stm32cubeprog): change -f/--file to -b/-bin Signed-off-by: Frederic Pillon --- stm32CubeProg.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stm32CubeProg.sh b/stm32CubeProg.sh index a3f9d24ab..25f822fb1 100644 --- a/stm32CubeProg.sh +++ b/stm32CubeProg.sh @@ -29,7 +29,7 @@ usage() { Mandatory options: -i, --interface <'swd'/'dfu'/'serial'/'jlink'> interface identifier: 'swd', 'dfu', 'serial' or 'jlink' - -f, --file file path to be downloaded: bin or hex + -b, --bin binary file path to be downloaded: bin or hex Optional options: -a, --address flash base address. Default: $ADDRESS -e, --erase erase all sectors before flashing @@ -120,12 +120,12 @@ esac # parse command line arguments # options may be followed by one colon to indicate they have a required arg if [ -n "${GNU_GETOPT}" ]; then - if ! options=$(getopt a:hi:m:ef:o:c:r:s:d:v:p: "$@"); then + if ! options=$(getopt a:b:hi:m:e:o:c:r:s:d:v:p: "$@"); then echo "Terminating..." >&2 exit 1 fi else - if ! options=$(getopt -a -o a:hi:m:ef:o:c:r:s:d:v:p: --long address:,help,interface:,mode:,erase,file:,start:,offset:,com:,rts:,dtr:,vid:,pid:,parity: -- "$@"); then + if ! options=$(getopt -a -o a:b:hi:m:e:o:c:r:s:d:v:p: --long address:,bin:,help,interface:,mode:,erase,start:,offset:,com:,rts:,dtr:,vid:,pid:,parity: -- "$@"); then echo "Terminating..." >&2 exit 1 fi @@ -159,7 +159,7 @@ while true; do ERASE="--erase all" shift 1 ;; - -f | --file) + -b | --bin) FILEPATH=$2 shift 2 ;; @@ -207,7 +207,7 @@ if [ -z "${INTERFACE}" ]; then usage 1 fi if [ -z "${FILEPATH}" ]; then - echo "Error missing file argmument!" >&2 + echo "Error missing binary file argument!" >&2 usage 1 fi if [ ! -r "${FILEPATH}" ]; then From ce48a420e04256b354b21a84ad59e2c91ba482a1 Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Tue, 21 Jul 2026 14:37:22 +0200 Subject: [PATCH 2/4] chore(stm32cubeprog): review options sort per feature and alphabetical order. Signed-off-by: Frederic Pillon --- stm32CubeProg.sh | 50 ++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/stm32CubeProg.sh b/stm32CubeProg.sh index 25f822fb1..745b47fce 100644 --- a/stm32CubeProg.sh +++ b/stm32CubeProg.sh @@ -12,8 +12,9 @@ OFFSET=0x0 # Optional ADDRESS=0x8000000 START=0x8000000 -MODE=UR ERASE= +# Optional for SWD +MODE=UR # Optional for Serial RTS= DTR= @@ -33,19 +34,22 @@ usage() { Optional options: -a, --address flash base address. Default: $ADDRESS -e, --erase erase all sectors before flashing - -m, --mode connection mode: UR (default), HOTPLUG, POWERDOWN or hwRstPulse -s, --start start address after flashing. Default: $START -o, --offset offset from flash base ($ADDRESS) where flashing should start + Specific options for SWD protocol: + Optional: + -m, --mode connection mode: UR (default), HOTPLUG, POWERDOWN or hwRstPulse + Specific options for Serial protocol: Mandatory: - -c, --com serial identifier, ex: COM1 or /dev/ttyS0,... + -c, --com serial identifier, ex: COM1 or /dev/ttyS0,... Optional: - -r, --rts polarity of RTS signal ('low' by default) -d, --dtr polarity of DTR signal -p, --parity parity bit configuration ('even' by default) + -r, --rts polarity of RTS signal ('low' by default) - Specific options for DFU protocol: + Specific options for DFU protocol: Mandatory: -v, --vid vendor id, ex: 0x0483 -p, --pid product id, ex: 0xdf11 @@ -120,12 +124,12 @@ esac # parse command line arguments # options may be followed by one colon to indicate they have a required arg if [ -n "${GNU_GETOPT}" ]; then - if ! options=$(getopt a:b:hi:m:e:o:c:r:s:d:v:p: "$@"); then + if ! options=$(getopt hi:b:a:es:o:m:c:d:p:r:v: "$@"); then echo "Terminating..." >&2 exit 1 fi else - if ! options=$(getopt -a -o a:b:hi:m:e:o:c:r:s:d:v:p: --long address:,bin:,help,interface:,mode:,erase,start:,offset:,com:,rts:,dtr:,vid:,pid:,parity: -- "$@"); then + if ! options=$(getopt -a -o hi:b:a:es:o:m:c:d:p:r:v: --long help,interface:,bin:,address:,erase,start:,offset:,mode:,com:,dtr:,parity:,rts:,pid:,vid: -- "$@"); then echo "Terminating..." >&2 exit 1 fi @@ -143,51 +147,51 @@ while true; do echo "Selected interface: $INTERFACE" shift 2 ;; - -m | --mode) - MODE=$2 + -b | --bin) + FILEPATH=$2 shift 2 ;; -a | --address) ADDRESS=$2 shift 2 ;; - -s | --start) - START=$2 - shift 2 - ;; -e | --erase) ERASE="--erase all" shift 1 ;; - -b | --bin) - FILEPATH=$2 + -s | --start) + START=$2 shift 2 ;; -o | --offset) OFFSET=$2 shift 2 ;; - -c | --com) - PORT=$2 + -m | --mode) + MODE=$2 shift 2 ;; - -r | --rts) - RTS=$(echo "rts=$2" | tr '[:upper:]' '[:lower:]') + -c | --com) + PORT=$2 shift 2 ;; -d | --dtr) DTR=$(echo "dtr=$2" | tr '[:upper:]' '[:lower:]') shift 2 ;; - -v | --vid) - VID=$2 - shift 2 - ;; -p | --pid | --parity) PID=$2 PARITY=$(echo "$2" | tr '[:lower:]' '[:upper:]') shift 2 ;; + -r | --rts) + RTS=$(echo "rts=$2" | tr '[:upper:]' '[:lower:]') + shift 2 + ;; + -v | --vid) + VID=$2 + shift 2 + ;; --) shift break From b33b5d738284cfd10e7b52bb55c13bd648cf45e1 Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Tue, 21 Jul 2026 14:56:36 +0200 Subject: [PATCH 3/4] feat(stm32cubeprog): add -f/--freq for swd protocol Signed-off-by: Frederic Pillon --- stm32CubeProg.sh | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/stm32CubeProg.sh b/stm32CubeProg.sh index 745b47fce..3a369f08b 100644 --- a/stm32CubeProg.sh +++ b/stm32CubeProg.sh @@ -14,6 +14,7 @@ ADDRESS=0x8000000 START=0x8000000 ERASE= # Optional for SWD +FREQ= MODE=UR # Optional for Serial RTS= @@ -39,6 +40,7 @@ usage() { Specific options for SWD protocol: Optional: + -f, --freq SWD frequency in KHz. -m, --mode connection mode: UR (default), HOTPLUG, POWERDOWN or hwRstPulse Specific options for Serial protocol: @@ -124,12 +126,12 @@ esac # parse command line arguments # options may be followed by one colon to indicate they have a required arg if [ -n "${GNU_GETOPT}" ]; then - if ! options=$(getopt hi:b:a:es:o:m:c:d:p:r:v: "$@"); then + if ! options=$(getopt hi:b:a:es:o:f:m:c:d:p:r:v: "$@"); then echo "Terminating..." >&2 exit 1 fi else - if ! options=$(getopt -a -o hi:b:a:es:o:m:c:d:p:r:v: --long help,interface:,bin:,address:,erase,start:,offset:,mode:,com:,dtr:,parity:,rts:,pid:,vid: -- "$@"); then + if ! options=$(getopt -a -o hi:b:a:es:o:f:m:c:d:p:r:v: --long help,interface:,bin:,address:,erase,start:,offset:,freq:,mode:,com:,dtr:,parity:,rts:,pid:,vid: -- "$@"); then echo "Terminating..." >&2 exit 1 fi @@ -167,6 +169,10 @@ while true; do OFFSET=$2 shift 2 ;; + -f | --freq) + FREQ=$2 + shift 2 + ;; -m | --mode) MODE=$2 shift 2 @@ -221,7 +227,20 @@ fi case "${INTERFACE}" in swd) - ${STM32CP_CLI} --connect port=SWD mode="${MODE}" "${ERASE}" --quietMode --download "${FILEPATH}" "${ADDRESS}" --start "${START}" + PORT_PARAM="port=SWD" + if [ -n "${FREQ}" ]; then + case "${FREQ}" in + 0) ;; + *[!0-9]*) + echo "Invalid SWD frequency (expected integer KHz): ${FREQ}" >&2 + exit 1 + ;; + *) + PORT_PARAM="${PORT_PARAM} freq=${FREQ}" + ;; + esac + fi + ${STM32CP_CLI} --connect "${PORT_PARAM}" mode="${MODE}" "${ERASE}" --quietMode --download "${FILEPATH}" "${ADDRESS}" --start "${START}" ;; dfu) if [ -z "${VID}" ] || [ -z "${PID}" ]; then From 744264d54a1f02f365fcf1429d0ce198f55f82a5 Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Tue, 21 Jul 2026 16:32:03 +0200 Subject: [PATCH 4/4] feat(stm32cubeprog): add stlink serial number option Signed-off-by: bipoe Co-Authored-By: Frederic Pillon --- stm32CubeProg.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/stm32CubeProg.sh b/stm32CubeProg.sh index 3a369f08b..04faa7a2d 100644 --- a/stm32CubeProg.sh +++ b/stm32CubeProg.sh @@ -16,6 +16,7 @@ ERASE= # Optional for SWD FREQ= MODE=UR +SERIAL_NUMBER= # Optional for Serial RTS= DTR= @@ -42,7 +43,7 @@ usage() { Optional: -f, --freq SWD frequency in KHz. -m, --mode connection mode: UR (default), HOTPLUG, POWERDOWN or hwRstPulse - + -n, --snum serial number of the ST-Link device (if multiple ST-Link devices are connected) Specific options for Serial protocol: Mandatory: -c, --com serial identifier, ex: COM1 or /dev/ttyS0,... @@ -126,12 +127,12 @@ esac # parse command line arguments # options may be followed by one colon to indicate they have a required arg if [ -n "${GNU_GETOPT}" ]; then - if ! options=$(getopt hi:b:a:es:o:f:m:c:d:p:r:v: "$@"); then + if ! options=$(getopt hi:b:a:es:o:f:m:n:c:d:p:r:v: "$@"); then echo "Terminating..." >&2 exit 1 fi else - if ! options=$(getopt -a -o hi:b:a:es:o:f:m:c:d:p:r:v: --long help,interface:,bin:,address:,erase,start:,offset:,freq:,mode:,com:,dtr:,parity:,rts:,pid:,vid: -- "$@"); then + if ! options=$(getopt -a -o hi:b:a:es:o:f:m:n:c:d:p:r:v: --long help,interface:,bin:,address:,erase,start:,offset:,freq:,mode:,snum:,com:,dtr:,parity:,rts:,pid:,vid: -- "$@"); then echo "Terminating..." >&2 exit 1 fi @@ -177,6 +178,10 @@ while true; do MODE=$2 shift 2 ;; + -n | --snum) + SERIAL_NUMBER="$2" + shift 2 + ;; -c | --com) PORT=$2 shift 2 @@ -240,6 +245,9 @@ case "${INTERFACE}" in ;; esac fi + if [ -n "${SERIAL_NUMBER}" ] && [ "${SERIAL_NUMBER}" != "0" ]; then + PORT_PARAM="${PORT_PARAM} sn=${SERIAL_NUMBER}" + fi ${STM32CP_CLI} --connect "${PORT_PARAM}" mode="${MODE}" "${ERASE}" --quietMode --download "${FILEPATH}" "${ADDRESS}" --start "${START}" ;; dfu)