⑦各設定のinit
このコード部分の話
#![allow(unused)] fn main() { 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(); }
ペリフェラルオブジェクトの取得
#![allow(unused)] fn main() { let mut pac = pac::Peripherals::take().unwrap(); }
この宣言で、ペリフェラルへのアクセスを簡単にしてくれるペリフェラルオブジェクトを::take
メソッドで取得しています。
ペリフェラルとは、マイコンに内蔵された装置のことを指しています。 RP2040では、次のペリフェラルがあります。
- GPIO:入出力
- UART:シリアル通信
- SPI:チップ間の通信
- I2C:チップ間の通信
- PWM:PWMの出力
- USBコントローラー:USBの通信
- PIO:プログラマブルな入出力
ウォッチドックオブジェクトのインスタンス
#![allow(unused)] fn main() { let mut watchdog = hal::Watchdog::new(pac.WATCHDOG); }
この宣言で、ウォッチドックへのアクセスを簡単にしてくれるウォッチドックオブジェクトを::new
メソッドでインスタンスしています。
また::new
メソッドの引数でpac.WATCHDOG
を渡してます。
これは、ペリフェラルオブジェクトの一部であるWATCHODG
利用してウォッチドックオブジェクトを生成していることを意味してます。
クロックオブジェクトの初期化&取得
#![allow(unused)] fn main() { 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の初期化
#![allow(unused)] fn main() { let mut timer = rp2040_hal::Timer::new(pac.TIMER, &mut pac.RESETS, &clocks); }
マイコンは、CPUを動作させるクロックを用いて時間測定しており、1クロックでカウントアップする回路のカウント数×1クロックの時間(クロックサイクル時間)で計算しています。
Timer
は、この時間に関係する処理を簡易化しており、Timer
の初期化でclocks
を引数で渡しています。
また何秒遅らせる(delay)かといった処理も、このTimer
で行うことができます。
SIOの初期化
#![allow(unused)] fn main() { let sio = hal::Sio::new(pac.SIO); }
専用のペリフェラルを利用しているため、pac.SIO
を引数で渡して初期化しています。
GPIOの初期化
#![allow(unused)] fn main() { let pins = hal::gpio::Pins::new( pac.IO_BANK0, pac.PADS_BANK0, sio.gpio_bank0, &mut pac.RESETS, ); }
GPIOの初期化をしています。この後のLEDへの出力設定をするには必要な設定になります。
GPIOの出力設定(LED)
#![allow(unused)] fn main() { 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_led
、orange_led
、green_led
にして見やすくしました。