STM32 Rustの環境を構築する 後編

STM32 Rustの環境を構築する 後編

Rust環境構築の後編です。(前編は こちら からどうぞ)

こちらで扱う PC環境, ボード(マイコン) は以下の通りです。

PC:Windows10 OS
Board: STM32Nucleo-F401RE
マイコン:STM32F401RE

プロジェクトをつくる

cargo generate と git を使ってSTM32F401用のプロジェクトを作成します。

cargo generate –git https://github.com/rust-embedded/cortex-m-quickstart.git と入力しプロジェクト名を聞いてくるので stm32f401a と入力します。

cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart.git
 Unable to load config file: C:\Users\xxxxx\.cargo\cargo-general.toml
 Project Name : stm32f401a

C:\Users\xxxxx\stm32f401a というフォルダができていることを確認します。

VSCodeを起動する

以下のようにコマンドを入力することで、stm32f401aをカレントディレクトリとして VSCode が起動します。

cd stm32f401a
code .

C:\Users\xxxxx>cd stm32f401a
C:\Users\xxxxx\stm32f401a>code .

config.tomlの編集

gdbの指定と Cortex-M4F をターゲットに指定します。

ツリーの >.cargo の >部分をクリックすると V .cargo となり、そのツリー下に config.toml というファイルが見えるのでこれをクリックして開きます。

(1)こちらの環境では 8行目に # runner = “arm-none-eabi-gdb -q -x openocd.gdb” があるので、先頭の # をはずして有効にします。
(2)こちらの環境では35行目に target = “thumbv7m-none-eabi” # Cortex-M3 があるので、先頭に # をつけて無効にします。
前後の行に合わせて # target = … のように記述しておきます。
(3)こちらの環境では37行目に # target = “thumbv7me-none-eabihf” # Cortex-M4F and Cortex-M7F (with FPU) があるので、先頭の # をはずしてい無効にします。

# のある行はコメント(無効)になります。

編集したら Ctrl + s で保存しておきます。

launch.jsonの編集

デバイスに関する部分の指定を行います。
ツリーの >.vscode の >部分をクリックすると V .vscode となり、そのツリー下に launch.json というファイルが見えるのでこれをクリックして開きます。

“configurations”: の中に { … },{ … } で2つの項目が区切られています。
上の方は “name” が “Debug (QEMU)” となっていて、下の “name” が “Debug (OpenOCD)” です。
QEMUはエミュレーターなので使用しません。
OpenOCD による Debug を行いますので、下側の { … } 内だけを編集すれば良いことになります。

(1)こちらの環境では35行目に #device”: “STM32F303VCT6” とあるので “STM32F401RET6” に変更します。
(2)こちらの環境では38行目に “target/stm32f3x.cfg” とあるので “target/stm32f4x.cfg” に変更します。
(3)こちらの環境では40行目に “svdFile”: “${workspaceRoot}/.vscode/STM32F303.svd” とあるので 303 の部分を 401 に変更します。

編集したら Ctrl + s で保存しておきます。

Cargo.tomlの編集

ツリーの下の方に Cargo.toml があります。

stm32f4xx-halというクレートを使いますので、それを指定しておきます。
クレートとはライブラリのようなものです。

23~25行を以下のように編集します。
dependencies は依存関係の意味で「このクレートの、このバージョンのものを使いますよ」とRustに教えてあげます。

[dependencies.stm32f4xx-hal]
features = ["stm32f401", "rt"]
version = "0.8"

version = “m.n.o” の .o はマイナーバージョンで省略可能なようです。

編集したら Ctrl + s で保存しておきます。

クレートは crates.io から検索することができます。

検索枠内に stm32f4xx-hal と入力して検索すると見つけることができます。

また、クレートは cargo add コマンドで追加することもできます。

追加されたクレートは[dependencies]下に追加されます。追加したいクレートが出てきた時に試してみてください。

memory.xの編集

ツリーの下の方に memory.x があります。
デバイスによってFlashメモリーと RAM の容量が異なるので、ここで指定します。

6, 7行目を以下のように編集します。

  FLASH : ORIGIN = 0x08000000, LENGTH = 512K
  RAM : ORIGIN = 0x20000000, LENGTH = 96K

編集したら Ctrl + s で保存しておきます。

メモリーのサイズ等はデバイスによって異なりますのでデータシートで確認する必要があります。
STM32F401REのメモリーマップの一部は以下の通りです。

svdファイル

svdファイルはデバッグに必要なファイルです。
svdファイルは こちら からダウンロードできます。

解凍して、data\STMicroの中にある STM32F401.svd を C:\Users\xxxxx\stm32f401a\.vscode に保存します。

openocd.cfgの編集

5行目の stm32f3x.cfg を stm32f4x.cfg に変更します。
編集したら Ctrl + s で保存しておきます。

ソースコード

Rustのソースコードは拡張子が rs になります。
src下の main.rs を以下のように編集し保存します。

#![no_std]
#![no_main]

extern crate panic_halt;
use cortex_m_rt::entry;
use stm32f4xx_hal::{delay::Delay, prelude::*, stm32};

#[entry]
fn main() -> ! {
    if let (Some(dp), Some(cp)) = (stm32::Peripherals::take(), stm32::CorePeripherals::take()) {

        let rcc = dp.RCC.constrain();
        let clocks = rcc.cfgr.sysclk(48.mhz()).freeze();
        let gpioa = dp.GPIOA.split();
        let mut led = gpioa.pa5.into_push_pull_output();
        let mut delay = Delay::new(cp.SYST, clocks);

        loop {
            led.set_high().unwrap();
            delay.delay_ms(100_u32);
            led.set_low().unwrap();
            delay.delay_ms(100_u32);
        }
    }
    loop {}
}

プログラムを実行する

PCとボードをUSBケーブルでつなぎます。
VSCodeで Run – Start Debugging (F5) を選択して起動します。

添付画像の通り、Debugのメニューから Debug(OpenOCD) を選択します。

E[entry] の部分で停止しているので、 F5キーを押してプログラムを実行します。

緑色のLEDが点滅すれば “Lチカ” 成功です。

皆さまの環境では、うまく動きましたか?

今回のプロジェクトを GitHub の stm32f401a におきましたので、よろしければ参考になさってください。

お疲れさまでした。

Rustカテゴリの最新記事