1use embassy_stm32::Peripherals;
6use embassy_stm32::gpio::{Level, Output, Speed};
7use embassy_stm32::i2c::{Config as I2cConfig, I2c};
8use embassy_stm32::mode::{Async, Blocking};
9use embassy_stm32::rcc::*;
10use embassy_stm32::spi::{Config as SpiConfig, Spi};
11use embassy_stm32::usart::{Config as UsartConfig, Uart};
12use embassy_stm32::{Config, bind_interrupts, peripherals, sdmmc, usart};
13bind_interrupts!(struct Irqs {
21 SDIO => sdmmc::InterruptHandler<peripherals::SDIO>;
22 USART1 => usart::InterruptHandler<peripherals::USART1>;
23
24});
25
26pub struct Board<'a> {
27 pub debug_uart: Uart<'a, Blocking>, pub led_mcu_on: Output<'a>,
29 pub led_other_function: Output<'a>,
30 pub imu: I2c<'a, Blocking, embassy_stm32::i2c::Master>, pub accel: I2c<'a, Blocking, embassy_stm32::i2c::Master>,
34 pub gps_uart: Uart<'a, Async>,
35 pub altimeter: Spi<'a, Async, embassy_stm32::spi::mode::Master>, pub altimeter_cs: Output<'a>,
39 pub sd_spi: Spi<'a, Blocking, embassy_stm32::spi::mode::Master>,
40 pub sd_cs: Output<'a>,
41 pub lora_spi: Spi<'a, Blocking, embassy_stm32::spi::mode::Master>,
42 pub lora_cs: Output<'a>,
43 pub lora_reset: Output<'a>,
44}
45
46impl Board<'static> {
47 pub fn set_clock() -> Config {
49 let mut config = Config::default();
50
51 config.rcc.hse = None; config.rcc.hsi = true;
53
54 config.rcc.pll_src = PllSource::HSI;
55
56 config.rcc.pll = Some(Pll {
58 prediv: PllPreDiv::DIV8, mul: PllMul::MUL192, divp: Some(PllPDiv::DIV4), divq: Some(PllQDiv::DIV8), divr: None,
64 });
65 config.rcc.ahb_pre = AHBPrescaler::DIV1;
66 config.rcc.apb1_pre = APBPrescaler::DIV4;
67 config.rcc.apb2_pre = APBPrescaler::DIV2;
68 config.rcc.sys = Sysclk::PLL1_P;
69
70 config
71 }
72 pub fn new(p: Peripherals) -> Self {
73 let mut debug_uart_cfg = UsartConfig::default();
74 debug_uart_cfg.baudrate = 115200;
75 let debug_uart = Uart::new_blocking(p.USART2, p.PA3, p.PA2, debug_uart_cfg).unwrap();
76
77 let led_mcu_on = Output::new(p.PA12, Level::High, Speed::Low);
78 let led_other_function = Output::new(p.PB15, Level::High, Speed::Low);
79
80 let mut gps_uart_cfg = UsartConfig::default();
82 gps_uart_cfg.baudrate = 38400;
83 let gps_uart = Uart::new(
84 p.USART1,
85 p.PA10,
86 p.PA9,
87 Irqs,
88 p.DMA2_CH7,
89 p.DMA2_CH2,
90 gps_uart_cfg,
91 )
92 .unwrap();
93
94 let i2c_cfg = I2cConfig::default();
96 let imu = I2c::new_blocking(p.I2C1, p.PB6, p.PB7, i2c_cfg);
97
98 let mut i2c_config_pulls = I2cConfig::default();
99
100 i2c_config_pulls.sda_pullup = true;
102 i2c_config_pulls.scl_pullup = true;
103 let accel = I2c::new_blocking(p.I2C3, p.PA8, p.PB4, i2c_config_pulls);
104
105 let mut spi_cfg = SpiConfig::default();
106 let altimeter = Spi::new(
107 p.SPI2, p.PB13, p.PC1, p.PC2, p.DMA1_CH4, p.DMA1_CH3, spi_cfg,
108 );
109
110 let altimeter_cs = Output::new(p.PA0, Level::High, Speed::High); let mut sd_spi_cfg = SpiConfig::default();
115 sd_spi_cfg.frequency = embassy_stm32::time::mhz(1);
118
119 let sd_spi = Spi::new_blocking(
120 p.SPI3, p.PC10, p.PB5, p.PC11, sd_spi_cfg,
124 );
125 let mut lora_spi_cfg = SpiConfig::default();
127 lora_spi_cfg.frequency = embassy_stm32::time::mhz(1); let lora_spi = Spi::new_blocking(
130 p.SPI1,
131 p.PA5,
132 p.PA7,
133 p.PA6,
134 lora_spi_cfg, );
136
137 let lora_cs = Output::new(p.PA4, Level::High, Speed::High);
139
140 let lora_reset = Output::new(p.PC4, Level::High, Speed::High);
142 let sd_cs = Output::new(p.PA1, Level::High, Speed::High);
144 Self {
145 debug_uart,
146 led_mcu_on,
147 led_other_function,
148 imu,
149 accel,
150 gps_uart,
151 altimeter,
152 altimeter_cs,
153 sd_spi,
154 sd_cs,
155 lora_spi,
156 lora_cs,
157 lora_reset,
158 }
159 }
160}