nucleo/platforms/stm_32/
stm32h7x3_common.rs1use core::default::Default;
37use core::option::Option::Some;
38use embassy_stm32::{Config, rcc};
39
40use embassy_embedded_hal::shared_bus::asynch::i2c::I2cDevice;
41use embassy_embedded_hal::shared_bus::asynch::spi::SpiDevice;
42use embassy_executor::InterruptExecutor;
43use embassy_stm32::Peripherals as EMBASSY_Peripherals;
44use embassy_stm32::bind_interrupts;
45use embassy_stm32::dma;
46use embassy_stm32::exti;
47use embassy_stm32::exti::ExtiInput;
48#[allow(unused_imports)]
49use embassy_stm32::gpio::OutputType;
50use embassy_stm32::gpio::Pull;
51use embassy_stm32::gpio::{Level, Output, Speed};
52use embassy_stm32::i2c;
53use embassy_stm32::interrupt;
54use embassy_stm32::interrupt::InterruptExt;
55use embassy_stm32::interrupt::Priority;
56use embassy_stm32::mode::Async;
57use embassy_stm32::peripherals as EMBASSY_peripherals;
58use embassy_stm32::sdmmc;
59use embassy_stm32::spi;
60use embassy_stm32::spi::mode::Master as SpiMaster;
61use embassy_stm32::time::Hertz;
62use embassy_stm32::time::mhz;
63#[allow(unused_imports)]
64use embassy_stm32::timer::simple_pwm::{PwmPin, SimplePwm};
65use embassy_stm32::usart;
66use embassy_stm32::usart::Uart;
67use embassy_stm32::usb;
68use embassy_stm32::usb::Driver;
69use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
70use embassy_sync::mutex::Mutex;
71use static_cell::StaticCell;
72pub static SPI1_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
73 StaticCell::new();
74pub static SPI2_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
75 StaticCell::new();
76pub static SPI3_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
77 StaticCell::new();
78pub static SPI4_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
79 StaticCell::new();
80pub static SPI5_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
81 StaticCell::new();
82pub static SPI6_BUS: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<'static, Async, SpiMaster>>> =
83 StaticCell::new();
84
85pub static I2C1_BUS: StaticCell<Mutex<CriticalSectionRawMutex, i2c::I2c<'static, Async, i2c::mode::Master>>> =
86 StaticCell::new();
87pub static I2C2_BUS: StaticCell<Mutex<CriticalSectionRawMutex, i2c::I2c<'static, Async, i2c::mode::Master>>> =
88 StaticCell::new();
89pub static I2C3_BUS: StaticCell<Mutex<CriticalSectionRawMutex, i2c::I2c<'static, Async, i2c::mode::Master>>> =
90 StaticCell::new();
91pub static I2C4_BUS: StaticCell<Mutex<CriticalSectionRawMutex, i2c::I2c<'static, Async, i2c::mode::Master>>> =
92 StaticCell::new();
93
94bind_interrupts!(struct BoardIrqs {
95 I2C1_EV => i2c::EventInterruptHandler<EMBASSY_peripherals::I2C1>;
96 I2C1_ER => i2c::ErrorInterruptHandler<EMBASSY_peripherals::I2C1>;
97 I2C2_EV => i2c::EventInterruptHandler<EMBASSY_peripherals::I2C2>;
98 I2C2_ER => i2c::ErrorInterruptHandler<EMBASSY_peripherals::I2C2>;
99 I2C3_EV => i2c::EventInterruptHandler<EMBASSY_peripherals::I2C3>;
100 I2C3_ER => i2c::ErrorInterruptHandler<EMBASSY_peripherals::I2C3>;
101 I2C4_EV => i2c::EventInterruptHandler<EMBASSY_peripherals::I2C4>;
102 I2C4_ER => i2c::ErrorInterruptHandler<EMBASSY_peripherals::I2C4>;
103 USART1 => usart::InterruptHandler<EMBASSY_peripherals::USART1>;
104 USART2 => usart::InterruptHandler<EMBASSY_peripherals::USART2>;
105 USART3 => usart::InterruptHandler<EMBASSY_peripherals::USART3>;
106 USART6 => usart::InterruptHandler<EMBASSY_peripherals::USART6>;
107 UART4 => usart::InterruptHandler<EMBASSY_peripherals::UART4>;
108 UART5 => usart::InterruptHandler<EMBASSY_peripherals::UART5>;
109 UART7 => usart::InterruptHandler<EMBASSY_peripherals::UART7>;
110 UART8 => usart::InterruptHandler<EMBASSY_peripherals::UART8>;
111 SDMMC1 => sdmmc::InterruptHandler<EMBASSY_peripherals::SDMMC1>;
112 DMA1_STREAM0 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH0>;
113 DMA1_STREAM1 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH1>;
114 DMA1_STREAM2 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH2>;
115 DMA1_STREAM3 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH3>;
116 DMA1_STREAM4 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH4>;
117 DMA1_STREAM5 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH5>;
118 DMA1_STREAM6 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH6>;
119 DMA1_STREAM7 => dma::InterruptHandler<EMBASSY_peripherals::DMA1_CH7>;
120 DMA2_STREAM0 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH0>;
121 DMA2_STREAM1 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH1>;
122 DMA2_STREAM2 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH2>;
123 DMA2_STREAM3 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH3>;
124 DMA2_STREAM4 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH4>;
125 DMA2_STREAM5 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH5>;
126 DMA2_STREAM6 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH6>;
127 DMA2_STREAM7 => dma::InterruptHandler<EMBASSY_peripherals::DMA2_CH7>;
128 EXTI0 => exti::InterruptHandler<interrupt::typelevel::EXTI0>;
129 EXTI1 => exti::InterruptHandler<interrupt::typelevel::EXTI1>;
130 EXTI2 => exti::InterruptHandler<interrupt::typelevel::EXTI2>;
131 EXTI3 => exti::InterruptHandler<interrupt::typelevel::EXTI3>;
132 EXTI4 => exti::InterruptHandler<interrupt::typelevel::EXTI4>;
133 EXTI9_5 => exti::InterruptHandler<interrupt::typelevel::EXTI9_5>;
134 EXTI15_10 => exti::InterruptHandler<interrupt::typelevel::EXTI15_10>;
135});
136
137bind_interrupts!(struct Irqs {
139 OTG_FS => usb::InterruptHandler<EMBASSY_peripherals::USB_OTG_FS>;
140});
141
142static P0_EXECUTOR: InterruptExecutor = InterruptExecutor::new();
147#[interrupt]
148unsafe fn SDMMC2() {
149 unsafe { P0_EXECUTOR.on_interrupt() };
150}
151
152static P1_EXECUTOR: InterruptExecutor = InterruptExecutor::new();
153#[interrupt]
154unsafe fn SAI1() {
155 unsafe { P1_EXECUTOR.on_interrupt() };
156}
157
158static P2_EXECUTOR: InterruptExecutor = InterruptExecutor::new();
159#[interrupt]
160unsafe fn SAI2() {
161 unsafe { P2_EXECUTOR.on_interrupt() };
162}
163
164static P3_EXECUTOR: InterruptExecutor = InterruptExecutor::new();
165#[interrupt]
166unsafe fn SAI3() {
167 unsafe { P3_EXECUTOR.on_interrupt() };
168}
169
170static P4_EXECUTOR: InterruptExecutor = InterruptExecutor::new();
171#[interrupt]
172unsafe fn SAI4() {
173 unsafe { P4_EXECUTOR.on_interrupt() };
174}
175
176pub fn clock_config(mhz: u32) -> Config {
177 let mut config = Config::default();
178 {
179 use embassy_stm32::rcc::*;
180 config.rcc.hsi = Some(HSIPrescaler::DIV1); config.rcc.hse = Some(rcc::Hse {
186 freq: embassy_stm32::time::Hertz(mhz * 1_000_000), mode: rcc::HseMode::Oscillator,
188 });
189
190 let mut hsi_prediv = PllPreDiv::DIV4; if mhz == 4 {
194 hsi_prediv = PllPreDiv::DIV2;
195 } else if mhz == 8 {
196 hsi_prediv = PllPreDiv::DIV4;
197 } else if mhz == 24 {
198 hsi_prediv = PllPreDiv::DIV12;
199 } else if mhz == 50 {
200 hsi_prediv = PllPreDiv::DIV25;
201 } else if mhz == 64 {
202 hsi_prediv = PllPreDiv::DIV32;
203 } else {
204 }
206
207 config.rcc.pll1 = Some(Pll {
208 source: PllSource::HSE, prediv: hsi_prediv, mul: PllMul::MUL400, divp: Some(PllDiv::DIV2), divq: Some(PllDiv::DIV8), divr: Some(PllDiv::DIV2), });
215
216 config.rcc.pll2 = Some(Pll {
217 source: PllSource::HSE, prediv: hsi_prediv, mul: PllMul::MUL240, divp: Some(PllDiv::DIV30), divq: Some(PllDiv::DIV30), divr: Some(PllDiv::DIV5), });
224
225 config.rcc.pll3 = Some(Pll {
226 source: PllSource::HSE, prediv: hsi_prediv, mul: PllMul::MUL480, divp: Some(PllDiv::DIV48), divq: Some(PllDiv::DIV20), divr: Some(PllDiv::DIV15), });
233 config.rcc.sys = Sysclk::PLL1_P; config.rcc.d1c_pre = AHBPrescaler::DIV1; config.rcc.ahb_pre = AHBPrescaler::DIV2; config.rcc.apb1_pre = APBPrescaler::DIV2; config.rcc.apb2_pre = APBPrescaler::DIV2; config.rcc.apb3_pre = APBPrescaler::DIV2; config.rcc.apb4_pre = APBPrescaler::DIV2; config.rcc.timer_prescaler = TimerPrescaler::DefaultX2; config.rcc.hsi48 = Some(Hsi48Config {
249 sync_from_usb: true,
250 }); config.rcc.voltage_scale = VoltageScale::Scale1; config.rcc.mux.adcsel = mux::Adcsel::PLL3_R; config.rcc.mux.usbsel = mux::Usbsel::HSI48;
258 config.rcc.mux.sdmmcsel = mux::Sdmmcsel::PLL1_Q; config.rcc.mux.i2c1235sel = mux::I2c1235sel::PCLK1; config.rcc.mux.rngsel = mux::Rngsel::HSI48; config.rcc.mux.spi123sel = mux::Saisel::PLL2_P; config.rcc.mux.spi45sel = mux::Spi45sel::PLL2_Q; config.rcc.mux.usart16910sel = mux::Usart16910sel::PCLK2; config.rcc.mux.usart234578sel = mux::Usart234578sel::PCLK1; }
273 return config;
274}