macro_rules! bind_interrupts { ($vis:vis struct $name:ident { $( $(#[cfg($cond_irq:meta)])? $irq:ident => $( $(#[cfg($cond_handler:meta)])? $handler:ty ),*; )* }) => { ... }; (@inner $($t:tt)*) => { ... }; }
Expand description
Macro to bind interrupts to handlers.
This defines the right interrupt handlers, and creates a unit struct (like struct Irqs;
)
and implements the right [Binding
]s for it. You can pass this struct to drivers to
prove at compile-time that the right interrupts have been bound.
Example of how to bind one interrupt:
ⓘ
use embassy_stm32::{bind_interrupts, usb, peripherals};
bind_interrupts!(struct Irqs {
OTG_FS => usb::InterruptHandler<peripherals::USB_OTG_FS>;
});
Example of how to bind multiple interrupts, and multiple handlers to each interrupt, in a single macro invocation:
ⓘ
use embassy_stm32::{bind_interrupts, i2c, peripherals};
bind_interrupts!(struct Irqs {
I2C1 => i2c::EventInterruptHandler<peripherals::I2C1>, i2c::ErrorInterruptHandler<peripherals::I2C1>;
I2C2_3 => i2c::EventInterruptHandler<peripherals::I2C2>, i2c::ErrorInterruptHandler<peripherals::I2C2>,
i2c::EventInterruptHandler<peripherals::I2C3>, i2c::ErrorInterruptHandler<peripherals::I2C3>;
});