#![no_main]
#![no_std]
use core::cell::{Cell, RefCell};
use cortex_m::{
interrupt::{free, Mutex},
peripheral::NVIC,
};
use cortex_m_rt::entry;
use stm32_hal2::{
clocks::Clocks,
dma::{self, Dma, DmaChannel, DmaInterrupt, DmaWriteBuf},
gpio::{Pin, PinMode, Port},
i2c::{I2c, I2cDevice},
low_power, pac,
};
#[entry]
fn main() -> ! {
let mut cp = cortex_m::Peripherals::take().unwrap();
let mut dp = pac::Peripherals::take().unwrap();
let clock_cfg = Clocks::default();
clock_cfg.setup(&mut dp.RCC, &mut dp.FLASH).unwrap();
let mut scl = Pin::new(Port::B, 6, PinMode::Alt(4));
scl.output_type(OutputType::OpenDrain);
let mut sda = Pin::new(Port::B, 7, PinMode::Alt(4));
sda.output_type(OutputType::OpenDrain);
let i2c = I2c::new(dp.I2C1, I2cDevice::One, 100_000, &clock_cfg, &mut dp.RCC);
let addr: u8 = 0x48;
let cfg = [0b1000_0101, 0b1000_0000];
let cfg_reg = 0x1;
let conversion_reg = 0x0;
let mut dma = Dma::new(&mut dp.DMA1, &dp.RCC);
let mut read_buf = [0, 0];
i2c.write(addr, &[cfg_reg, cfg[0], cfg[1]]).ok();
i2c.write_read(addr, &[conversion_reg], &mut read_buf).ok();
let reading = i16::from_be_bytes([read_buf[0], read_buf[1]]);
unsafe {
NVIC::unmask(pac::Interrupt::DMA1_CH6);
NVIC::unmask(pac::Interrupt::DMA1_CH7);
}
loop {
low_power::sleep_now(&mut SCB);
}
}
#[interrupt]
fn DMA1_CH6() {
free(|cs| {
unsafe { (*pac::DMA1::ptr()).ifcr.write(|w| w.tcif6().set_bit()) }
});
}
#[interrupt]
fn DMA1_CH7() {
free(|cs| unsafe { (*pac::DMA1::ptr()).ifcr.write(|w| w.tcif7().set_bit()) });
}