use crate::cm::interrupt::InterruptNumber;
use crate::pac::NVIC;
use crate::cm::peripheral::nvic::RegisterBlock as NvicRB;
pub trait NvicExt {
fn constrain(self) -> Nvic;
}
impl NvicExt for NVIC {
fn constrain(self) -> Nvic {
Nvic { nvic: self }
}
}
pub struct Nvic {
nvic: NVIC,
}
impl Nvic {
pub fn set_priority<I>(&mut self, interrupt: I, priority: u8)
where
I: InterruptNumber,
{
unsafe {
self.nvic.set_priority(interrupt, priority);
}
}
pub fn enable_irq<I>(&self, interrupt: I)
where
I: InterruptNumber,
{
unsafe { NVIC::unmask(interrupt) }
}
pub fn disable_irq<I>(&self, interrupt: I)
where
I: InterruptNumber,
{
NVIC::mask(interrupt)
}
pub fn clear_pending_interrupts(&mut self) {
unsafe { self.nvic.icpr[0].write(0xFFFFFFFF) };
}
}
pub trait Interrupt {
fn set_priority(nvic: &mut NvicRB, prio: u8);
fn enable();
fn disable();
}
#[derive(Clone, Copy)]
#[repr(u8)]
pub enum Irq {
Adc = 6,
Gpio0 = 10,
Gpio1 = 11,
Gpio2 = 12,
Gpio3 = 13,
Gpio4 = 14,
SwTim0 = 15,
WakupQuadec = 16,
}
unsafe impl InterruptNumber for Irq {
fn number(self) -> u16 {
self as u8 as u16
}
}