2020年4月16日木曜日

STM32 やってます nucleo F446RE

やっつけ組み込み仕事で、初めてつかうデバイスをSPIとかI2Cで使うときによくarduinoを使うことがあります。サンプルコードが付いてたりしますし。

だんだんマイコン側にいろいろやらせたくなり、さすがにarduino UNOでは速度的にきつくなってくると次に何に移行するかが問題です。石自体はarduino DUEが高性能だったんですが、ほぼディスコンだし意外と高いし、今後標準的に使っていくには不安。

他にメジャーどころではESP32が安くて速いですがクセがありすぎる… 優等生なところでは、Teensy3.2~3.6がとても高性能で、海外では流行っています。arduinoIDEに独自命令やらライブラリを追加しまくっているのでもはやarduinoではない気もしますが、実用的なライブラリが揃っていてとても使いやすい。

…が、我々ジャパニーズとしては、秋月でいつでも安く買えちゃうSTM32の、マイコン系では最高速のnucleoF446REが自由に使えるとより良いのです。


というわけでnucleoF446を何かというと使ってるのですが、開発環境が基本的にmbedのWEBコンパイラです。arduinoほどユーザーは多くないですがまあそれなりに普及していて、使い方も簡単で重宝しています。

唯一の問題は、STM32F4特有のIOを直に叩いて最高速を出したり、DMAであれやこれやしたときには、mbedを使ってる人の参考資料は劇レアで、たいていHALライブラリやcubeMXを使った環境なのです。

cubeMXは今では↓こんなIDEになっていて、巨大ですがこれをインストールしてあればコード生成だけじゃなくビルドもデバッグもできちゃいます。いいんです。いいんですが、こんな巨大なツールをどのマシンにでも入れてあるわけではないので、たいしたことないコードならmbedでちゃちゃっと済ませちゃいたいのです。

ふだんはmbedで楽をして、たまに難しいことをやるときだけcubeMXの自動生成コードをコピペしてきてうまうましたい…という虫のいいことが、基本的に可能です。というか、単にcubeMXで生成したプログラムのmain.cとmain.hをまるごと持ってきてmbed環境でビルドすればそのままビルド通ります。main以外のライブラリソースは持ってこなくてもmbedコンパイラ側にあります。(cubeMXはHALを呼びまくるコードを生成するので、それには当然対応したcpuのstm32f4xx_hal.hが必要ですが、それはmain.hの先頭で呼ばれているので問題ありません)


ただしビルドできるからと言ってそのまま動くとは限らないので、いくつか注意が必要です。えらいひとがこのような教えを書き残しているので従いましょう。確実にハマるのはcubeMXが生成したSystemClock_Config()です。クロック設定がよく見えないmbedレベルでどこからか呼ばれてしまっているので、わたくしはとりあえずcubeMXが吐いたSystemClock_Config()を使わないようにコメントアウトしました。

一応mbed側のソースをぐぐって確認したら、mbedは180Mhz、cubeMXは(USBホスト機能に配慮して)168Mhzで初期化されているみたいですが、それ以外には今のところ大きな違いは無かったです。ペリフェラルをどんどん使うようにしたらどこに初期化コードが書かれるのかまだわからないので、いずれは単にコメントアウトってわけにはいかなくなるのかも。

こんな具合でちまちまと使ってみて、F446REならではのことができたら書き残していきたいと思います。

0 件のコメント:

コメントを投稿