#![no_main]
#![no_std]
use core::cell::RefCell;
use cortex_m::asm;
use cortex_m::interrupt::Mutex;
use cortex_m_rt::entry;
#[cfg(not(feature = "defmt"))]
use panic_halt as _;
#[cfg(feature = "defmt")]
use {defmt_rtt as _, panic_probe as _};
use hal::pac::{self, interrupt};
use stm32h7xx_hal as hal;
use daisy::audio;
static AUDIO_INTERFACE: Mutex<RefCell<Option<audio::Interface>>> = Mutex::new(RefCell::new(None));
#[entry]
fn main() -> ! {
let mut cp = cortex_m::Peripherals::take().unwrap();
let dp = pac::Peripherals::take().unwrap();
cp.SCB.enable_icache();
cp.SCB.enable_dcache(&mut cp.CPUID);
let board = daisy::Board::take().unwrap();
let ccdr = daisy::board_freeze_clocks!(board, dp);
let pins = daisy::board_split_gpios!(board, ccdr, dp);
let mut led_user = daisy::board_split_leds!(pins).USER;
let audio_interface = daisy::board_split_audio!(ccdr, pins);
let audio_interface = audio_interface.spawn().unwrap();
cortex_m::interrupt::free(|cs| {
AUDIO_INTERFACE.borrow(cs).replace(Some(audio_interface));
});
let one_second = ccdr.clocks.sys_ck().to_Hz();
loop {
led_user.toggle();
asm::delay(one_second);
led_user.toggle();
asm::delay(one_second);
}
}
#[interrupt]
fn DMA1_STR1() {
cortex_m::interrupt::free(|cs| {
if let Some(audio_interface) = AUDIO_INTERFACE.borrow(cs).borrow_mut().as_mut() {
audio_interface
.handle_interrupt_dma1_str1(|audio_buffer| {
for frame in audio_buffer {
let (left, right) = *frame;
*frame = (right * 0.8, left * 0.8);
}
})
.unwrap();
}
});
}