⑦各設定の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);

マイコンはクロックから時間を測定しており、Timerはそのクロックを用いて何秒遅らせる(delay)かを操るものです。 そのため、Timerの初期化でclocksを引数で渡しています。

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、2l、22をpush-pullのoutputで設定しています。 今回は、信号機のように赤、オレンジ、緑を使いたいの変数にもred_ledorange_ledgreen_ledとして見やすくしました。

GPIOとは

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