#![no_main]
#![no_std]
use core::cell::{Cell, RefCell};
use cortex_m::{
interrupt::{self, free, Mutex},
peripheral::NVIC,
};
use cortex_m_rt::entry;
use stm32_hal2::{
clocks::Clocks,
gpio::{AltFn, Edge, GpioA, PinMode},
low_power, pac,
usart::{Usart, UsartConfig, UsartDevice, UsartInterrupt},
};
const BUF_SIZE: usize = 10;
static UART: Mutex<RefCell<Option<Usart<pac::USART1>>>> = Mutex::new(RefCell::new(None));
static READ_BUF: Mutex<RefCell<[u8; BUF_SIZE]>> = Mutex::new(RefCell::new([0; BUF_SIZE]));
static READ_I: Mutex<Cell<usize>> = Mutex::new(Cell::new(0));
#[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 gpioa = GpioA::new(dp.GPIOA);
let _uart_tx = gpioa.new_pin(9, PinMode::Alt(7));
let _uart_rx = gpioa.new_pin(10, PinMode::Alt(7));
let uart = Usart::new(
dp.USART1,
UsartDevice::One,
9_600,
UsartConfig::default(),
&clock_cfg,
);
unsafe {
NVIC::unmask(interrupt::USART1);
}
free(|cs| {
UART.borrow(cs).replace(Some(uart));
});
loop {
low_power::sleep_now(&mut SCB);
}
}
#[interrupt]
fn USART1() {
free(|cs| {
let mut u = UART.borrow(cs).borrow_mut();
let uart = u.as_mut().unwrap();
uart.clear_interrupt(UsartInterrupt::ReadNotEmpty);
let mut buf = READ_BUF.borrow(cs).borrow_mut();
let i = READ_I.borrow(cs);
let i_val = i.get();
if i_val == BUF_SIZE {
}
buf[i_val] = uart.read_one();
i.set(i_val + 1);
});
}