ここには簡潔に記載することにする。
【原因】
STM32CubeIDEのCode Generator(コードジェネレーター)で出力された以下、__HAL_AFIO_REMAP_SWJ_DISABLE(); のコードである。
__HAL_AFIO_REMAP_SWJ_DISABLE()は、JTAG-DPとSW-DPをDisabledにする設定なので ST-Link等のデバッガーが接続できなくなって当然である。
main()
+- HAL_Init()
| +- HAL_MspInit()
| +- __HAL_AFIO_REMAP_SWJ_DISABLE() ★これが原因
|
【対処】
HAL_MspInit()でコールしている__HAL_AFIO_REMAP_SWJ_DISABLE()を削除すれば良いのだが、ST-Linkが接続できないので、STM32 ST-LINK Utilityを使用してFLASHメモリに書き込んだプログラムを削除する必要がある。
【ST-LINK Utilityで接続する方法】
前提条件として、基板にRESETスイッチが必要である。(RESETスイッチが無い場合、基板に通電した状態でマイコン端子のNRSTをGNDに落とした状態がRESETスイッチON状態、GNDから離せばスイッチOFF状態ですが、場合によっては抵抗(10KΩ)を付けないと基板が死にます。RESETサブ基板を作りましょう)
手順①:ST-LINK Utilityを起動する。※ST社サイトからダウンロードできます。
手順②:基板のRESETスイッチを押し続ける。
手順③:ST-LINK Utilityの[Connect to the target]ボタンをクリックする。
手順④:基板のRESETスイッチを離す。
※接続できない場合、手順④の実施タイミングにより接続できない時があるので、手順②からやり直しましょう。
手順⑤:書き込んだセクターだけをメニューの[Erase sector]で消去する。
※[Full chip erase]ボタンでFLASHメモリの全領域を消去しても良いが、DFU(プログラムダウンローダー)まで消去される。私はDFUを使用せず、ST-Linkでプログラムを書き込んでいるので全領域消去してます。
※Erase sectorを調べるには、プログラムが書き込まれているアドレス範囲を調べる必要がある。debugまたはreleaseフォルダからxxxx.mapファイルを検索して、エディタで開いて確認しましょう。
手順⑥:[Disconnect from the target]ボタンをクリックする。
【対処完了】
これで、STM32CubeIDEでST-Link-V2が接続できます。原因を排除したプログラムでデバッグ再開できます。