aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/lib.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-10-12 14:29:23 +0000
committerGitHub <[email protected]>2023-10-12 14:29:23 +0000
commitdebda2f52c320904755d89ef9c19fa6e54734fe8 (patch)
tree20f7a2f1e27e0d30e530047e819b6efeaf2bd9cc /embassy-stm32/src/lib.rs
parent66e399b5c61653f1f66cd3fd1592936e4085d6b5 (diff)
parent97ca0e77bf6e6f36aae18cb57fbfa8e583597327 (diff)
Merge pull request #2045 from embassy-rs/stm32-cs-spam
Avoid creating many tiny critical sections in embassy-stm32::init
Diffstat (limited to 'embassy-stm32/src/lib.rs')
-rw-r--r--embassy-stm32/src/lib.rs145
1 files changed, 73 insertions, 72 deletions
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index b93e5ee87..372246f87 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -155,81 +155,82 @@ impl Default for Config {
155 155
156/// Initialize embassy. 156/// Initialize embassy.
157pub fn init(config: Config) -> Peripherals { 157pub fn init(config: Config) -> Peripherals {
158 let p = Peripherals::take(); 158 critical_section::with(|cs| {
159 159 let p = Peripherals::take_with_cs(cs);
160 #[cfg(dbgmcu)] 160
161 if config.enable_debug_during_sleep { 161 #[cfg(dbgmcu)]
162 crate::pac::DBGMCU.cr().modify(|cr| { 162 if config.enable_debug_during_sleep {
163 #[cfg(any(dbgmcu_f0, dbgmcu_c0, dbgmcu_g0, dbgmcu_u5, dbgmcu_wba))] 163 crate::pac::DBGMCU.cr().modify(|cr| {
164 { 164 #[cfg(any(dbgmcu_f0, dbgmcu_c0, dbgmcu_g0, dbgmcu_u5, dbgmcu_wba))]
165 cr.set_dbg_stop(true); 165 {
166 cr.set_dbg_standby(true); 166 cr.set_dbg_stop(true);
167 } 167 cr.set_dbg_standby(true);
168 #[cfg(any( 168 }
169 dbgmcu_f1, dbgmcu_f2, dbgmcu_f3, dbgmcu_f4, dbgmcu_f7, dbgmcu_g4, dbgmcu_f7, dbgmcu_l0, dbgmcu_l1, 169 #[cfg(any(
170 dbgmcu_l4, dbgmcu_wb, dbgmcu_wl 170 dbgmcu_f1, dbgmcu_f2, dbgmcu_f3, dbgmcu_f4, dbgmcu_f7, dbgmcu_g4, dbgmcu_f7, dbgmcu_l0, dbgmcu_l1,
171 ))] 171 dbgmcu_l4, dbgmcu_wb, dbgmcu_wl
172 { 172 ))]
173 cr.set_dbg_sleep(true); 173 {
174 cr.set_dbg_stop(true); 174 cr.set_dbg_sleep(true);
175 cr.set_dbg_standby(true); 175 cr.set_dbg_stop(true);
176 } 176 cr.set_dbg_standby(true);
177 #[cfg(dbgmcu_h7)] 177 }
178 { 178 #[cfg(dbgmcu_h7)]
179 cr.set_d1dbgcken(true); 179 {
180 cr.set_d3dbgcken(true); 180 cr.set_d1dbgcken(true);
181 cr.set_dbgsleep_d1(true); 181 cr.set_d3dbgcken(true);
182 cr.set_dbgstby_d1(true); 182 cr.set_dbgsleep_d1(true);
183 cr.set_dbgstop_d1(true); 183 cr.set_dbgstby_d1(true);
184 } 184 cr.set_dbgstop_d1(true);
185 }); 185 }
186 } 186 });
187 187 }
188 #[cfg(not(any(stm32f1, stm32wb, stm32wl)))]
189 peripherals::SYSCFG::enable_and_reset();
190 #[cfg(not(any(stm32h5, stm32h7, stm32wb, stm32wl)))]
191 peripherals::PWR::enable_and_reset();
192 #[cfg(not(any(stm32f2, stm32f4, stm32f7, stm32l0, stm32h5, stm32h7)))]
193 peripherals::FLASH::enable_and_reset();
194
195 unsafe {
196 #[cfg(feature = "_split-pins-enabled")]
197 crate::pac::SYSCFG.pmcr().modify(|pmcr| {
198 #[cfg(feature = "split-pa0")]
199 pmcr.set_pa0so(true);
200 #[cfg(feature = "split-pa1")]
201 pmcr.set_pa1so(true);
202 #[cfg(feature = "split-pc2")]
203 pmcr.set_pc2so(true);
204 #[cfg(feature = "split-pc3")]
205 pmcr.set_pc3so(true);
206 });
207
208 gpio::init();
209 dma::init(
210 #[cfg(bdma)]
211 config.bdma_interrupt_priority,
212 #[cfg(dma)]
213 config.dma_interrupt_priority,
214 #[cfg(gpdma)]
215 config.gpdma_interrupt_priority,
216 );
217 #[cfg(feature = "exti")]
218 exti::init();
219
220 rcc::init(config.rcc);
221 188
222 // must be after rcc init 189 #[cfg(not(any(stm32f1, stm32wb, stm32wl)))]
223 #[cfg(feature = "_time-driver")] 190 peripherals::SYSCFG::enable_and_reset_with_cs(cs);
224 time_driver::init(); 191 #[cfg(not(any(stm32h5, stm32h7, stm32wb, stm32wl)))]
192 peripherals::PWR::enable_and_reset_with_cs(cs);
193 #[cfg(not(any(stm32f2, stm32f4, stm32f7, stm32l0, stm32h5, stm32h7)))]
194 peripherals::FLASH::enable_and_reset_with_cs(cs);
195
196 unsafe {
197 #[cfg(feature = "_split-pins-enabled")]
198 crate::pac::SYSCFG.pmcr().modify(|pmcr| {
199 #[cfg(feature = "split-pa0")]
200 pmcr.set_pa0so(true);
201 #[cfg(feature = "split-pa1")]
202 pmcr.set_pa1so(true);
203 #[cfg(feature = "split-pc2")]
204 pmcr.set_pc2so(true);
205 #[cfg(feature = "split-pc3")]
206 pmcr.set_pc3so(true);
207 });
225 208
226 #[cfg(feature = "low-power")] 209 gpio::init(cs);
227 while !crate::rcc::low_power_ready() { 210 dma::init(
228 critical_section::with(|cs| { 211 cs,
212 #[cfg(bdma)]
213 config.bdma_interrupt_priority,
214 #[cfg(dma)]
215 config.dma_interrupt_priority,
216 #[cfg(gpdma)]
217 config.gpdma_interrupt_priority,
218 );
219 #[cfg(feature = "exti")]
220 exti::init(cs);
221
222 rcc::init(config.rcc);
223
224 // must be after rcc init
225 #[cfg(feature = "_time-driver")]
226 time_driver::init(cs);
227
228 #[cfg(feature = "low-power")]
229 while !crate::rcc::low_power_ready() {
229 crate::rcc::clock_refcount_sub(cs); 230 crate::rcc::clock_refcount_sub(cs);
230 }); 231 }
231 } 232 }
232 }
233 233
234 p 234 p
235 })
235} 236}