STM32マイコンの基板設計
入手性がよく高性能ということで、今まで使ったことのないSTM32マイコンにチャレンジしようとして、いろいろ苦戦しました。マイコンの基板設計は昔ルネサスエレクトロニクスのRX62Gマイコンで一度だけ設計したことがありましたが、知識不足の状態で設計したため、クロックが発振すらぜずに失敗に終わったため、難しそうな印象がついてました。
Nucleo等の簡単に開発を始められる評価基板から入ってもよかったのですが、今回はAmazonで購入したドローンキットに搭載するマイコンボードを求めていたので、ドローンに乗るように極小サイズのSTM32マイコンボードを制作することにしました。この記事では、自分がSTM32マイコンを用いてドローン用の制御基板を作るまでの過程を書いていこうと思います。これからSTM32マイコン基板を作ろうとしてる方の参考になれば幸いです。
STM32マイコンについて
正直ほとんどSTM32マイコンに関する知識がなかったので、基板設計をするにあたり何から手を付ければよいか、というか何をすればいいかすらよくわからず、とにかくSTM32マイコンについて調べてたところ、こちらの記事がとても参考になりました。STM32マイコンの開発全体の概要をつかめると思います。
自分がSTM32マイコンを選んだ理由としては
- 動作周波数が高く、強そう
自分が今まで使ってきたRenesasマイコンやMbed, Arduinoなどは高くても動作周波数100MHz以下だったので、動作周波数だけでスペックが決まるわけではないが、STM32マイコンには動作周波数の高いマイコンが多く、様々なドローン用フライトコントローラーに採用されているのもあり、ドローンの制御に十分なスペックがあるだろうと判断し、採用しました。
- チップが秋月で簡単に手に入る。
秋月でチップ単体で売っているのが個人的に評価が高いです。秋月で売ってるとなんか安心感ありますよね。
- 興味がある
純粋に使ったことないから興味がある、使ってみたい、学ロボとかでも使われてるっぽい。凄そう。
作成する基盤の仕様
ドーローンに搭載するので、小型にするため、なるべく実装するパーツが少なくなるように仕様を決めました。
- STM32マイコンはSTM32F405RGT6(秋月で売ってるやつ)
- 無線通信用としてXBee使う
- 姿勢推定用IMUはMPU9050
- 書き込みはUART
- プロペラブラシレスのESC制御PWM出力x4
- 拡張のためのI2CとUARTインターフェイス
回路設計
仕様を決めたはいいものの、STM32マイコン自体の使い方がよくわからなかったので、基板設計ではほとんどSTM32のデータシートとにらめっこする作業で、自分の知りたいことがデータシートのどこに載ってあるのかを見つけるのに苦労しました。
データシート等は公式サイトでダウンロードできます、(日本語)と表記があるものは日本語対応してます。
公式ドキュメント:https://www.stmcu.jp/design/
以降参考にした公式ドキュメントをAN****といった、公式ドキュメントの通し番号で表現します。STマイクロの公式サイトの検索欄より、通し番号で検索するとドキュメントのページが見つかると思います。ページの真ん中に最新の英語ドキュメントのダウンロードリングがありますが、日本語対応しているドキュメントは右下に日本語版のダウンロードリンクも貼ってあります。
ドキュメントの中でも特にこの資料は読んでおくべきだと思います。日本語で回路設計全体の知識が網羅されています。サンプル回路、PCB設計での推奨パターンまで乗ってる素晴らしい資料です。
ドキュメントAN4488:STM32F4xxxx マイクロコントローラ・ハードウェア開発の手引書
基板設計ツールはKiCADを使用しました。
回路を設計する前に
KiCADを使って、いきなりゴリゴリ設計を始めてもいいのですが、あらかじめSTM32CubeMXで、マイコンのどのピンに何の機能を使うかを定義して、回路設計を始めることがおすすめです。
STM32CubeMXとは下のようなソフトでSTM32マイコンの周辺機能をピンに割り当て、それに対応したコードを生成してくれるツールです。STM32CubeMXで使いたい周辺機能をあらかじめピン割り当てしておくことで、基板設計時にピンの配線ミスなどが減ると思います。
電源回路設計
マイコンの電源周辺回路は資料AN4488の「2 電源」にて説明されています、言われたとおりにコンデンサをつなぐだけです。また同じ資料の「8.3 電源デカップリング」にて、プリント基板での推奨設計パターンも説明してあるので参考程度に見ておきました。
今回設計する基板の電源は、LiPOバッテリーからESCに内蔵されたBECを通して約5Vに降圧されたものを基板へ供給するので、5Vからマイコンの動作電圧である3.3Vまで降圧させる必要があります。秋月で適当な3端子レギュレータを見つけて、データシート通りに降圧回路を設計しました。
リセット回路設計
リセット回路も資料AN4488 の「3 リセットおよび電源供給スーパバイザ」にて説明されています。資料の図の通りに設計しました。スイッチの端子が4つあるのはタクトスイッチを使用しているためです。
クロック回路設計
ここが割と苦戦しました。
「なんか水晶が発信するやつとコンデンサつけるんでしょ?」
程度の前提知識だったので、まずいろいろと疑問があって
といった疑問を順番に解決していきます。
まず参考にする資料はこれです。
AN2867:STM8AF/AL/S および STM32 マイクロコントローラ向け オシレータ設計ガイド
この資料には、クロック回路の原理、設計方法、PCBの推奨設計パターンからはんだ付けのノウハウまで、クロック回路の全般が網羅されています。とりあえずこの資料+ネットで調べて疑問を解決していきます。
- 水晶振動子とか水晶発振器とか聞くけどどっち使うの?
水晶振動子と水晶発振器の違いはこちらの記事を参考にさせていただきました。
簡単に説明すると水晶振動子は受動素子で水晶発振器は能動素子のようです。
なので、水晶振動子は水晶振動子のみでは発振できず、水晶振動子の外部に水晶振動子を駆動するためのシステムが別途必要です。この水晶振動子を駆動するためのシステムはSTM32マイコンに内蔵されていますので、マイコンと接続することで、水晶振動子は発振を行うことができます。
対して水晶発振器は電源を供給するとそれ単体でクロックを生成することができる素子です。
STM32マイコンでは、水晶振動子、水晶発振器どちらからでもクロック供給できるようです。(AN4488「6.1 HSE OSCクロック」より)
今回は、水晶振動子を用いることにしました。
水晶振動子を使用することにしましたが、実際に使用する水晶振動子の周波数や、型番はどうやって選んだらいいかわかりませんでした。
まず、周波数については、マイコンごとに対応している周波数の範囲がわからないと、大体何MHzの水晶振動子を選んでいいかわからないので、使用するマイコンが対応している周波数を調べました。対応する周波数は使用するマイコンのデータシートに書いてあり、STマイクロの公式サイトから使うマイコンのページに飛びデータシートを参照にしました。
今回使うSTM32F405RGT6の対応している周波数は4~26MHzでした。(データシートの1ページ目にかいてありました)
今回は速いほうが速く動くだろうという安直な理由で26MHzの水晶振動子を使うことにしました。
次に水晶振動子の型番ですがこれもAN2867の「5 STM32 マイクロコントローラの推奨発振子」に選定方法が記載されています(下図)(よく見るとそれぞれのマイコンに対応する周波数範囲も下の表に書かれてますね、あとで気づきました)。
ここに示されたメーカーの発振子なら大体適合するらしいですが、不安な場合、同資料AN2867の「4.2 STM32 適合クリスタルを選択する詳細なステップ」を参考に、慎重に水晶振動子を選定したほうがよさそうです。
今回はEPSONの水晶振動子FA-128を使うことにしました。
型番はFA-128 26.0000MF10Z-W5です。
とりあえずこれで使う水晶振動子は決まりました!
あとはこの水晶振動子をどうやってマイコンに接続するかですが、これは、資料AN2867の「3 ピアース・オシレータ設計」にて図示されていました。
図中のQが水晶振動子のようです。
自分が使う水晶振動子はデータシートを見てみると端子が4つあったのですが、そのうち2つが水晶振動子の両端で、残り2つは水晶振動子の表面シールドと直結してあり、GNDに接続しろとのことでした。
- コンデンサつけるのはいいけど容量どうやって計算すんの?
水晶振動子と一緒につけるコンデンサについてですが、接続方法は下図におけるCL1、CL2が付け足すコンデンサのようです。
図中のCsは浮遊容量で、実際にコンデンサは接続されていないが、ピンや基板配線の物理的構造によって生じる仮想のコンデンサで、基板の配線構造や、基板の材質などが影響してくるため、実際の値を求めるのは難しそうです。
CL1とCL2の値の求め方の詳細はAN2867「3.3 CL負荷容量」に詳しく解説されていますが、まとめると。
水晶振動子の負荷容量CLは水晶振動子のデータシートに記載されており、今回使用する水晶振動子の負荷容量は12pFのようでした。通販サイトで買う場合、商品の説明欄に水晶振動子の負荷容量が記載されてるとこもあるようです。
Csは計算が困難ですが、ネットで探したSTM32マイコンの回路の例では、大体どこも5pFくらいで見積もっているようでした。
CL1, CL2の計算は資料に計算例があるので、それを参考に計算しました。
CL1とCL2を同じ値として方程式を解けばいい感じですね。
今回はCL1=CL2=15pFとしました。
- たまにクロック回路に抵抗ついてる回路もあるけど、抵抗付けたほうがいいの?
水晶振動子の外付けの抵抗については、AN2867「3.5 励振レベル(DL)と外部抵抗(RExt)の計算」で詳しく説明されています。
すごく簡単にまとめると
- 水晶振動子には推奨される駆動電力DL[mW]がある。
- DLより大きい電力で水晶振動子を駆動させると、水晶振動子が破損したり、寿命が短くなる。
- なので外部抵抗RExt[Ω]を付けて水晶振動子を駆動させる電力を調整しよう。
- もともと水晶振動子の駆動電力がDLより小さいなら、外部抵抗はつけなくてもOK
- 水晶振動子で消費されてる電力は(水晶振動子の等価直列抵抗)×(水晶振動子に流れる電流の実効値)^2で求まる
とのこと。ようするに
(水晶振動子の等価直列抵抗)×(水晶振動子に流れる電流の実効値)^2 > DL
なら外部抵抗が必要なようです。
そしてこの水晶振動子に流れる電流は、実際に回路を組み、オシロスコープを用いて測定しろとのこと(「3.5.1 励振レベル(DL)の計算」を参照)
つまり、正確に外部抵抗RExtが必要か、不必要かを判断するには、実際に回路を組んで、振動子に流れる電流を測定する必要があるらしいです。
回路設計段階でこの実験は困難であること、ネットで探した様々なSTM32マイコンの回路図にほとんど外部抵抗を入れてるものがなかったことから、とりあえず外部抵抗はつけない方向で進めました。
ちなみに、今回使用した水晶振動子の推奨駆動電力DLはデータシートに表記されており、1~100μWの間で駆動することが推奨されてるようです。等価直列抵抗についても記載されていました。
以上のことを踏まえて最終的に設計したクロック回路がこちら
苦戦した割にかなりシンプルな構成ですね。
ブートモード切替回路設計
書き込みモードと実行モードを切り替えるための回路を設計します。
ここではUSARTで書き込みを行うと仮定してブートモード切替回路設計を行います。
スライドスイッチを用いて切り替えれるようにします。
参考資料がいくつかあり。
回路設計はAN4488「4.4 ブート・モード選択」を参考に、設計を行います。
公式ドキュメントRM0090という資料の「2.4 ブート設定」の方が自分の使うSTM32F405RGT6に対応した詳しい情報が載っていたのでそちらも参考にしました。
もっと詳しく、ブートローダーの仕様を知りたい場合は、AN2606も参考にするといいかもしれません。
これらの資料を読んだところ、どうやらBOOT0とBOOT1の2つのピンの状態でブートローダーの起動を選択できるようです。ブートローダーが起動してしまえば、書き込みツールを用いてUSARTでプログラムをマイコンに書き込めます。
簡単にまとめると
- マイコンのリセット後、システムクロックの4回目の立ち上がりタイミングでBOOT0, BOOT1が読まれる。
- BOOT0ピンが0ならBOOT1ピンの常態にかかわらず通常の実行モード
- ブートローダーを起動するにはBOOT0=1, BOOT1=0
- BOOT1ピンは他のGPIOピンと共有ピン、ブートモードの初期化後GPIOピンとして使えるようになる
BOOT1ピンは今回は常に0でいいので、BOOT1ピンと共有のGPIO機能を使わない場合は、常に抵抗を通してGND接続で良さそう。
設計した回路はこんな感じ。BOOT1ピンはPB2ピンと共有で、抵抗を通してGNDに接続してます。
書き込み回路設計
今回はUSARTで書き込みを行います。デバッガツールを使わずUSART書き込みを使う理由は、自分がPrintfデバッグ派だということと、RenesasマイコンなどでUSART書き込みに慣れているからです。秋月に売ってるUSBシリアル変換ケーブルで簡単に接続できてお手軽です。
RM0090の「2.4 ブート設定」にシリアル書き込みを行えるUSARTポートが示してあるので、そのピンをコネクタにつなぐだけで、書き込み回路はOKです。
周辺回路設計
マイコンの周辺回路は、STM32のドキュメントというより、使用する周辺機器のデータシートを参考に作っていく感じでした。
周辺回路設計に入ると、STM32CubeMXの恩恵を受けれると思います。STM32CubeMXでの定義通りに周辺回路を作っていきます。
周辺回路の例として、IMUはMPU9050を使用しました。回路設計は、MPU9050のデータシートに記載されている回路設計例を参考に設計しました。