久々にマイコンいじりました。STMマイコンです。
STM32Cubeも数年ぶりだと思います。
そのSTM32マイコンを使った基板上でSTMマイコンを動かすための手順を忘備録として記録しておきます。
必要なもの
開発ツール:STM32CubeIDE
以下のURLからダウンロードしてインストールします。無償です。
また、書き込みツールとしては、ST-Link/V2を使いました。
これはAmazonにて購入。
安いので正規品のようで正規品でないのかわかりませんがちゃんと使えてます。
最初はうまく認識しないことが多く、ちゃんと認識するまで何度もUSBを抜き挿ししてましたが、基板の電源を入れた状態でUSBの抜き差しするようにしてからは一発で認識するようになってます。そういうものなんでしょうか?
あと、マイコンが載っているボードですね。
私のはとある所から依頼されたものなので画像は出せませんが、市販品でない自社開発品のようです。
STM32F103C8T6が載っていてSPIでLCDを制御。電源と通信を兼ねるUSBとSWD I/Fの端子がついてました。そのLCDをUSB(UART)からのコマンドで色々と制御(評価)するってのが依頼された内容です。
STM32CubeIDEのインストールは割愛します。
普通にインストールするだけかと思います。
私の入手したバージョンは 1.11.2でした。
STM32CubeIDE
初期設定
まずSTM32CubeIDEを立ち上げてプロジェクトの初期設定をしていきます。
File→New→STM32 Project でプロジェクトを作成します。
ボードが載っていればBoardSelectorでいいんでしょうが、私のは載ってないものなのでCPUを選択していきます。
MCU/MPU Selectorを選択
CPUリストが出ているんでそこから選びます。
左のプルダウンメニュー使って絞っていくと楽かな。
ちなみにSTM32F103C8T6にはSTM32F103C8T6とSTM32F103C8T6TRと2種類あります。
TRってのはTape&Reelっていう梱包形態の指定なので開発には関係無いかと思います。なんでリストに出てくるんだろう?
選んだらNext。
プロジェクト名を入れてオプションはC++で書きたいのならC++を選択。
後はとりあえずデフォルトのままでいいかな。
で、NEXT>
ここは、基本はデフォルトのままでいいのかな。
最後のCode Generator Optionsは必要なライブラリをリンクにするかコピーするかってことかと思います。
コピーのほうがトラブルが少ないかなぁ。
でFinish
次はピン設定です。
こんな画面でパッケージの画像が出ているかと思います。
各ピンをクリックして用途を設定していきます。これほんと楽ですね。
回路図を見ながらどういうピンか見ながら入れていきます。
回路が間違っていれば論外ですが、回路が正しければピンごとに設定できる機能は限られているのでそんなに難しくはないです。
例えば、これはOSCの設定。
5、6ピンにOSCI/OSCOとして8Mの水晶発振器が接続されているので設定をしている時の画です。
間違えた時はReset_Stateって選べば設定した内容がクリアされます。
USBの様な差動信号は片方を設定したらもう一方も設定されるようです。便利ー
こんな感じでできました
書き込みのためのSWDI/Fもちゃんと設定してます。
プッシュスイッチが一つついていてPB13に接続されていたんですが、それはGPIO_InputかEXTIかつまり汎用入力か割り込み入力かで悩みましたが、とりあえずEXTIに設定。
これは各々の用途で決めればよいのかと思います。
あと、SPIのCSはSPI1_NSSを選択せずにGPIO_Outputにしてます。
これは先日のブログで書きましたが、SSピンがアクセスごとにH→L→Hと制御されずにずっとLに落ちっぱなしになってるからで、それだと私の使う基板の場合都合が悪いのでGPIOピンにて制御とした次第。
ピンを右クリックして出てくるEnterUserLabelで名前もつけてたりします。これはご自由に。
また、私の場合SPIは2系統必要ですが、SPI2は接続されていないので、SPI1のSCK/MOSI/MISOを共用してSSのみで切り替えや同時書き込みを行うことにしました。
さて、ピンの設定が終わりましたので、次は機能の設定を行っていきます。
左のプルダウンメニューを使います。
上から行きましょう。まずはSystemCore
設定したピン(機能?)が緑になってますね。
GPIOをクリックしてみましょう。詳細が出てきます。
PA3とPA4にModifiedがついているのは名前つけたからかな?
Signal on Pinってなんだろう?よくわかりません。
GPIO output levelは初期状態ですかね。
PA3/PA4はSPIのCSでLowActiveなのでHighにしておきます。
PA3の行をクリックしたら下に項目が出てくるので、そこでHighを選べは設定変更できます。
GPIOmodeはPushPullになってましたのでそのまま。
ワイヤードオアとかであればOpenDrainに変更する必要があります。
次はPullUp/PullDown設定。今回は不要。
Maximum output speedは文字のまま最高速度の設定ですが、
Low/Medium/Highって言われてもどの速度がどれなのかわかりませんよね。
データシート見たらそれらしい記載がありました。
これはMPUごとに違うかと思いますので、私の使っているSTM32F103C8の例ですが、IOポートのACタイミング部にこのような記載があります。
このMODEx[1:0]の設定がHigh/Medium/Lowのようです。
これによると、Lowで2MHz、Mediumで10MHz、Highは負荷にもよりますが、最高50MHzのようですね。
今回は最大12MHzで動かすSPIのSSですから速度は激遅です。Lowでいいでしょうかね。Tr/Tfが遅いのが気になりますが、命令的にSSをGPIO制御で落としてからSPI送信としてもかなり間が開くと思うのでまぁ問題ないかと思います。波形見てダメなら設定変えればいいだけ。
他のピンで、
PB12はSPIデバイスのスリープ制御なのでこれも遅くて良くてデフォルトは動作時のHigh。
PB13はキー入力で割り込みにしたので、割り込みのモード・極性とPullUp/Down設定のみ。こちらもUserLabelつけておこう。
モードはイベントモードと割り込みモードってのがあるらしく、イベントモードってのは割り込みが入ったら回路を起動させる用途みたい。
今回は単なるキー入力なので割り込みモードにして、押すと反応させるべくFallingEdgeに
これでGPIOの設定は完了。
そのままSPIのタブを見てみます。
SCKとMOSIが速度Highになってますね。12MHzなのでSCLKはHigh、MOSIはMediumでいいでしょう。
MISOは特にPullUp/Downは不要と設定。
あとは、NVICでinperruptsをEnabledにしておきますか。
次にRCC
Reset and Clock Controlだそうです。
外に8MHzの水晶発振器が接続されているのでそれを活かすためにHighSpeedClock(HSE)に設定
なんで?High?Lowとの境は?って疑問もありましたが、接続するピンで決まるようです。
私の使う基板はOSC_IN/OUTに接続されていたのでHighの方でしたってことです。
次はConnectivityのSPI1です。
SPI1を選択するとDisableになってました。
ここを変更します。
今回のSPIは4線用いて読み書きをMasterとして行うのでFull-Duplext Masterと設定
Hardware NSS Signalは赤くなっていてDisableから変更できないのは信号として設定してないからでしょうね。
その下のConfigurationのParameterSettingsにてSPIのフォーマット設定を行いますが、
Motorola/8bit/MSB Firstはデフォルトのまま
BaudRateですが、私の使うデバイスは12MHzMaxなのでPrescalerを4にしたらちょうどよかったです。
CPOL/CPHAの設定はMPUのデータシートのSPI timing diagramにありますので、接続先デバイスによって決めてください。
一般的にLow/1Edgeでいいのかとは思ってます。
これでSPIは設定完了 △がついているのが気になりますが。
USBは特に何もせず
ModdlewareでUSB_DEVICEもDisableになっていたので、通信用として使うべくVitrualPortComに設定しておきます。
さて、一通り設定が終わったので次はクロックです。
隣のClock Configuretionタブを選択します。
切り替えると、エラーを自動で修正してやろか?って聞かれるのでおまかせしちゃいましょう。
オプションはご自由に。
するとまだ赤いままで修正できなかったようです。
今度はResolve Clock Issuesをクリックしたら問題なく修正できました。
なんだったんだろうか?
これで基本的な設定は終わりです。
File→Saveします
すると画面が変わってソースコードが現れてようやく開発が開始できるようになりました。
ソースコード記述
簡単なプログラムであれば立ち上がって開かれているmain.cに記載していくだけで良いかと思います。
コードを書く時は場所に注意してください。
USER CODE BEGINとENDって書いてるコメントの間に書いてください。
コメントは消したらおそらくだめでしょう。
この場所以外に書いちゃうと、再度設定を変更して再生成させたら消えてしまいます。
ちゃんとここね!ってところに書いておくと再生成しても残ってくれます。
これでとりあえずUART通信、SPI通信、キー入力割り込み、タイマー割り込みは一通りできましたので、余力があれば記事に書いていこうと思います。
基本的にはソースコード記載して、ビルドしてRUNすればST-Linkから書き込まれて動作するって感じですかね。
いやぁベースができれば簡単にできますね。
とは言っても、UARTはどうするの?割り込みはどうするの?とか細かい部分はググりながらやりましたけどね。
これもじきにAIさんが書いてくれるようになるのかなぁ。
コメント