diff options
Diffstat (limited to 'embassy-stm32/src/lib.rs')
| -rw-r--r-- | embassy-stm32/src/lib.rs | 76 |
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; | |||
| 149 | pub use crate::pac::NVIC_PRIO_BITS; | 151 | pub use crate::pac::NVIC_PRIO_BITS; |
| 150 | use crate::rcc::sealed::RccPeripheral; | 152 | use crate::rcc::sealed::RccPeripheral; |
| 151 | 153 | ||
| 154 | /// `embassy-stm32` global configuration. | ||
| 152 | #[non_exhaustive] | 155 | #[non_exhaustive] |
| 153 | pub struct Config { | 156 | pub 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. | ||
| 182 | pub fn init(config: Config) -> Peripherals { | 206 | pub 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); |
