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 におきましたので、よろしければ参考になさってください。
お疲れさまでした。