Merge pull request #69 from michaelbeaumont/stm32l0
Add stm32l0 support for ExtiPin futures
This commit is contained in:
		
						commit
						4a38e7eb2b
					
				@ -5,6 +5,7 @@ members = [
 | 
				
			|||||||
    "embassy-traits",
 | 
					    "embassy-traits",
 | 
				
			||||||
    "embassy-nrf",
 | 
					    "embassy-nrf",
 | 
				
			||||||
    "embassy-stm32f4",
 | 
					    "embassy-stm32f4",
 | 
				
			||||||
 | 
					    "embassy-stm32l0",
 | 
				
			||||||
    "embassy-nrf-examples",
 | 
					    "embassy-nrf-examples",
 | 
				
			||||||
    "embassy-stm32f4-examples",
 | 
					    "embassy-stm32f4-examples",
 | 
				
			||||||
    "embassy-macros",
 | 
					    "embassy-macros",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								ci.sh
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								ci.sh
									
									
									
									
									
								
							@ -29,3 +29,8 @@ set -euxo pipefail
 | 
				
			|||||||
(cd embassy-stm32f4-examples; cargo build --target thumbv7em-none-eabi --bins)
 | 
					(cd embassy-stm32f4-examples; cargo build --target thumbv7em-none-eabi --bins)
 | 
				
			||||||
(cd embassy-stm32f4; cargo build --target thumbv7em-none-eabi --features stm32f405)
 | 
					(cd embassy-stm32f4; cargo build --target thumbv7em-none-eabi --features stm32f405)
 | 
				
			||||||
(cd embassy-stm32f4; cargo build --target thumbv7em-none-eabi --features stm32f405,defmt)
 | 
					(cd embassy-stm32f4; cargo build --target thumbv7em-none-eabi --features stm32f405,defmt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# embassy-stm32l0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(cd embassy-stm32l0; cargo build --target thumbv6m-none-eabi --features stm32l0x2)
 | 
				
			||||||
 | 
					(cd embassy-stm32l0; cargo build --target thumbv6m-none-eabi --features stm32l0x2,defmt)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										26
									
								
								embassy-stm32l0/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								embassy-stm32l0/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					[package]
 | 
				
			||||||
 | 
					name = "embassy-stm32l0"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					authors = ["Michael Beaumont <mjboamail@gmail.com>"]
 | 
				
			||||||
 | 
					edition = "2018"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[features]
 | 
				
			||||||
 | 
					defmt-trace = [ ]
 | 
				
			||||||
 | 
					defmt-debug = [ ]
 | 
				
			||||||
 | 
					defmt-info = [ ]
 | 
				
			||||||
 | 
					defmt-warn = [ ]
 | 
				
			||||||
 | 
					defmt-error = [ ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stm32l0x1 = ["stm32l0xx-hal/stm32l0x1"]
 | 
				
			||||||
 | 
					stm32l0x2 = ["stm32l0xx-hal/stm32l0x2"]
 | 
				
			||||||
 | 
					stm32l0x3 = ["stm32l0xx-hal/stm32l0x3"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies]
 | 
				
			||||||
 | 
					embassy = { version = "0.1.0", path = "../embassy" }
 | 
				
			||||||
 | 
					defmt = { version = "0.2.0", optional = true }
 | 
				
			||||||
 | 
					log = { version = "0.4.11", optional = true }
 | 
				
			||||||
 | 
					cortex-m-rt = "0.6.13"
 | 
				
			||||||
 | 
					cortex-m = "0.7.1"
 | 
				
			||||||
 | 
					embedded-hal = { version = "0.2.4" }
 | 
				
			||||||
 | 
					embedded-dma = { version = "0.1.2" }
 | 
				
			||||||
 | 
					stm32l0xx-hal = { version = "0.7.0", features = ["rt"], git = "https://github.com/stm32-rs/stm32l0xx-hal.git"}
 | 
				
			||||||
							
								
								
									
										224
									
								
								embassy-stm32l0/src/exti.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								embassy-stm32l0/src/exti.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,224 @@
 | 
				
			|||||||
 | 
					use core::future::Future;
 | 
				
			||||||
 | 
					use core::mem;
 | 
				
			||||||
 | 
					use core::pin::Pin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use embassy::traits::gpio::{WaitForAnyEdge, WaitForFallingEdge, WaitForRisingEdge};
 | 
				
			||||||
 | 
					use embassy::util::InterruptFuture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::hal::{
 | 
				
			||||||
 | 
					    exti::{Exti, ExtiLine, GpioLine, TriggerEdge},
 | 
				
			||||||
 | 
					    gpio,
 | 
				
			||||||
 | 
					    syscfg::SYSCFG,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					use crate::interrupt;
 | 
				
			||||||
 | 
					use crate::pac::EXTI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct ExtiManager {
 | 
				
			||||||
 | 
					    syscfg: SYSCFG,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<'a> ExtiManager {
 | 
				
			||||||
 | 
					    pub fn new(_exti: Exti, syscfg: SYSCFG) -> Self {
 | 
				
			||||||
 | 
					        Self { syscfg }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn new_pin<T>(&'static mut self, pin: T, interrupt: T::Interrupt) -> ExtiPin<T>
 | 
				
			||||||
 | 
					    where
 | 
				
			||||||
 | 
					        T: PinWithInterrupt,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ExtiPin {
 | 
				
			||||||
 | 
					            pin,
 | 
				
			||||||
 | 
					            interrupt,
 | 
				
			||||||
 | 
					            mgr: self,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct ExtiPin<T: PinWithInterrupt> {
 | 
				
			||||||
 | 
					    pin: T,
 | 
				
			||||||
 | 
					    interrupt: T::Interrupt,
 | 
				
			||||||
 | 
					    mgr: &'static ExtiManager,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T: PinWithInterrupt + 'static> ExtiPin<T> {
 | 
				
			||||||
 | 
					    fn wait_for_edge<'a>(
 | 
				
			||||||
 | 
					        self: Pin<&'a mut Self>,
 | 
				
			||||||
 | 
					        edge: TriggerEdge,
 | 
				
			||||||
 | 
					    ) -> impl Future<Output = ()> + 'a {
 | 
				
			||||||
 | 
					        let line = self.pin.line();
 | 
				
			||||||
 | 
					        let s = unsafe { self.get_unchecked_mut() };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Exti::unpend(line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async move {
 | 
				
			||||||
 | 
					            let exti: EXTI = unsafe { mem::transmute(()) };
 | 
				
			||||||
 | 
					            let mut exti = Exti::new(exti);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let fut = InterruptFuture::new(&mut s.interrupt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let port = s.pin.port();
 | 
				
			||||||
 | 
					            let syscfg = &s.mgr.syscfg as *const _ as *mut SYSCFG;
 | 
				
			||||||
 | 
					            cortex_m::interrupt::free(|_| {
 | 
				
			||||||
 | 
					                let syscfg = unsafe { &mut *syscfg };
 | 
				
			||||||
 | 
					                exti.listen_gpio(syscfg, port, line, edge);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fut.await;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Exti::unpend(line);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T: PinWithInterrupt + 'static> WaitForRisingEdge for ExtiPin<T> {
 | 
				
			||||||
 | 
					    type Future<'a> = impl Future<Output = ()> + 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn wait_for_rising_edge<'a>(self: Pin<&'a mut Self>) -> Self::Future<'a> {
 | 
				
			||||||
 | 
					        self.wait_for_edge(TriggerEdge::Rising)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T: PinWithInterrupt + 'static> WaitForFallingEdge for ExtiPin<T> {
 | 
				
			||||||
 | 
					    type Future<'a> = impl Future<Output = ()> + 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn wait_for_falling_edge<'a>(self: Pin<&'a mut Self>) -> Self::Future<'a> {
 | 
				
			||||||
 | 
					        self.wait_for_edge(TriggerEdge::Falling)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T: PinWithInterrupt + 'static> WaitForAnyEdge for ExtiPin<T> {
 | 
				
			||||||
 | 
					    type Future<'a> = impl Future<Output = ()> + 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn wait_for_any_edge<'a>(self: Pin<&'a mut Self>) -> Self::Future<'a> {
 | 
				
			||||||
 | 
					        self.wait_for_edge(TriggerEdge::Both)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mod private {
 | 
				
			||||||
 | 
					    pub trait Sealed {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub trait PinWithInterrupt: private::Sealed {
 | 
				
			||||||
 | 
					    type Interrupt: interrupt::Interrupt;
 | 
				
			||||||
 | 
					    fn port(&self) -> gpio::Port;
 | 
				
			||||||
 | 
					    fn line(&self) -> GpioLine;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					macro_rules! exti {
 | 
				
			||||||
 | 
					    ($($PER:ident => ($set:ident, $pin:ident),)+) => {
 | 
				
			||||||
 | 
					        $(
 | 
				
			||||||
 | 
					            impl<T> private::Sealed for gpio::$set::$pin<T> {}
 | 
				
			||||||
 | 
					            impl<T> PinWithInterrupt for gpio::$set::$pin<T> {
 | 
				
			||||||
 | 
					                type Interrupt = interrupt::$PER;
 | 
				
			||||||
 | 
					                fn port(&self) -> gpio::Port {
 | 
				
			||||||
 | 
					                    self.port()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                fn line(&self) -> GpioLine {
 | 
				
			||||||
 | 
					                    GpioLine::from_raw_line(self.pin_number()).unwrap()
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )+
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioa, PA0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioa, PA1),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioa, PA2),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioa, PA3),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA4),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA5),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA6),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA7),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA8),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA10),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA11),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA12),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA13),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA14),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioa, PA15),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpiob, PB0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpiob, PB1),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpiob, PB2),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpiob, PB3),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB4),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB5),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB6),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB7),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB8),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB10),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB11),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB12),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB13),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB14),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiob, PB15),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioc, PC0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioc, PC1),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioc, PC2),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioc, PC3),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC4),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC5),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC6),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC7),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC8),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC10),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC11),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC12),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC13),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC14),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioc, PC15),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpiod, PD0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpiod, PD1),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpiod, PD2),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpiod, PD3),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD4),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD5),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD6),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD7),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD8),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD10),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD11),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD12),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD13),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD14),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpiod, PD15),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioe, PE0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioe, PE1),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioe, PE2),
 | 
				
			||||||
 | 
					    EXTI2_3 => (gpioe, PE3),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE4),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE5),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE6),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE7),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE8),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE10),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE11),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE12),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE13),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE14),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioe, PE15),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exti! {
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioh, PH0),
 | 
				
			||||||
 | 
					    EXTI0_1 => (gpioh, PH1),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioh, PH9),
 | 
				
			||||||
 | 
					    EXTI4_15 => (gpioh, PH10),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										119
									
								
								embassy-stm32l0/src/fmt.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								embassy-stm32l0/src/fmt.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					#![macro_use]
 | 
				
			||||||
 | 
					#![allow(clippy::module_inception)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(all(feature = "defmt", feature = "log"))]
 | 
				
			||||||
 | 
					compile_error!("You may not enable both `defmt` and `log` features.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub use fmt::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "defmt")]
 | 
				
			||||||
 | 
					mod fmt {
 | 
				
			||||||
 | 
					    pub use defmt::{
 | 
				
			||||||
 | 
					        assert, assert_eq, assert_ne, debug, debug_assert, debug_assert_eq, debug_assert_ne, error,
 | 
				
			||||||
 | 
					        info, panic, todo, trace, unreachable, unwrap, warn,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "log")]
 | 
				
			||||||
 | 
					mod fmt {
 | 
				
			||||||
 | 
					    pub use core::{
 | 
				
			||||||
 | 
					        assert, assert_eq, assert_ne, debug_assert, debug_assert_eq, debug_assert_ne, panic, todo,
 | 
				
			||||||
 | 
					        unreachable,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    pub use log::{debug, error, info, trace, warn};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(not(any(feature = "defmt", feature = "log")))]
 | 
				
			||||||
 | 
					mod fmt {
 | 
				
			||||||
 | 
					    #![macro_use]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub use core::{
 | 
				
			||||||
 | 
					        assert, assert_eq, assert_ne, debug_assert, debug_assert_eq, debug_assert_ne, panic, todo,
 | 
				
			||||||
 | 
					        unreachable,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[macro_export]
 | 
				
			||||||
 | 
					    macro_rules! trace {
 | 
				
			||||||
 | 
					        ($($msg:expr),+ $(,)?) => {
 | 
				
			||||||
 | 
					            ()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[macro_export]
 | 
				
			||||||
 | 
					    macro_rules! debug {
 | 
				
			||||||
 | 
					        ($($msg:expr),+ $(,)?) => {
 | 
				
			||||||
 | 
					            ()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[macro_export]
 | 
				
			||||||
 | 
					    macro_rules! info {
 | 
				
			||||||
 | 
					        ($($msg:expr),+ $(,)?) => {
 | 
				
			||||||
 | 
					            ()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[macro_export]
 | 
				
			||||||
 | 
					    macro_rules! warn {
 | 
				
			||||||
 | 
					        ($($msg:expr),+ $(,)?) => {
 | 
				
			||||||
 | 
					            ()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[macro_export]
 | 
				
			||||||
 | 
					    macro_rules! error {
 | 
				
			||||||
 | 
					        ($($msg:expr),+ $(,)?) => {
 | 
				
			||||||
 | 
					            ()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(not(feature = "defmt"))]
 | 
				
			||||||
 | 
					#[macro_export]
 | 
				
			||||||
 | 
					macro_rules! unwrap {
 | 
				
			||||||
 | 
					    ($arg:expr) => {
 | 
				
			||||||
 | 
					        match $crate::fmt::Try::into_result($arg) {
 | 
				
			||||||
 | 
					            ::core::result::Result::Ok(t) => t,
 | 
				
			||||||
 | 
					            ::core::result::Result::Err(e) => {
 | 
				
			||||||
 | 
					                ::core::panic!("unwrap of `{}` failed: {:?}", ::core::stringify!($arg), e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    ($arg:expr, $($msg:expr),+ $(,)? ) => {
 | 
				
			||||||
 | 
					        match $crate::fmt::Try::into_result($arg) {
 | 
				
			||||||
 | 
					            ::core::result::Result::Ok(t) => t,
 | 
				
			||||||
 | 
					            ::core::result::Result::Err(e) => {
 | 
				
			||||||
 | 
					                ::core::panic!("unwrap of `{}` failed: {}: {:?}", ::core::stringify!($arg), ::core::format_args!($($msg,)*), e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Copy, Clone, Eq, PartialEq)]
 | 
				
			||||||
 | 
					pub struct NoneError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub trait Try {
 | 
				
			||||||
 | 
					    type Ok;
 | 
				
			||||||
 | 
					    type Error;
 | 
				
			||||||
 | 
					    fn into_result(self) -> Result<Self::Ok, Self::Error>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T> Try for Option<T> {
 | 
				
			||||||
 | 
					    type Ok = T;
 | 
				
			||||||
 | 
					    type Error = NoneError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[inline]
 | 
				
			||||||
 | 
					    fn into_result(self) -> Result<T, NoneError> {
 | 
				
			||||||
 | 
					        self.ok_or(NoneError)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<T, E> Try for Result<T, E> {
 | 
				
			||||||
 | 
					    type Ok = T;
 | 
				
			||||||
 | 
					    type Error = E;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[inline]
 | 
				
			||||||
 | 
					    fn into_result(self) -> Self {
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										162
									
								
								embassy-stm32l0/src/interrupt.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								embassy-stm32l0/src/interrupt.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,162 @@
 | 
				
			|||||||
 | 
					//! Interrupt management
 | 
				
			||||||
 | 
					use crate::pac::NVIC_PRIO_BITS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Re-exports
 | 
				
			||||||
 | 
					pub use cortex_m::interrupt::{CriticalSection, Mutex};
 | 
				
			||||||
 | 
					pub use embassy::interrupt::{declare, take, Interrupt};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
 | 
				
			||||||
 | 
					#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
				
			||||||
 | 
					#[repr(u8)]
 | 
				
			||||||
 | 
					pub enum Priority {
 | 
				
			||||||
 | 
					    Level0 = 0,
 | 
				
			||||||
 | 
					    Level1 = 1,
 | 
				
			||||||
 | 
					    Level2 = 2,
 | 
				
			||||||
 | 
					    Level3 = 3,
 | 
				
			||||||
 | 
					    Level4 = 4,
 | 
				
			||||||
 | 
					    Level5 = 5,
 | 
				
			||||||
 | 
					    Level6 = 6,
 | 
				
			||||||
 | 
					    Level7 = 7,
 | 
				
			||||||
 | 
					    Level8 = 8,
 | 
				
			||||||
 | 
					    Level9 = 9,
 | 
				
			||||||
 | 
					    Level10 = 10,
 | 
				
			||||||
 | 
					    Level11 = 11,
 | 
				
			||||||
 | 
					    Level12 = 12,
 | 
				
			||||||
 | 
					    Level13 = 13,
 | 
				
			||||||
 | 
					    Level14 = 14,
 | 
				
			||||||
 | 
					    Level15 = 15,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<u8> for Priority {
 | 
				
			||||||
 | 
					    fn from(priority: u8) -> Self {
 | 
				
			||||||
 | 
					        match priority >> (8 - NVIC_PRIO_BITS) {
 | 
				
			||||||
 | 
					            0 => Self::Level0,
 | 
				
			||||||
 | 
					            1 => Self::Level1,
 | 
				
			||||||
 | 
					            2 => Self::Level2,
 | 
				
			||||||
 | 
					            3 => Self::Level3,
 | 
				
			||||||
 | 
					            4 => Self::Level4,
 | 
				
			||||||
 | 
					            5 => Self::Level5,
 | 
				
			||||||
 | 
					            6 => Self::Level6,
 | 
				
			||||||
 | 
					            7 => Self::Level7,
 | 
				
			||||||
 | 
					            8 => Self::Level8,
 | 
				
			||||||
 | 
					            9 => Self::Level9,
 | 
				
			||||||
 | 
					            10 => Self::Level10,
 | 
				
			||||||
 | 
					            11 => Self::Level11,
 | 
				
			||||||
 | 
					            12 => Self::Level12,
 | 
				
			||||||
 | 
					            13 => Self::Level13,
 | 
				
			||||||
 | 
					            14 => Self::Level14,
 | 
				
			||||||
 | 
					            15 => Self::Level15,
 | 
				
			||||||
 | 
					            _ => unreachable!(),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<Priority> for u8 {
 | 
				
			||||||
 | 
					    fn from(p: Priority) -> Self {
 | 
				
			||||||
 | 
					        (p as u8) << (8 - NVIC_PRIO_BITS)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "stm32l0x1")]
 | 
				
			||||||
 | 
					mod irqs {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					    declare!(WWDG);
 | 
				
			||||||
 | 
					    declare!(PVD);
 | 
				
			||||||
 | 
					    declare!(RTC);
 | 
				
			||||||
 | 
					    declare!(FLASH);
 | 
				
			||||||
 | 
					    declare!(RCC);
 | 
				
			||||||
 | 
					    declare!(EXTI0_1);
 | 
				
			||||||
 | 
					    declare!(EXTI2_3);
 | 
				
			||||||
 | 
					    declare!(EXTI4_15);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL1);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL2_3);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL4_7);
 | 
				
			||||||
 | 
					    declare!(ADC_COMP);
 | 
				
			||||||
 | 
					    declare!(LPTIM1);
 | 
				
			||||||
 | 
					    declare!(USART4_USART5);
 | 
				
			||||||
 | 
					    declare!(TIM2);
 | 
				
			||||||
 | 
					    declare!(TIM3);
 | 
				
			||||||
 | 
					    declare!(TIM6);
 | 
				
			||||||
 | 
					    declare!(TIM7);
 | 
				
			||||||
 | 
					    declare!(TIM21);
 | 
				
			||||||
 | 
					    declare!(I2C3);
 | 
				
			||||||
 | 
					    declare!(TIM22);
 | 
				
			||||||
 | 
					    declare!(I2C1);
 | 
				
			||||||
 | 
					    declare!(I2C2);
 | 
				
			||||||
 | 
					    declare!(SPI1);
 | 
				
			||||||
 | 
					    declare!(SPI2);
 | 
				
			||||||
 | 
					    declare!(USART1);
 | 
				
			||||||
 | 
					    declare!(USART2);
 | 
				
			||||||
 | 
					    declare!(AES_RNG_LPUART1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "stm32l0x2")]
 | 
				
			||||||
 | 
					mod irqs {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					    declare!(WWDG);
 | 
				
			||||||
 | 
					    declare!(PVD);
 | 
				
			||||||
 | 
					    declare!(RTC);
 | 
				
			||||||
 | 
					    declare!(RCC);
 | 
				
			||||||
 | 
					    declare!(EXTI0_1);
 | 
				
			||||||
 | 
					    declare!(EXTI2_3);
 | 
				
			||||||
 | 
					    declare!(EXTI4_15);
 | 
				
			||||||
 | 
					    declare!(TSC);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL1);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL2_3);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL4_7);
 | 
				
			||||||
 | 
					    declare!(ADC_COMP);
 | 
				
			||||||
 | 
					    declare!(LPTIM1);
 | 
				
			||||||
 | 
					    declare!(USART4_USART5);
 | 
				
			||||||
 | 
					    declare!(TIM2);
 | 
				
			||||||
 | 
					    declare!(TIM3);
 | 
				
			||||||
 | 
					    declare!(TIM6_DAC);
 | 
				
			||||||
 | 
					    declare!(TIM7);
 | 
				
			||||||
 | 
					    declare!(TIM21);
 | 
				
			||||||
 | 
					    declare!(I2C3);
 | 
				
			||||||
 | 
					    declare!(TIM22);
 | 
				
			||||||
 | 
					    declare!(I2C1);
 | 
				
			||||||
 | 
					    declare!(I2C2);
 | 
				
			||||||
 | 
					    declare!(SPI1);
 | 
				
			||||||
 | 
					    declare!(SPI2);
 | 
				
			||||||
 | 
					    declare!(USART1);
 | 
				
			||||||
 | 
					    declare!(USART2);
 | 
				
			||||||
 | 
					    declare!(AES_RNG_LPUART1);
 | 
				
			||||||
 | 
					    declare!(USB);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "stm32l0x3")]
 | 
				
			||||||
 | 
					mod irqs {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					    declare!(WWDG);
 | 
				
			||||||
 | 
					    declare!(PVD);
 | 
				
			||||||
 | 
					    declare!(RTC);
 | 
				
			||||||
 | 
					    declare!(RCC);
 | 
				
			||||||
 | 
					    declare!(EXTI0_1);
 | 
				
			||||||
 | 
					    declare!(EXTI2_3);
 | 
				
			||||||
 | 
					    declare!(EXTI4_15);
 | 
				
			||||||
 | 
					    declare!(TSC);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL1);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL2_3);
 | 
				
			||||||
 | 
					    declare!(DMA1_CHANNEL4_7);
 | 
				
			||||||
 | 
					    declare!(ADC_COMP);
 | 
				
			||||||
 | 
					    declare!(LPTIM1);
 | 
				
			||||||
 | 
					    declare!(USART4_USART5);
 | 
				
			||||||
 | 
					    declare!(TIM2);
 | 
				
			||||||
 | 
					    declare!(TIM3);
 | 
				
			||||||
 | 
					    declare!(TIM6_DAC);
 | 
				
			||||||
 | 
					    declare!(TIM7);
 | 
				
			||||||
 | 
					    declare!(TIM21);
 | 
				
			||||||
 | 
					    declare!(I2C3);
 | 
				
			||||||
 | 
					    declare!(TIM22);
 | 
				
			||||||
 | 
					    declare!(I2C1);
 | 
				
			||||||
 | 
					    declare!(I2C2);
 | 
				
			||||||
 | 
					    declare!(SPI1);
 | 
				
			||||||
 | 
					    declare!(SPI2);
 | 
				
			||||||
 | 
					    declare!(USART1);
 | 
				
			||||||
 | 
					    declare!(USART2);
 | 
				
			||||||
 | 
					    declare!(AES_RNG_LPUART1);
 | 
				
			||||||
 | 
					    declare!(LCD);
 | 
				
			||||||
 | 
					    declare!(USB);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub use irqs::*;
 | 
				
			||||||
							
								
								
									
										29
									
								
								embassy-stm32l0/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								embassy-stm32l0/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					#![no_std]
 | 
				
			||||||
 | 
					#![feature(generic_associated_types)]
 | 
				
			||||||
 | 
					#![feature(asm)]
 | 
				
			||||||
 | 
					#![feature(type_alias_impl_trait)]
 | 
				
			||||||
 | 
					#![feature(min_type_alias_impl_trait)]
 | 
				
			||||||
 | 
					#![allow(incomplete_features)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(not(any(feature = "stm32l0x1", feature = "stm32l0x2", feature = "stm32l0x3",)))]
 | 
				
			||||||
 | 
					compile_error!(
 | 
				
			||||||
 | 
					    "No chip feature activated. You must activate exactly one of the following features: "
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(any(
 | 
				
			||||||
 | 
					    all(feature = "stm32l0x1", feature = "stm32l0x2"),
 | 
				
			||||||
 | 
					    all(feature = "stm32l0x1", feature = "stm32l0x3"),
 | 
				
			||||||
 | 
					    all(feature = "stm32l0x2", feature = "stm32l0x3"),
 | 
				
			||||||
 | 
					))]
 | 
				
			||||||
 | 
					compile_error!(
 | 
				
			||||||
 | 
					    "Multile chip features activated. You must activate exactly one of the following features: "
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub use stm32l0xx_hal as hal;
 | 
				
			||||||
 | 
					pub use stm32l0xx_hal::pac;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This mod MUST go first, so that the others see its macros.
 | 
				
			||||||
 | 
					pub(crate) mod fmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub mod exti;
 | 
				
			||||||
 | 
					pub mod interrupt;
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user