安全性、速度、並行性にフォーカスしたシステムプログラミング言語としてRustが昨今、話題です。今回は手持ちのSTM32F042のNucleoボードを用いて、Windows環境でRust組み込みプログラミングをしてみました。Rust+STM32組み込み系の場合、MacやUbuntuを使った例が多いですが、今回はWindows環境でopenocdを使用せずに行いました。Rust版STM32HALライブラリを使用してLチカをやってみました。
@Rust環境構築
Rust公式サイトからインストーラーをダウンロードしてインストールします。CLIベースなので最初は戸惑うかもしれませんが、コマンドラインに従ってインストールを行います。インストール後、コマンドラインからcargoと打って下記の様なメッセージが出ればインストール成功です。
Aクロスコンパイル環境構築
Windows環境でArmバイナリを生成するためのクロスコンパイル環境のパッケージをインストールします。使用するマイコンによって選択する必要があります。今回はSTM32F042でM0系なので、thumbv6m-none-eabiを使用しました。下記のコマンドを打ってパッケージをインストールします。
rustup target add thumbv6m-none-eabi
なお、環境によって選択するパッケージは下記の通りです。
ARM Cortex-M0 and Cortex-M0+ | thumbv6m-none-eabi |
ARM Cortex-M3 | thumbv7m-none-eabi |
ARM Cortex-M4 and Cortex-M7 (FPUなし) | thumbv7em-none-eabi |
ARM Cortex-M4F and Cortex-M7F(FPUあり) | thumbv7em-none-eabihf |
BArm Embedded Toolchainインストール
Rustで生成されるバイナリをbinファイルに変換したり、バイナリデータを確認する際に使用します。Armサイトからインストーラーをダウンロードしてインストールします。インストール設定のpath追加にチェックを入れてコマンドラインからアクセスできるようにします。
gcc-arm-none-eabi-*-20**-q*-major-win32.exe
CRust版HALライブラリ
Rust版HALライブラリをgithubサイトからダウンロードします。Zipファイルなので解凍します。
Dライブラリ書き換え
今回はLチカを行うため、stm32f0xx-hal-master\examples内のblinky.rsを使用します。デフォルトはPA1を点滅させるコードとなっているため、NucleoF042に搭載されているLED、LD3のポートPB3に書き換えます。blinky.rsをテキストエディタで開いて、17行目付近を下記のように書き換えます。
let gpiob = p.GPIOB.split(&mut rcc);
// (Re-)configure PB3 as output
let mut led = cortex_m::interrupt::free(|cs| gpiob.pb3.into_push_pull_output(cs));
let mut led = cortex_m::interrupt::free(|cs| gpiob.pb3.into_push_pull_output(cs));
Eコードコンパイル
初回は関連パッケージのダウロードとビルドが行われるため、時間が多少多くかかります。下記のコマンドでblinkyサンプルコードをコンパイルします。
cargo build --example blinky --release --features=stm32f042
Fバイナリデータ変換
コンパイルされたバイナリデータは下記のフォルダに生成されます。フォルダ内の拡張子がないblinkyというファイルがRustバイナリデータです。
\stm32f0xx-hal-master\target\thumbv6m-none-eabi\release\examples
下記のコマンドを打って、Rustバイナリデータをbinファイルに変換します。
arm-none-eabi-objcopy -O binary blinky blinky.bin
Gbinファイル書き込み
ST-LINK UtilityやCubeProgrammer等でbinファイルを書き込みます。LD3が点滅すれば成功です。for文の回数等を変更して点滅周期が変えたりしてみてください。
今回はWindows環境でRust版STM32HALライブラリを使用してサンプルコードのLチカを行いました。Rustは安全性、速度、並行性に優れているということはよく言われますが、それ以外にメリットとして、組み込み系にもパッケージ管理が使えるようになったことです。パッケージ管理はLinuxやnodejs等では当たり前ですが、組み込み系では足りないファイルを追加したり、手動で管理する必要がありました。Rustの場合はパッケージ管理がデフォルトで有効になっているため、必要な記述を事前にしておけば、ビルド時に足りないファイルが自動的に取得されます。組み込み系で頻繁にパッケージのバージョンが変わるor変えることはあまりないかもしれませんが、足りないファイルが自動的に取得できるのはパッケージ管理の大きなメリットだと思いました。Rust版STM32HALライブラリは完成度も高いので、今後、ST公式でもサポートされればさらに面白くなると思いました。