Hello World
これは、knurling app template の hello.rs の例を、単に hello world をログ出力するだけのものから、nrf52840-DK 上のオンボード LED を点滅させるものへ拡張するためのステップバイステップガイドです。
この実装例はこちらにあります: 1_hello_extended.rs。
プロジェクトのセットアップ
プロジェクト名を考え、私たちのガイドに従って app template を生成してください。TODO に適切な情報を入力するのを忘れないでください。
リソースへのアクセスを取得する
- 生成された app-template フォルダーで、
src/bin/hello.rsに移動します。 - 次のモジュールをスコープに取り込みます:
#![allow(unused)]
fn main() {
use nrf52840_hal::{
self as hal,
gpio::{p0::Parts as P0Parts, Level},
Timer,
};
}
nrf52840_hal クレートは Hardware Abstraction Layer (HAL) であり、GPIO ピンやタイマーなど、ボードのリソースにアクセスするのに役立ちます。
別のマイクロコントローラーを使用する場合は、TIMER ペリフェラル、オンボード LED 用のピン、およびピンの Level にアクセスできる必要があります。
fn main()に次の行を追加して、ボードのすべてのペリフェラルへのアクセスを取得します:
#![allow(unused)]
fn main() {
let board = hal::pac::Peripherals::take().unwrap();
}
別のボードを使用する場合は、すべてのペリフェラルにアクセスする方法について、そのクレートのドキュメントを確認してください。
- LED を点滅させるにはタイマーが必要です。これは、LED が一定時間オンおよびオフになるためです。タイマーペリフェラルにアクセスするには、次の行を追加します:
#![allow(unused)]
fn main() {
let mut timer = Timer::new(board.TIMER0);
}
- オンボード LED を使用したい場合は、それらにアクセスする方法を調べる必要があります。ボードのデータシートを確認して、どの GPIO ピンに接続されているかを調べてください。nrf52840-DK については、情報はこちらにあります。
オンボード LED は P0 ピンの一部です。LED1 は p0.13 です。このピンのグループへのアクセスを取得するには、次の行を追加します:
#![allow(unused)]
fn main() {
let pins = P0Parts::new(board.P0);
}
ライトをオンにする
- ピン p0.13 を Low Level のプッシュプル出力として設定します:
#![allow(unused)]
fn main() {
let mut led_1 = pins.p0_13.into_push_pull_output(Level::Low);
}
embedded-halクレートは、ボードのモデルに依存せずにボードのさまざまなリソースへアクセスするための汎用 API を提供します。これにより開発が容易になり、コードの移植性が高まります。これを使用してピンを high または low に設定したり、Timer の遅延を設定したりします。
これにアクセスするには、Cargo.toml に依存関係として追加します
# Cargo.toml
[dependencies]
cortex-m = "0.6.3"
cortex-m-rt = "0.6.12"
# TODO(4) ここに HAL を入力します
nrf52840-hal = "0.11.0"
+embedded-hal = "0.2.4"
[features]
そして、hello.rs で、その DelayMs と OutputPin トレイトをスコープに取り込み、使用できるようにします:
#![allow(unused)]
fn main() {
use embedded_hal::{
blocking::delay::DelayMs,
digital::v2::OutputPin,
};
}
main()関数に 1000 ミリ秒の遅延を追加します:
#![allow(unused)]
fn main() {
timer.delay_ms(1000u32);
}
- プログラムを実行してください!
マイクロコントローラー上の LED1 が 1 秒間点灯するはずです。その後、プログラムは終了します。
LED を点滅させる
- ループを開始します:
#![allow(unused)]
fn main() {
loop {
};
}
- ループ内に次の行を追加します:
#![allow(unused)]
fn main() {
led_1.set_high().unwrap();
timer.delay_ms(1000u32);
led_1.set_low().unwrap();
timer.delay_ms(1000u32);
}
- プログラムを実行します。
LED1 が継続的に点滅するはずです。