もやし日誌

日記のようなもの

SW4STM32でSTM32 Nucleo Board STM32F303K8を弄ってみる

f:id:kazuki09:20170918013833p:plain SW4STM32からSTM32F303K8向けにプログラムをビルドしてみた話。(ついでにAliexpressで買ったOLED液晶も試してみる)

STM32 Nucleo Board STM32F303K8

mbedライブラリが使えてそこそこ安く、結構高性能なMCUが載った評価ボード。
これ一台にプログラマー(プログラミングする人の方じゃないですよ)とデバッガーが搭載されている。
ちなみに秋月とかスイッチサイエンスで1600円ぐらいで買えるのでお手軽だ。(Arduino Unoみたいな使い方をするならSTM32L476RGT6の方がいいかも?)

SW4STM32(System Workbench for STM32)

eclipseプラグインとして動作するSTM32専用IDE。ちなみにKeil uVision5評価版と違いコンパイルするプログラムの容量に制限はなく、全機能を無償で使用できる。
ちなみにmbedと言えばLPC1768あたりが有名だと思うが、それならMCUXpresso IDE(LPCXpressoの後継)あたりのIDEを使うと良いと思う。(持ってないのでアレですがこれもSW4STM32みたいにeclipseベースのものです) CoIDEというのもあるらしいが、STM32F303K8に対応してないのか上手く動かなかったので試していない。

SW4STM32を使ってみる

公式HPに載っている通り、ARM用のGCCコンパイラeclipseを用意して、eclipseの方にSW4STM32のプラグインを入れてやることで使えるようになる。
今回はmbedのonline IDEは使わずにmbed CLIを使ってプロジェクトの作成から、SW4STM32用のプロジェクトの生成まで行う。

github.com

今回はWindows上にPython環境を構築するのが面倒だったので(2.x系列のものでしかmbed-cliは動かない上にメインではPython3を使っている為)、WSL上にpyenv環境を構築した。
(pyenvとWSLの導入方法については長くなるので書きません)

$ pyenv version
2.7.13 (set by /home/kazuki/.pyenv/version)
# python2.x系列が入ってることを確認して.....
$ pip install mbed-cli

これで使えるようになるはず。
適当なWindows上から参照できるディレクトリに移動して

$ mbed new hello_mbed --mbedlib
[mbed] Creating new program "hello_mbed" (git)
[mbed] Adding library "mbed" from "https://mbed.org/users/mbed_official/code/mbed/builds" at latest revision in the current branch
[mbed] Updating reference "mbed" -> "https://mbed.org/users/mbed_official/code/mbed/builds/tip"
[mbed] Couldn't find build tools in your program. Downloading the mbed 2.0 SDK tools...

これで最低限必要なライブラリ類が展開された状態になる。

※後々mbedのオンラインIDEからも使用したいなら--scm hgオプションを付けてgitではなくmercurialでソース管理をするプロジェクトを作成する必要がある。

生成されたディレクトリに移動してSW4STM32用のプロジェクトを生成すればあとはもうeclipseからインポートするだけで使えるようになるのでお手軽だ。 ちなみに生成は以下のコマンドから出来る。

$ mbed export -i sw4stm32 -m NUCLEO_F303K8

注: mbedディレクトリ内を見れば分かるが、どう考えても使わないtargetも一緒に展開されるので必要のないものは消したほうが良いかもしれない。(消すか除外しないとアホみたいにビルドに時間がかかる)

何故かSW4STM32向けにエクスポートしたプロジェクトがビルドできない

残念なことに、mbedのonline IDE・mbed cli共にSW4STM32向けのエクスポーターにバグを抱えてるので(もう直ってるかもしれませんが)、間違ったビルド設定を手動で直す必要がある。

github.com

Project Explorerからプロジェクトの右クリックからプロパティを選んで、プロジェクトの設定画面を出して不足しているヘッダーファイル(mbed_config.h)を追加する。

f:id:kazuki09:20170919222437p:plain

また、Floating point hardwareFloating point ABIの設定が間違っているとビルドが通ってもちゃんと動かないのでここも確認する。

f:id:kazuki09:20170919222705p:plain

適当にコードを書いて焼いてみる

今回はアイドルマスター ミリオンライブ!の一部キャラの絵をAliexpressで入手したOLED液晶に出力するプログラムを書いてみた。

Nucleo_F303K8_test - a mercurial repository | Mbed

使用した液晶はAliexpressでI2C OLEDとかで検索すると出てくるSSD1306搭載の液晶です。SSD1306搭載なら流用できるハズ…
ちなみに、mbed用のライブラリはリセットピンが実装されていることを前提に作られていたのでリセットピンが無いものでも使えるように一部改造を施してある。
(リセットピンがないので、時々プログラムが上手く動かないことがある。一回電源を落としてやると直ることもあったりするので、初期化時に液晶の電源を落としてリセットをかける回路を組む必要があるかも….?)
※プログラムの実行(STM32への転送)とデバッグは普通にJavaのプログラムを実行する時と同じくRunボタンとDebugボタンから出来る。

あとがき(おまけ)

よくあるmbed用のI2Cアドレス検索プログラムが上手く動いてくれなかったので、STM32でもちゃんと動く(はず)プログラムを書いてみました。

I2C i2c(I2C_SDA, I2C_SCL);
Serial pc(USBTX, USBRX);
for (int address = 1; address < 127; address++) {
    int error = i2c.write(address << 1, { }, 0, false); //1bit左シフトする
    if (error == 0) pc.printf("I2C device found at address 0x%X\r\n", address); //7bitでアドレスを出力
}

I2C on Nucleo boards is not working correctly.... - Question | Mbed

何故かはよく分からないがstart()してwrite(アドレス)してclose()するプログラムはSTM32では上手く動いてくれないらしい…. なんなん….(白石紬)