21
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ggg.jpg

初めに

ロボカップジュニア・ジャパンオープン2026愛知も終わり、無気力症候群に陥っているyumeno_robotです。

今回は自分が忘れないようにするため、STM32マイコンを実装するにあたって自分が迷った点やつまずいたポイントを整理してまとめてみようと思います。これからSTM32を使ってみたい初心者の方はもちろん、一度自作基板を作ったことがある方にとっても、「こういうところで悩むのか」という参考になれば嬉しいです。基本的にSTM32f446REというマイコンをベースに話しますがほかのICでもある程度は同じだと思うのでぜひ参考にしてみてください!

最後にKICADで書いた回路図を乗せているので安心して読んでみてください!

開発するにあたっての全体像

IMG_8172.png

STM32と聞くと、多くの人がこのような白い基板をイメージすると思います。これは STM32 Nucleoと呼ばれる開発ボードです。この基板は、実は上下で異なる役割を持っており、切り離して使うことができます。

上側の基板は ST-LINKと呼ばれ、プログラムの書き込みやデバッグを行うための機能を持っています。一方、下側の基板は ターゲットボード(MCUボード) と呼ばれ、実際にプログラムが動作するマイコン(STM32F446REやSTM32F411REなどのマイコン)が搭載されています。

基本的な使い方としては、下側のボードをロボットに搭載し、プログラムを書き込むときやデバッグ時のみ、上側のST-LINK基板と接続するという形になります。これらはSWD(Serial Wire Debug)という通信方式を使って接続します。そのため、実際の自作基板では

・VAPP
・SWDIO
・SWCLK
・GND
・3.3V

といったピンをマイコンを搭載した基板から引き出しておき、XHコネクタなどで接続できるようにしておきます。このように、「開発用の書き込み装置」と「実際に動作するマイコン部分」を分けて開発します。

実際、私の全国大会基板には上部や側面にXHコネクターで接続できるようにしています。

IMG_8176.jpg
IMG_8173.jpg

書き込みに使用するST-LINK基板はNucleoを分割して使用するのもOKですが、それ専用のモジュールが発売されているらしいです、、、しかし私はこれで十分だと感じています。興味があればぜひそちらも調べてみてください!!

Serial書き込みも可能

STM32マイコンにプログラムを書き込む方法として、前述したようにST-LINKを用いる方法がありますが、それ以外にもArduinoなどで使われているようなシリアル(UART)書き込みを行うことも可能です。ただし、この方法を使用する場合は追加の回路が必要になります。

PC → コネクタ → USB-シリアル変換IC → STM32

このシリアル書き込みは、STM32に内蔵されているブートローダー機能を利用して行われます。そのため、使用するためにはブートモードの設定(BOOT0ピンの制御)も必要になります。
具体的な回路や操作方法については、後述の「yumeno_robotおすすめ追加回路」で紹介します。
私は、開発時の利便性や冗長性を高めるために、このシリアル通信機能も基板に搭載しています。この回路を追加することで、書き込み用途だけでなく、Serial.printlnのようなデバッグ出力としても利用することができるため、開発効率の向上にもつながります。

シリアル書き込みに使用できるUARTピンはマイコンごとに決まっているため、データシートを確認して正しいピンに接続する必要があるので気を付けてください

STM32の最小構成回路

STM32F446REを使用する際の最小構成は、非常にシンプルです。(前述したように、書き込み回路であるST-LINKが外部に分かれていることも、その理由の一つです。)この点は、STM32を選択する大きなメリットの一つだと感じています。一般的に高性能なマイコンは周辺回路が複雑になりがちですが、STM32F446RE は必要最低限の構成でも十分に動作させることができます。

以下では、STM32F446REを動作させるために必要な最小構成回路について、順番に解説していきます。

①電源系回路

マイコンの動作電圧が3.3Vのため、安定した3.3V電源を供給し、データシートに従ってデカップリングコンデンサを配置するだけで完成です。(意外と違うコンデンサーつけて私は動きましたw)

ここで特に重要なのがVCAPピンです。STM32では内部で電圧を降圧してコアを動作させているため、その内部レギュレータを安定させるためにコンデンサが必要になるらしいです。
具体的には、
VCAP1 → 4.7µF
に以下のように接続するだけで完成です。

スクリーンショット 2026-04-02 142233.png

※注意※
STM32F446ReなどのLQFP64のマイコンを使う場合はVCAP2がないので上記のやり方で大丈夫ですが、LQFP100やLQFP144を使用する場合、VCAP2があるため、以下の図のように、
VCAP1 → 2.2µF
VCAP2 → 2.2µF
とつなげてください!!
スクリーンショット 2026-04-02 135706.png

②リセットボタン、BOOTスイッチ

STM32では、リセットボタンとBOOT切り替えスイッチを搭載しておくと、開発が非常にスムーズになります。スイッチにするかボタンにするかは人それぞれですが、私はBOOT0をスイッチリセットをボタンにする構成が使いやすいと感じました。

リセットボタン(NRST)
→ マイコンを再起動するためのボタン
→ 書き込み後に押すことでプログラムを再スタートできる

BOOTスイッチ(ブートモード切り替え
→ GND:通常のプログラム実行
→ 3.3V:ブートローダーモード(書き込みモード)

このボタンは基本的に書き込み時に使用します。操作方法がST-LinkとSerialで違うので、以下に示す「書き込み方法」を確認してください。

ST-LINKで書き込みする場合これらのスイッチを操作する必要がないのでST-LINKをメインで使用する場合、基板の端でなくてもOKです。ロボットの奥まった位置でも問題ないと感じています。ただし、トラブル時やUART書き込み時には必要になるため、省略はしないことをおすすめします。(先に言っておきました。)

③書き込み回路

必要最小限回路として、ST-Link書き込みを書きます。Serial書き込みについては以下の「yumeno-robotのおすすめ追加回路」に書きます。

ST-LINKを使用する場合、STM32 Nucleo-F446RE の上部(ST-LINK部)にある CN4コネクタ を使用します。CN4には、SWD(Serial Wire Debug)用の信号がまとめられており、上から順に以下のピンが並んでいます。このピンを以下の「CH4ピンの接続場所」に合わせてコネクターを接続すれば完成です。
IMG_8188.png

スクリーンショット 2026-04-02 164813.png

CH4ピンの役割

VDD_TARGET→ ターゲット(自作基板)の電圧をST-LINKに伝える(電圧レベル認識用)
SWCLK→ クロック信号(デバッグ通信のタイミング)
GND→ グラウンド(必須)SWDIO→ データ通信ライン
NRST→ リセット信号(任意だが接続推奨)
SWO→ デバッグ出力(基本は未使用でも大丈夫らしい)

CH4ピンの接続場所

SWCLK → PA14
SWDIO → PA13
NRST → NRSTピン
GND → GND
VDD_TARGET → 3.3V
(SWO → PB3 ※必要に応じて)

・VDD_TARGETピンはあくまでマイコンの電圧を測るためのピンであり、供給するピンじゃないので安心してね!!
・私は「SWO → PB3 」は使用していません。また、XHコネクターのメスについている金属部分をペンチで抜いてSTLinkに無理やりくっつけて使用しています。こうすることによって配線の向きを間違えることがないのでお勧めです!

yumeno-robotのおすすめ追加回路

①通電確認用LED

基板に電源が来ているかを確認するために、電源ライン(3.3V)にLEDを1つ接続しておくことをおすすめします。「そもそも電源来てないじゃん…」という問題が意外と多く、このLEDがあるだけでトラブルシュートの時間を大幅に短縮できます。

②動作確認用LED

マイコンが正しく動作しているかを確認するために、未使用のGPIOピンにLEDを接続しておくことをおすすめします。プログラムでON/OFFを繰り返すことで、書き込みが成功しているかマイコンが正常に動作しているかを簡単に確認することができます。特に、私のように手はんだで実装する場合は、接触不良や実装ミスの確認にも使えるため、非常に便利です。

③クロック系回路

STM32の特徴の一つとして、クロック周波数を柔軟に設定できる点が挙げられます。通常は内部クロック(内蔵RC発振器)でも動作しますが、より高精度な動作や安定した通信を行う場合には、外部クロックを使用します。外部クロックを使用する場合は、以下のような部品を追加します
・水晶振動子
・コンデンサ
これらを専用ピン(OSC_IN / OSC_OUT)に接続することで、外部クロックを利用することが可能になります。

私は現時点では内部クロックで運用していますが、今後の拡張性を考えて、回路とフットプリントは基板に実装しています。詳細な設定方法についてはデータシートやリファレンスマニュアルに記載されているため、必要に応じて確認してみてください。

スクリーンショット 2026-04-02 141919.png

④シリアル書き込み回路

シリアル(UART)書き込み用の回路は、基本的にはArduinoなどで使用されるシリアル通信回路と大きくは変わりません。

PCからシリアル変換器にD+、D-を接続し、シリアル変換器からマイコンにTX、RXに接続するだけです。私はCH340Eを使用しています。下に回路図があるので参考にしたい場合は是非どうぞ!!

AN2606の対応表を確認すると、STM32F446RE ではUART(USART)を用いた書き込みが可能であり、主にUSART1やUSART3などが利用できることが分かります。そのため、これらのUSARTに対応したピン(例:USART1のTX/RXピンなど)をUSB-シリアル変換ICに接続することで、シリアル書き込みを行うことができます。

この状態でシリアル通信を行うことで、プログラムの書き込みが可能になります。スクリーンショット 2026-04-02 172211.png
ただし、STM32の場合はArduinoとは異なり、内蔵ブートローダーを使用するため、先ほど設計した「リセットボタン」「BOOTスイッチ」の操作が必要になります。そのため、以下の「書き込み方法」確認して下さい。

書き込み方法

■ ST-LINKで書き込む場合

① BOOT0はGNDのままでOK
② ST-LINKを接続
③ 書き込み実行
④ 必要ならリセットボタンを押す

■ シリアル(UART)書き込みの場合

① BOOT0を3.3Vにする
② リセットボタンを押す(ブートモードで起動)
③ 書き込み実行(PC → UART)
④ 書き込み完了後、BOOT0をGNDに戻す
⑤ リセットボタンを押す(通常起動)

・ST-Linkを使用する場合、ボタンを操作しなくても書き込みができるため、ボタンやスイッチを常に触れる位置になくても大丈夫です。
・Serialを使用する場合、書き込みにボタンを操作するため常に触れる位置に配置する必要があります。
・私はどちらも搭載していますがメインはSTLinkなのでスイッチは基板の真ん中やロボットの奥に設置しています。

最後に

KICADで書くとこんな感じの回路ができると思います!
スクリーンショット 2026-04-02 163842.png

これで動かなかったらごめんなさい。間違っていたら優しくDMで教えていただけると嬉しいです!!
一応、私が作って思ったことやネットにはあまりかかれていなことなどをメインに書きました。
参考になればうれしいです!!「いいね」「フォロー」よろしくお願いします!!!!!

参考サイト

公式データシートhttps://www.st.com/resource/en/datasheet/stm32f446mc.pdf
公式データシートhttps://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf

NucleoのSTLink使用法https://zeptoelecdesign.com/stm32-nucleo-stlink/

21
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?