bxcan: Disable on drop
This commit is contained in:
parent
7c405250a7
commit
dc6b7f3cba
1 changed files with 23 additions and 6 deletions
|
@ -26,12 +26,12 @@ impl<'d, T: Instance + bxcan::Instance> Can<'d, T> {
|
||||||
unsafe {
|
unsafe {
|
||||||
rx.set_as_af(rx.af_num());
|
rx.set_as_af(rx.af_num());
|
||||||
tx.set_as_af(tx.af_num());
|
tx.set_as_af(tx.af_num());
|
||||||
|
|
||||||
T::enable();
|
|
||||||
T::reset();
|
|
||||||
// TODO: CAN2 also required CAN1 clock
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
T::enable();
|
||||||
|
T::reset();
|
||||||
|
// TODO: CAN2 also required CAN1 clock
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
can: bxcan::Can::new(peri),
|
can: bxcan::Can::new(peri),
|
||||||
|
@ -39,6 +39,17 @@ impl<'d, T: Instance + bxcan::Instance> Can<'d, T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance + bxcan::Instance> Drop for Can<'d, T> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
// Cannot call `free()` because it moves the instance.
|
||||||
|
// Manually reset the peripheral.
|
||||||
|
unsafe {
|
||||||
|
T::regs().mcr().write(|w| w.set_reset(true));
|
||||||
|
}
|
||||||
|
T::disable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance + bxcan::Instance> Deref for Can<'d, T> {
|
impl<'d, T: Instance + bxcan::Instance> Deref for Can<'d, T> {
|
||||||
type Target = bxcan::Can<T>;
|
type Target = bxcan::Can<T>;
|
||||||
|
|
||||||
|
@ -56,7 +67,9 @@ impl<'d, T: Instance + bxcan::Instance> DerefMut for Can<'d, T> {
|
||||||
pub(crate) mod sealed {
|
pub(crate) mod sealed {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
pub trait Instance {}
|
pub trait Instance {
|
||||||
|
fn regs() -> &'static crate::pac::bxcan::Can;
|
||||||
|
}
|
||||||
|
|
||||||
pub trait RxPin<T: Instance>: Pin {
|
pub trait RxPin<T: Instance>: Pin {
|
||||||
fn af_num(&self) -> u8;
|
fn af_num(&self) -> u8;
|
||||||
|
@ -73,7 +86,11 @@ pub trait TxPin<T: Instance>: sealed::TxPin<T> {}
|
||||||
|
|
||||||
crate::pac::peripherals!(
|
crate::pac::peripherals!(
|
||||||
(bxcan, $inst:ident) => {
|
(bxcan, $inst:ident) => {
|
||||||
impl sealed::Instance for peripherals::$inst {}
|
impl sealed::Instance for peripherals::$inst {
|
||||||
|
fn regs() -> &'static crate::pac::bxcan::Can {
|
||||||
|
&crate::pac::$inst
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Instance for peripherals::$inst {}
|
impl Instance for peripherals::$inst {}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue