#![no_std]
#![no_main]
use cortex_m_rt::entry;
use defmt_rtt as _;
use panic_halt as _;
use gd32e2_hal::gpio::{Pull, Speed};
use gd32e2_hal::pac;
use gd32e2_hal::prelude::*;
use gd32e2_hal::rcu::{ClockConfig, PllFreq, SysClk};
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut fmc = dp.fmc.constrain();
let config = ClockConfig::default().sysclk(SysClk::Pll(PllFreq::Mhz48));
let mut rcu = dp.rcu.constrain().freeze(&mut fmc, config);
let gpioa = dp.gpioa.split(&mut rcu);
let gpiob = dp.gpiob.split(&mut rcu);
let mut button = gpioa.pa0.into_input();
button.set_pull(Pull::Up);
let mut led = gpioa.pa1.into_push_pull_output();
led.set_speed(Speed::Mhz50);
let mut od = gpioa.pa4.into_open_drain_output();
od.set_high();
let _ain = gpioa.pa2.into_analog();
defmt::info!("GPIO test start");
for _ in 0..3 {
led.toggle();
let lit = led.is_set_high();
let pressed = button.is_low(); defmt::info!("led={} button_pressed={}", lit, pressed);
}
let mut chase = [
gpioa.pa5.into_push_pull_output().erase(),
gpioa.pa6.into_push_pull_output().erase(),
gpiob.pb0.into_push_pull_output().erase(),
];
for pin in &mut chase {
pin.set_low();
}
let mut led = led.lock();
let mut lit = 0;
loop {
led.toggle();
chase[lit].set_low();
lit = (lit + 1) % chase.len();
chase[lit].set_high();
let pin = &chase[lit];
defmt::info!(
"lit P{}{} driven={}",
pin.port(),
pin.number(),
pin.is_set_high()
);
for _ in 0..1_000_000 {
cortex_m::asm::nop();
}
}
}