我正在为STM32微控制器编写嵌入式程序。我希望能够将代表按钮的GPIO引脚存储在一个漂亮、整合的结构体中。
由于embedded-hal使用泛型编码"Pin"结构的状态,每个GPIO都有不同的Rust类型,但是对于我的情况(按钮),它们都实现了embedded_hal::digital::v2::InputPin特征。
我可以显式地指定每个成员的类型,但是当进行配置时,我还必须编写每个按钮的引脚和端口,即:
let mut middle = gpioa
.pa6
.into_pull_up_input(&mut gpioa.moder, &mut gpioa.pupdr);
这意味着在结构体中指定类型会导致冗余,并且如果我需要在硬件中更改引脚,我将需要在多个地方更改代码。
存储这些引脚的规范方法是什么?当然,在嵌入式上下文中无法使用特性对象。
目前我有以下内容:
use embedded_hal::digital::v2::InputPin;
struct Buttons<M, R, L, U, D>
where
M: InputPin,
R: InputPin,
L: InputPin,
U: InputPin,
D: InputPin,
{
middle: M,
right: R,
left: L,
up: U,
down: D
}
然而,这似乎是潜在的代码异味。
此外,如果我想将此按钮结构存储在另一个结构中,除非我显式地指定(因此写两次)引脚类型,否则父结构中的泛型数量很可能非常大。
是否有更好的方法来处理这个问题并且同时保持高效?