⑦各設定のinit

このコード部分の話

let mut pac = pac::Peripherals::take().unwrap();

let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);

let clocks = hal::clocks::init_clocks_and_plls(
    XTAL_FREQ_HZ,
    pac.XOSC,
    pac.CLOCKS,
    pac.PLL_SYS,
    pac.PLL_USB,
    &mut pac.RESETS,
    &mut watchdog,
)
.ok()
.unwrap();

let mut timer = rp2040_hal::Timer::new(pac.TIMER, &mut pac.RESETS, &clocks);

let sio = hal::Sio::new(pac.SIO);

let pins = hal::gpio::Pins::new(
    pac.IO_BANK0,
    pac.PADS_BANK0,
    sio.gpio_bank0,
    &mut pac.RESETS,
);

let mut green_led = pins.gpio22.into_push_pull_output();
let mut orange_led = pins.gpio21.into_push_pull_output();
let mut red_led = pins.gpio20.into_push_pull_output();

ペリフェラルオブジェクトの取得

let mut pac = pac::Peripherals::take().unwrap();

この宣言で、ペリフェラルへのアクセスを簡単にしてくれるペリフェラルオブジェクトを::takeメソッドで取得しています。

ペリフェラルとは

ペリフェラルとは、マイコンに内蔵された装置のことを指しています。 RP2040では、次のペリフェラルがあります。

  • GPIO:入出力
  • UART:シリアル通信
  • SPI:チップ間の通信
  • I2C:チップ間の通信
  • PWM:PWMの出力
  • USBコントローラー:USBの通信
  • PIO:プログラマブルな入出力

ウォッチドックオブジェクトのインスタンス

let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);

この宣言で、ウォッチドックへのアクセスを簡単にしてくれるウォッチドックオブジェクトを::newメソッドでインスタンスしています。 また::newメソッドの引数でpac.WATCHDOGを渡してます。 これは、ペリフェラルオブジェクトの一部であるWATCHODG利用してウォッチドックオブジェクトを生成していることを意味してます。

ウォッチドックとは

ウォッチドックとは、その装置が動作しているか定周期で確認してくれる機能のことです。 一定時間動作がなかった時には、再起動などをしてくれます。

クロックオブジェクトの初期化&取得

let clocks = hal::clocks::init_clocks_and_plls(
    XTAL_FREQ_HZ,
    pac.XOSC,
    pac.CLOCKS,
    pac.PLL_SYS,
    pac.PLL_USB,
    &mut pac.RESETS,
    &mut watchdog,
)
.ok()
.unwrap();

この宣言で、クロックオブジェクトの初期化(pllsも初期化)と取得を::init_clocks_and_pllsメソッドで行っっています。 `

timerの初期化

let mut timer = rp2040_hal::Timer::new(pac.TIMER, &mut pac.RESETS, &clocks);

マイコンは、CPUを動作させるクロックを用いて時間測定しており、1クロックでカウントアップする回路のカウント数×1クロックの時間(クロックサイクル時間)で計算しています。 Timerは、この時間に関係する処理を簡易化しており、Timerの初期化でclocksを引数で渡しています。 また何秒遅らせる(delay)かといった処理も、このTimerで行うことができます。

SIOの初期化

let sio = hal::Sio::new(pac.SIO);

専用のペリフェラルを利用しているため、pac.SIOを引数で渡して初期化しています。

SIOとは

SIO(Single-cycle I/O)は、CPUの1バス・サイクルでGPIO等にアクセス可能な高速なI/Oです。

GPIOの初期化

let pins = hal::gpio::Pins::new(
    pac.IO_BANK0,
    pac.PADS_BANK0,
    sio.gpio_bank0,
    &mut pac.RESETS,
);

GPIOの初期化をしています。この後のLEDへの出力設定をするには必要な設定になります。

GPIOの出力設定(LED)

let mut green_led = pins.gpio22.into_push_pull_output();
let mut orange_led = pins.gpio21.into_push_pull_output();
let mut red_led = pins.gpio20.into_push_pull_output();

GPIOの20、21、22をpush-pullのoutputで設定しています。 今回は、信号機のように赤、オレンジ、緑を光らせるため、変数名をred_ledorange_ledgreen_ledにして見やすくしました。

GPIOとは

GPIO(General Purpose Input/Output)は、汎用入出力ピンのことです。 これらのピンは、マイクロコントローラやシングルボードコンピュータなどで使用され、入力または出力として設定できます。