STM32 「NUCLEO-F303K8」でSWVをできるようにする

# 1. はじめに
STMicroelectronics社が販売しているマイコンボード「[Nucleo](https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html)」シリーズの中でも、「NUCLEO-32ボード」は小型でブレッドボードに刺して使うことができ、簡単な実験等には便利なものとなっている。
STMicroelectronics社が提供するSTM32CubeIDEと組み合わせて使用すればデバックも容易に行える。
筆者は、デバック機能の中でもADCの入力値など変化する値をグラフとして表示する「SWVデータトレースタイムライングラフ」は特に便利と感じている。

ただし、この「SWV」は基本的に「NUCLEO-32ボード」では使用できない（例外として[NUCLEO-G431KB](https://www.st.com/en/evaluation-tools/nucleo-g431kb.html)はSWVを使える）。

今回は「NUCLEO-32ボード」シリーズのNUCLEO-F303K8を例に、ハードウェアの改造とSTM32CubeIDEの設定を行ってSWVを使用できるようにする。

# 2. 必要なもの
・SWVしたい「NUCLEO-32ボード」
・はんだごて
・はんだ
・はんだ吸い取り線
・フラックス
・ピンセット
・撚線（の中から1本取り出して使う。1本の太さは0.3mm程度が良い）
・それなりのセンスとはんだ技術

# 3. 解説（飛ばしても良い）
まず前提として、SWVにはSWCLKとSWDIOはもちろんだがSWOも必要である。それぞれの意味は以下。
| 略称  | 意味 |
|:------|:-----|
| SWV   | Serial Wire Viewer |
| SWCLK | Serial Wire Clock |
| SWDIO | Serial Wire Debug Input/Output |
| SWO   | Serial Wire Output |

ここでNUCLEO-F303K8の[Document](https://www.st.com/en/evaluation-tools/nucleo-f303k8.html#documentation)内のSTM32 Nucleo-32 boards (MB1180)の32～34ページの「NUCLEO-32」シリーズの回路図を確認する。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/f08ab5aa-1eac-4a61-9d49-28922e30d4fa.png)
ここで注目すべきは「SWO」の出力端に✖マークが付いている事である。
SWVを動かすにはメインのマイコンからST-Linkを動かしているマイコンへSWOが繋がっていなければならない。

脱線するが比較としてNUCLEO-G431KBの[資料](https://www.st.com/content/st_com/en/search.html#q=MB1430-t=resources-page=1)内のMB1430-G431KB-A02 Board Schematicから回路図を確認してみる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/db29efcc-be21-447b-8529-29ffe93b7f49.png)
SWOがメインマイコンとST-Linkを動かしているマイコン間で接続されている。

話を戻して、SWOを出力できるPinをNUCLEO-F303K8に載っているマイコンSTM32F303K8の[Document](https://www.st.com/en/microcontrollers-microprocessors/stm32f303k8.html#documentation)内のProduct Specifications資料で確認する。
39ページ目にSWOを使用できるPinが記載されている。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/698b9bb7-8e20-4e17-b3c7-b084a29822ec.png)
Pin名は「PB3」、Pin番号は「26」となっている。

マイコンボードNUCLEO-F303K8でこの「PB3」を確認すると
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/a88916fd-64d9-422f-9d2c-86ea060a6629.png)
LD3(ユーザがデバックに使えるLED)に接続されている。

ST-Linkを動かしているマイコン側も確認すると
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/b49b82ca-51aa-422e-a04d-78a4296cf229.png)
何も接続されていない。

つまり、
・ジャンパーSB15取り外し
・メインマイコンの26番PinとST-Linkを動かしているマイコン31番Pinを接続
すればSWVが使えるようになる（LD3は使えなくなるが）。

# 4.ハードウェア改造
① SB15を取り外す（右側の赤枠内ジャンパ）
② U5の31PinとSB15が付いていたパターン部を結線（それぞれ矢印部）
![20250215_060218456_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/6686fedc-8bba-4481-b25b-a98697b284c9.jpeg)

改造後はこのような接続になっている。
![20250215_063908041_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/5f3ed206-52ea-465a-8493-9ae89f8ad34c.jpeg)
![20250215_063916059_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/5cd7bac2-d4a0-41ec-bd5f-3945add71199.jpeg)

# 5. STM32CubeIDEの設定
Pin設定画面にて
System Core → SYS → Debug → Serial WireをTrace Asynchronous Swに変更する。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/22d381ad-97de-4238-8708-11c3548a3360.png)
後はSWVの設定を行えば使うことができる。
SWVのやり方は他記事が多数あるのでここでは省く。

# 6. 動作確認
ここでは簡易に100ms毎にタイマー割り込みをかけてAD値を取得する。
可変抵抗にて3.3Vを分圧し、その電圧をAD値で読み、SWVのトレースグラフにて確認してみる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/40cf9544-a3c7-41ff-a97d-fb93d696b0cd.png)
可変抵抗のつまみを変化させた分が、AD値の変化としてグラフ上で視覚的に見て取れる。

# 7. おわりに
「NUCLEO-32ボード」シリーズでSWVをしている記事やコミュニティを国内外問わず見かけなかったため、備忘録の意も含めここに残す。
はんだ作業は自己責任にて行うこと。はんだ技術がない者に関しては「NUCLEO-64ボード」若しくはNUCLEO-G431KBを大人しく使うことをおすすめする。
Digikeyで最安のNUCLEO-G031K8とNUCLEO-G431KBでは300円程度しか差がない。壊すリスクを負ってまで「NUCLEO-32」シリーズでSWVをする価値はあまり無いだろう。