2023年4月30日日曜日

stm32でLowPowerライブラリ利用時にstlink経由で書き込む場合はリセット可能なstlinkと接続時のリセット設定が必要


背景

LowPowerライブラリで低消費電力処理を行うプログラムを作り、stm32マイコンを利用した基板を作り、stlink2経由でマイコンを実装した基板にプログラムを書き込んだところ、下記のエラーが出て2回目以後の書き込みが出来なくなりました。
xPack OpenOCD x86_64 Open On-Chip Debugger 0.11.0+dev (2021-10-16-21:15)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
debug_level: 1

srst_only separate srst_nogate srst_open_drain connect_assert_srst

hla_swd
Error: init mode failed (unable to connect to the target)
in procedure 'program'
** OpenOCD init failed **
shutdown command invoked

*** [upload] Error 1

以前この問題に遭遇したときはnucleoを利用していたためmbedモードに切り替えることで回避しましたが、今回利用している環境はmbedモードが無くて困りました。

試行錯誤したところ接続時のリセット処理(connect under reset)を有効にすれば書き込み可能と分かったので、関連情報を記事に残します。

使ったもの

  • STM32L432KCが載った基板
  • リセットが機能するstlink
    後でも説明しますがコピー品のstlinkはリセット機能が動かないので注意です。
    コピー品を改造するか、純正のstlink(stlink-v2stlink-v3stlink-v3minieなど)を用意してください。
    改造に取り組まれる方は、はんだごて、はんだ、ペンチ、ピンセット、細いワイヤか細い100Ω前後の抵抗、などをご用意ください。
  • プログラムを書き込むPC
    この記事はubuntu22.04にplatformio + vscodeをインストールした環境を利用しています。

コピー品のstlinkはリセットピンが動かないので改造が必要

接続時にリセットする処理はstlinkのリセットピンを使うのですが、コピー品のstlinkは大体リセットピンの接続が間違っているらしく設定しても効果がありません。

ST-Link - 電子工作専科
ST-Link V2 CloneにReset追加 - 電子工作専科

自分が所有しているaliexpressで購入したstlinkもリセットピンが機能しませんでした。



利用されていたマイコンはSTM32F103C8T6で、テスターで信号線を辿ったところPB0に繋がって欲しいリセット信号がPB5とPB6に100Ωの抵抗を通して繋がっていました。
これをPB8に繋ぎ直します。



参考にしたサイトは抵抗無しでPB8にリセット信号を繋いでいたので、抵抗がなくても機能すると思います。
手元に120Ωの細めの抵抗があったので、自分はそれを繋げつつ、PB5とPB5に繋がる100Ωを除去しました。



この状態にすれば、純正のstlinkと同様に接続時のリセット設定が機能します。

platformio.iniにupload_flagを追加

upload_flagとして「-c reset_config srst_only srst_nogate connect_assert_srst」を設定すると、connect under resetと同等のリセット処理が動いてプログラムを書き込めます。

platformio.ini
[env:l432-on-board]
platform = ststm32
board = nucleo_l432kc
framework = arduino
upload_flags =
-c reset_config srst_only srst_nogate connect_assert_srst

platformioのnucleo_l432kcの標準の書き込みモードはstlinkになっており、platformioのstlinkモードはopenocdを利用してプログラムを送信します。
(これは「pio update -v」など、書き込みコマンドに-vオプションを付けて実行されるコマンドを確認すると分かります。)

openocdでconnect under resetと同様の処理をさせる記述は下記のフォーラムで見つけました。
connect under reset with st-link v2

openocdのreset configをplatformio.iniで反映する方法は下記フォーラムで見つけました。
STM32L Nucleo OpenOCD error on second pass

余談: 低消費電力プログラム開発時に接続時のリセット設定(connect under reset)が必要なのはstmも認識している対処法

プログラムを書き込めない問題について検索していたら、stm公式の
ST-LINK Utilityのリセットスタート
の説明ページにも記載があるのを見つけました。

==== 引用開始
低消費電力モードに入るプログラムコードを書き込んだマイコンは(中略)CPUをデバッグモードにしていないコードだと、ST-Linkとの通信ができなくなり、二度とデバッグモードに入ることができなくなります。Flashのコードも書き換えることができません。 その様な場合はST-Link Utilityを使って解決することができます。
「Connect Under Reset」を選択すると、「Enable debug in Low power mode」にチェックが入ります。
==== 引用終わり

ということで、低消費電力モードを利用するプログラム開発時はconnect under reset設定が必須です。

おわり

接続時のリセット設定を有効化して、nucleoではない独自開発の基板に対してstlinkを利用して、低消費電力モードを利用するLowPowerライブラリを扱うプログラムの書き換えができました。

問題に遭遇したときは一度書き込んだら書き換え不能になるものなのかと冷や汗をかきましたが、対処方法が分かって良かったです。

参考

コピー品のstlinkはリセットピンが動かないと知った記事です。
ST-Link - 電子工作専科
ST-Link V2 CloneにReset追加 - 電子工作専科

platformio.iniへの記述追加でopenocdのreset configと同等の処理を行う方法を把握する参考になった記事です。
connect under reset with st-link v2
STM32L Nucleo OpenOCD error on second pass

0 件のコメント :