aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/lib.rs')
-rw-r--r--embassy-stm32/src/lib.rs76
1 files changed, 49 insertions, 27 deletions
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index 5d9b4e6a0..f10e9d50d 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -1,5 +1,6 @@
1#![cfg_attr(not(test), no_std)] 1#![cfg_attr(not(test), no_std)]
2#![allow(async_fn_in_trait)] 2#![allow(async_fn_in_trait)]
3#![warn(missing_docs)]
3 4
4//! ## Feature flags 5//! ## Feature flags
5#![doc = document_features::document_features!(feature_label = r#"<span class="stab portability"><code>{feature}</code></span>"#)] 6#![doc = document_features::document_features!(feature_label = r#"<span class="stab portability"><code>{feature}</code></span>"#)]
@@ -79,6 +80,7 @@ pub(crate) mod _generated {
79 #![allow(dead_code)] 80 #![allow(dead_code)]
80 #![allow(unused_imports)] 81 #![allow(unused_imports)]
81 #![allow(non_snake_case)] 82 #![allow(non_snake_case)]
83 #![allow(missing_docs)]
82 84
83 include!(concat!(env!("OUT_DIR"), "/_generated.rs")); 85 include!(concat!(env!("OUT_DIR"), "/_generated.rs"));
84} 86}
@@ -149,15 +151,33 @@ use crate::interrupt::Priority;
149pub use crate::pac::NVIC_PRIO_BITS; 151pub use crate::pac::NVIC_PRIO_BITS;
150use crate::rcc::sealed::RccPeripheral; 152use crate::rcc::sealed::RccPeripheral;
151 153
154/// `embassy-stm32` global configuration.
152#[non_exhaustive] 155#[non_exhaustive]
153pub struct Config { 156pub struct Config {
157 /// RCC config.
154 pub rcc: rcc::Config, 158 pub rcc: rcc::Config,
159
160 /// Enable debug during sleep.
161 ///
162 /// May incrase power consumption. Defaults to true.
155 #[cfg(dbgmcu)] 163 #[cfg(dbgmcu)]
156 pub enable_debug_during_sleep: bool, 164 pub enable_debug_during_sleep: bool,
165
166 /// BDMA interrupt priority.
167 ///
168 /// Defaults to P0 (highest).
157 #[cfg(bdma)] 169 #[cfg(bdma)]
158 pub bdma_interrupt_priority: Priority, 170 pub bdma_interrupt_priority: Priority,
171
172 /// DMA interrupt priority.
173 ///
174 /// Defaults to P0 (highest).
159 #[cfg(dma)] 175 #[cfg(dma)]
160 pub dma_interrupt_priority: Priority, 176 pub dma_interrupt_priority: Priority,
177
178 /// GPDMA interrupt priority.
179 ///
180 /// Defaults to P0 (highest).
161 #[cfg(gpdma)] 181 #[cfg(gpdma)]
162 pub gpdma_interrupt_priority: Priority, 182 pub gpdma_interrupt_priority: Priority,
163} 183}
@@ -178,38 +198,40 @@ impl Default for Config {
178 } 198 }
179} 199}
180 200
181/// Initialize embassy. 201/// Initialize the `embassy-stm32` HAL with the provided configuration.
202///
203/// This returns the peripheral singletons that can be used for creating drivers.
204///
205/// This should only be called once at startup, otherwise it panics.
182pub fn init(config: Config) -> Peripherals { 206pub fn init(config: Config) -> Peripherals {
183 critical_section::with(|cs| { 207 critical_section::with(|cs| {
184 let p = Peripherals::take_with_cs(cs); 208 let p = Peripherals::take_with_cs(cs);
185 209
186 #[cfg(dbgmcu)] 210 #[cfg(dbgmcu)]
187 if config.enable_debug_during_sleep { 211 crate::pac::DBGMCU.cr().modify(|cr| {
188 crate::pac::DBGMCU.cr().modify(|cr| { 212 #[cfg(any(dbgmcu_f0, dbgmcu_c0, dbgmcu_g0, dbgmcu_u5, dbgmcu_wba))]
189 #[cfg(any(dbgmcu_f0, dbgmcu_c0, dbgmcu_g0, dbgmcu_u5, dbgmcu_wba))] 213 {
190 { 214 cr.set_dbg_stop(config.enable_debug_during_sleep);
191 cr.set_dbg_stop(true); 215 cr.set_dbg_standby(config.enable_debug_during_sleep);
192 cr.set_dbg_standby(true); 216 }
193 } 217 #[cfg(any(
194 #[cfg(any( 218 dbgmcu_f1, dbgmcu_f2, dbgmcu_f3, dbgmcu_f4, dbgmcu_f7, dbgmcu_g4, dbgmcu_f7, dbgmcu_l0, dbgmcu_l1,
195 dbgmcu_f1, dbgmcu_f2, dbgmcu_f3, dbgmcu_f4, dbgmcu_f7, dbgmcu_g4, dbgmcu_f7, dbgmcu_l0, dbgmcu_l1, 219 dbgmcu_l4, dbgmcu_wb, dbgmcu_wl
196 dbgmcu_l4, dbgmcu_wb, dbgmcu_wl 220 ))]
197 ))] 221 {
198 { 222 cr.set_dbg_sleep(config.enable_debug_during_sleep);
199 cr.set_dbg_sleep(true); 223 cr.set_dbg_stop(config.enable_debug_during_sleep);
200 cr.set_dbg_stop(true); 224 cr.set_dbg_standby(config.enable_debug_during_sleep);
201 cr.set_dbg_standby(true); 225 }
202 } 226 #[cfg(dbgmcu_h7)]
203 #[cfg(dbgmcu_h7)] 227 {
204 { 228 cr.set_d1dbgcken(config.enable_debug_during_sleep);
205 cr.set_d1dbgcken(true); 229 cr.set_d3dbgcken(config.enable_debug_during_sleep);
206 cr.set_d3dbgcken(true); 230 cr.set_dbgsleep_d1(config.enable_debug_during_sleep);
207 cr.set_dbgsleep_d1(true); 231 cr.set_dbgstby_d1(config.enable_debug_during_sleep);
208 cr.set_dbgstby_d1(true); 232 cr.set_dbgstop_d1(config.enable_debug_during_sleep);
209 cr.set_dbgstop_d1(true); 233 }
210 } 234 });
211 });
212 }
213 235
214 #[cfg(not(any(stm32f1, stm32wb, stm32wl)))] 236 #[cfg(not(any(stm32f1, stm32wb, stm32wl)))]
215 peripherals::SYSCFG::enable_and_reset_with_cs(cs); 237 peripherals::SYSCFG::enable_and_reset_with_cs(cs);