#![no_std]
#![no_main]
use cortex_m::asm;
#[cfg(not(feature = "use_semihosting"))]
use panic_halt as _;
#[cfg(feature = "use_semihosting")]
use panic_semihosting as _;
use bsp::hal;
use bsp::pac;
use feather_m4 as bsp;
use bsp::{entry, periph_alias, pin_alias};
use hal::clock::GenericClockController;
use hal::dmac::{DmaController, PriorityLevel};
use hal::fugit::RateExtU32;
use pac::Peripherals;
#[entry]
fn main() -> ! {
let mut peripherals = Peripherals::take().unwrap();
let mut clocks = GenericClockController::with_external_32kosc(
peripherals.gclk,
&mut peripherals.mclk,
&mut peripherals.osc32kctrl,
&mut peripherals.oscctrl,
&mut peripherals.nvmctrl,
);
let mut pm = peripherals.pm;
let dmac = peripherals.dmac;
let pins = bsp::Pins::new(peripherals.port);
let mut dmac = DmaController::init(dmac, &mut pm);
let channels = dmac.split();
let chan0 = channels.0.init(PriorityLevel::Lvl0);
let chan1 = channels.1.init(PriorityLevel::Lvl0);
let uart_sercom = periph_alias!(peripherals.uart_sercom);
let uart_rx = pin_alias!(pins.uart_rx);
let uart_tx = pin_alias!(pins.uart_tx);
let uart = bsp::uart(
&mut clocks,
9600.Hz(),
uart_sercom,
&mut peripherals.mclk,
uart_rx,
uart_tx,
);
let (mut rx, tx) = uart.split();
const LENGTH: usize = 50;
let rx_buffer: &'static mut [u8; LENGTH] =
cortex_m::singleton!(: [u8; LENGTH] = [0x00; LENGTH]).unwrap();
let tx_buffer: &'static mut [u8; LENGTH] =
cortex_m::singleton!(: [u8; LENGTH] = [0x00; LENGTH]).unwrap();
for (i, c) in tx_buffer.iter_mut().enumerate() {
*c = i as u8;
}
rx.flush_rx_buffer();
let tx_dma = tx.send_with_dma(tx_buffer, chan0);
let rx_dma = rx.receive_with_dma(rx_buffer, chan1);
let (_chan0, _tx_buffer, _tx) = tx_dma.wait();
let (_chan1, _rx_buffer, _rx) = rx_dma.wait();
loop {
asm::wfi();
}
}