-
Notifications
You must be signed in to change notification settings - Fork 117
Description
When implementing an application using RTFM and storing peripheral resources in the Resource
structure, the type of the peripheral can be quite onerous to carry around as it contains generic parameters for the pins and peripheral instance.
Example:
let spi = hal::spi::Spi1::new(dp.SP2, (sck, miso, mosi), ...);
The spi
variable has the following type:
hal::spi::Spi<
hal::stm32::SPI2, (
hal::gpio::gpiob::PB10<hal::gpio::Alternate<hal::gpio::AF5>>,
hal::gpio::gpiob::PB14<hal::gpio::Alternate<hal::gpio::AF5>>,
hal::spi::NoMosi)
>
This type then changes based on which pins are used. This type is also required to be specified in the RTFM resource structure declaration, which results in a (fairly messy) structure definition that's non-intuitive.
Because the pin types are used only as a compile-time guarantee that they implement the necessary SPI alternate functions, I don't believe there's a need for the SPI module to carry around this type information after instantiation (although the SPI peripheral needs to maintain ownership of the pins).
I propose that we update the SPI constructor to downgrade the pins to a generic "pin" type since they are never directly controlled by the SPI peripheral. This would remove pin types from the type signature and simplify it to something like hal::spi::Spi<hal::stm32::SPI2>
, which is much more manageable (and we could potentially remove the SPI2 type as well with other work, although that's beyond scope here).