#![no_std]
#![no_main]
use bsp::hal;
use cortex_m::asm;
use feather_m4 as bsp;
use panic_halt as _;
use hal::{
clock::GenericClockController,
pac::{CorePeripherals, Peripherals},
};
use hal::dmac::{DmaController, PriorityLevel, Transfer, TriggerAction, TriggerSource};
#[bsp::entry]
fn main() -> ! {
let mut peripherals = Peripherals::take().unwrap();
let core = CorePeripherals::take().unwrap();
let _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 _nvic = core.NVIC;
const LENGTH: usize = 50;
let buf_src: &'static mut [u8; LENGTH] =
cortex_m::singleton!(: [u8; LENGTH] = [0xff; LENGTH]).unwrap();
let buf_dest: &'static mut [u8; LENGTH] =
cortex_m::singleton!(: [u8; LENGTH] = [0x00; LENGTH]).unwrap();
let mut dmac = DmaController::init(dmac, &mut pm);
let mut channels = dmac.split();
let chan0 = channels.0.init(PriorityLevel::LVL0);
let xfer = Transfer::new_from_arrays(chan0, buf_src, buf_dest, false)
.begin(TriggerSource::DISABLE, TriggerAction::BLOCK);
let (chan0, buf_src, buf_dest) = xfer.wait();
let _a = buf_src[LENGTH - 1];
let _b = buf_dest[LENGTH - 1];
let const_16: &'static mut u16 = cortex_m::singleton!(: u16 = 0xADDE).unwrap();
let buf_16: &'static mut [u16; LENGTH] =
cortex_m::singleton!(:[u16; LENGTH] = [0x0000; LENGTH]).unwrap();
let xfer = Transfer::new(chan0, const_16, buf_16, false)
.unwrap()
.begin(TriggerSource::DISABLE, TriggerAction::BLOCK);
let (chan0, const_16, buf_16) = xfer.wait();
let _a = *const_16;
let _b = buf_16[LENGTH - 1];
for (i, item) in buf_16.iter_mut().enumerate() {
*item = i as u16;
}
let xfer = Transfer::new(chan0, buf_16, const_16, false)
.unwrap()
.begin(TriggerSource::DISABLE, TriggerAction::BLOCK);
let (chan0, buf_16, const_16) = xfer.wait();
let _a = *const_16; let _b = buf_16[LENGTH - 1];
channels.0 = chan0.into();
let _dmac = dmac.free(channels, &mut pm);
loop {
asm::nop();
}
}