aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBing Wen <[email protected]>2024-11-27 12:23:13 +0800
committerBing Wen <[email protected]>2024-11-27 12:23:13 +0800
commit52ab015facf9f5039f89cd772d0f178ec70d878b (patch)
treed68ee2740a9e649c54826b123aef430d3023f51a
parent8eaa3c8fd3385d50bbf844c6fff0790884ac56af (diff)
Add new
-rw-r--r--embassy-stm32/src/fmt.rs19
-rw-r--r--embassy-stm32/src/rcc/c0.rs18
-rw-r--r--embassy-stm32/src/rcc/f013.rs29
-rw-r--r--embassy-stm32/src/rcc/f247.rs22
-rw-r--r--embassy-stm32/src/rcc/g0.rs33
-rw-r--r--embassy-stm32/src/rcc/g4.rs33
6 files changed, 66 insertions, 88 deletions
diff --git a/embassy-stm32/src/fmt.rs b/embassy-stm32/src/fmt.rs
index 8ca61bc39..660407569 100644
--- a/embassy-stm32/src/fmt.rs
+++ b/embassy-stm32/src/fmt.rs
@@ -7,6 +7,25 @@ use core::fmt::{Debug, Display, LowerHex};
7compile_error!("You may not enable both `defmt` and `log` features."); 7compile_error!("You may not enable both `defmt` and `log` features.");
8 8
9#[collapse_debuginfo(yes)] 9#[collapse_debuginfo(yes)]
10macro_rules! rcc_assert {
11 ($($x:tt)*) => {
12 {
13 if cfg!(feature = "unchecked-overclocking") {
14 #[cfg(not(feature = "defmt"))]
15 ::core::assert!($($x)*);
16 #[cfg(feature = "defmt")]
17 ::defmt::assert!($($x)*);
18 } else {
19 #[cfg(feature = "log")]
20 ::log::warn!("`rcc_assert!` skipped: `unchecked-overclocking` feature is enabled.");
21 #[cfg(feature = "defmt")]
22 ::defmt::warn!("`rcc_assert!` skipped: `unchecked-overclocking` feature is enabled.");
23 }
24 }
25 };
26}
27
28#[collapse_debuginfo(yes)]
10macro_rules! assert { 29macro_rules! assert {
11 ($($x:tt)*) => { 30 ($($x:tt)*) => {
12 { 31 {
diff --git a/embassy-stm32/src/rcc/c0.rs b/embassy-stm32/src/rcc/c0.rs
index c6ac46491..c989a3891 100644
--- a/embassy-stm32/src/rcc/c0.rs
+++ b/embassy-stm32/src/rcc/c0.rs
@@ -109,12 +109,9 @@ pub(crate) unsafe fn init(config: Config) {
109 None 109 None
110 } 110 }
111 Some(hse) => { 111 Some(hse) => {
112 #[cfg(not(feature = "unchecked-overclocking"))] 112 match hse.mode {
113 { 113 HseMode::Bypass => rcc_assert!(max::HSE_BYP.contains(&hse.freq)),
114 match hse.mode { 114 HseMode::Oscillator => rcc_assert!(max::HSE_OSC.contains(&hse.freq)),
115 HseMode::Bypass => assert!(max::HSE_BYP.contains(&hse.freq)),
116 HseMode::Oscillator => assert!(max::HSE_OSC.contains(&hse.freq)),
117 }
118 } 115 }
119 116
120 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator)); 117 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator));
@@ -129,17 +126,14 @@ pub(crate) unsafe fn init(config: Config) {
129 Sysclk::HSE => unwrap!(hse), 126 Sysclk::HSE => unwrap!(hse),
130 _ => unreachable!(), 127 _ => unreachable!(),
131 }; 128 };
132 #[cfg(not(feature = "unchecked-overclocking"))] 129 rcc_assert!(max::SYSCLK.contains(&sys));
133 assert!(max::SYSCLK.contains(&sys));
134 130
135 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency. 131 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency.
136 let hclk = sys / config.ahb_pre; 132 let hclk = sys / config.ahb_pre;
137 #[cfg(not(feature = "unchecked-overclocking"))] 133 rcc_assert!(max::HCLK.contains(&hclk));
138 assert!(max::HCLK.contains(&hclk));
139 134
140 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre); 135 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre);
141 #[cfg(not(feature = "unchecked-overclocking"))] 136 rcc_assert(max::PCLK.contains(&pclk1));
142 assert!(max::PCLK.contains(&pclk1));
143 137
144 let latency = match hclk.0 { 138 let latency = match hclk.0 {
145 ..=24_000_000 => Latency::WS0, 139 ..=24_000_000 => Latency::WS0,
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs
index 20a0f3940..cfe44ce54 100644
--- a/embassy-stm32/src/rcc/f013.rs
+++ b/embassy-stm32/src/rcc/f013.rs
@@ -157,12 +157,9 @@ pub(crate) unsafe fn init(config: Config) {
157 None 157 None
158 } 158 }
159 Some(hse) => { 159 Some(hse) => {
160 #[cfg(not(feature = "unchecked-overclocking"))] 160 match hse.mode {
161 { 161 HseMode::Bypass => rcc_assert!(max::HSE_BYP.contains(&hse.freq)),
162 match hse.mode { 162 HseMode::Oscillator => rcc_assert!(max::HSE_OSC.contains(&hse.freq)),
163 HseMode::Bypass => assert!(max::HSE_BYP.contains(&hse.freq)),
164 HseMode::Oscillator => assert!(max::HSE_OSC.contains(&hse.freq)),
165 }
166 } 163 }
167 164
168 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator)); 165 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator));
@@ -195,11 +192,9 @@ pub(crate) unsafe fn init(config: Config) {
195 PllSource::HSI48 => (Pllsrc::HSI48_DIV_PREDIV, unwrap!(hsi48)), 192 PllSource::HSI48 => (Pllsrc::HSI48_DIV_PREDIV, unwrap!(hsi48)),
196 }; 193 };
197 let in_freq = src_freq / pll.prediv; 194 let in_freq = src_freq / pll.prediv;
198 #[cfg(not(feature = "unchecked-overclocking"))] 195 rcc_assert!(max::PLL_IN.contains(&in_freq));
199 assert!(max::PLL_IN.contains(&in_freq));
200 #[cfg(not(feature = "unchecked-overclocking"))]
201 let out_freq = in_freq * pll.mul; 196 let out_freq = in_freq * pll.mul;
202 assert!(max::PLL_OUT.contains(&out_freq)); 197 rcc_assert!(max::PLL_OUT.contains(&out_freq));
203 198
204 #[cfg(not(stm32f1))] 199 #[cfg(not(stm32f1))]
205 RCC.cfgr2().modify(|w| w.set_prediv(pll.prediv)); 200 RCC.cfgr2().modify(|w| w.set_prediv(pll.prediv));
@@ -243,17 +238,15 @@ pub(crate) unsafe fn init(config: Config) {
243 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre); 238 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre);
244 #[cfg(stm32f0)] 239 #[cfg(stm32f0)]
245 let (pclk2, pclk2_tim) = (pclk1, pclk1_tim); 240 let (pclk2, pclk2_tim) = (pclk1, pclk1_tim);
246 #[cfg(not(feature = "unchecked-overclocking"))] 241 rcc_assert!(max::HCLK.contains(&hclk));
247 assert!(max::HCLK.contains(&hclk)); 242 rcc_assert!(max::PCLK1.contains(&pclk1));
248 #[cfg(not(feature = "unchecked-overclocking"))] 243 #[cfg(not(stm32f0))]
249 assert!(max::PCLK1.contains(&pclk1)); 244 rcc_assert!(max::PCLK2.contains(&pclk2));
250 #[cfg(all(not(feature = "unchecked-overclocking"), not(stm32f0)))]
251 assert!(max::PCLK2.contains(&pclk2));
252 245
253 #[cfg(stm32f1)] 246 #[cfg(stm32f1)]
254 let adc = pclk2 / config.adc_pre; 247 let adc = pclk2 / config.adc_pre;
255 #[cfg(all(not(feature = "unchecked-overclocking"), stm32f1))] 248 #[cfg(stm32f1)]
256 assert!(max::ADC.contains(&adc)); 249 rcc_assert!(max::ADC.contains(&adc));
257 250
258 // Set latency based on HCLK frquency 251 // Set latency based on HCLK frquency
259 #[cfg(stm32f0)] 252 #[cfg(stm32f0)]
diff --git a/embassy-stm32/src/rcc/f247.rs b/embassy-stm32/src/rcc/f247.rs
index 83d4428cc..3e7aff02d 100644
--- a/embassy-stm32/src/rcc/f247.rs
+++ b/embassy-stm32/src/rcc/f247.rs
@@ -169,12 +169,9 @@ pub(crate) unsafe fn init(config: Config) {
169 None 169 None
170 } 170 }
171 Some(hse) => { 171 Some(hse) => {
172 #[cfg(not(feature = "unchecked-overclocking"))] 172 match hse.mode {
173 { 173 HseMode::Bypass => rcc_assert!(max::HSE_BYP.contains(&hse.freq)),
174 match hse.mode { 174 HseMode::Oscillator => rcc_assert!(max::HSE_OSC.contains(&hse.freq)),
175 HseMode::Bypass => assert!(max::HSE_BYP.contains(&hse.freq)),
176 HseMode::Oscillator => assert!(max::HSE_OSC.contains(&hse.freq)),
177 }
178 } 175 }
179 176
180 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator)); 177 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator));
@@ -207,14 +204,11 @@ pub(crate) unsafe fn init(config: Config) {
207 let hclk = sys / config.ahb_pre; 204 let hclk = sys / config.ahb_pre;
208 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre); 205 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre);
209 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre); 206 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre);
210 #[cfg(not(feature = "unchecked-overclocking"))] 207
211 assert!(max::SYSCLK.contains(&sys)); 208 rcc_assert!(max::SYSCLK.contains(&sys));
212 #[cfg(not(feature = "unchecked-overclocking"))] 209 rcc_assert!(max::HCLK.contains(&hclk));
213 assert!(max::HCLK.contains(&hclk)); 210 rcc_assert!(max::PCLK1.contains(&pclk1));
214 #[cfg(not(feature = "unchecked-overclocking"))] 211 rcc_assert!(max::PCLK2.contains(&pclk2));
215 assert!(max::PCLK1.contains(&pclk1));
216 #[cfg(not(feature = "unchecked-overclocking"))]
217 assert!(max::PCLK2.contains(&pclk2));
218 212
219 let rtc = config.ls.init(); 213 let rtc = config.ls.init();
220 214
diff --git a/embassy-stm32/src/rcc/g0.rs b/embassy-stm32/src/rcc/g0.rs
index 9e1351eae..71e524a20 100644
--- a/embassy-stm32/src/rcc/g0.rs
+++ b/embassy-stm32/src/rcc/g0.rs
@@ -139,12 +139,9 @@ pub(crate) unsafe fn init(config: Config) {
139 None 139 None
140 } 140 }
141 Some(hse) => { 141 Some(hse) => {
142 #[cfg(not(feature = "unchecked-overclocking"))] 142 match hse.mode {
143 { 143 HseMode::Bypass => rcc_assert!(max::HSE_BYP.contains(&hse.freq)),
144 match hse.mode { 144 HseMode::Oscillator => rcc_assert!(max::HSE_OSC.contains(&hse.freq)),
145 HseMode::Bypass => assert!(max::HSE_BYP.contains(&hse.freq)),
146 HseMode::Oscillator => assert!(max::HSE_OSC.contains(&hse.freq)),
147 }
148 } 145 }
149 146
150 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator)); 147 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator));
@@ -172,11 +169,9 @@ pub(crate) unsafe fn init(config: Config) {
172 while RCC.cr().read().pllrdy() {} 169 while RCC.cr().read().pllrdy() {}
173 170
174 let in_freq = src_freq / pll_config.prediv; 171 let in_freq = src_freq / pll_config.prediv;
175 #[cfg(not(feature = "unchecked-overclocking"))] 172 rcc_assert!(max::PLL_IN.contains(&in_freq));
176 assert!(max::PLL_IN.contains(&in_freq));
177 let internal_freq = in_freq * pll_config.mul; 173 let internal_freq = in_freq * pll_config.mul;
178 #[cfg(not(feature = "unchecked-overclocking"))] 174 rcc_assert!(max::PLL_VCO.contains(&internal_freq));
179 assert!(max::PLL_VCO.contains(&internal_freq));
180 175
181 RCC.pllcfgr().write(|w| { 176 RCC.pllcfgr().write(|w| {
182 w.set_plln(pll_config.mul); 177 w.set_plln(pll_config.mul);
@@ -190,8 +185,7 @@ pub(crate) unsafe fn init(config: Config) {
190 w.set_pllpen(true); 185 w.set_pllpen(true);
191 }); 186 });
192 let freq = internal_freq / div_p; 187 let freq = internal_freq / div_p;
193 #[cfg(not(feature = "unchecked-overclocking"))] 188 rcc_assert!(max::PLL_P.contains(&freq));
194 assert!(max::PLL_P.contains(&freq));
195 freq 189 freq
196 }); 190 });
197 191
@@ -201,8 +195,7 @@ pub(crate) unsafe fn init(config: Config) {
201 w.set_pllqen(true); 195 w.set_pllqen(true);
202 }); 196 });
203 let freq = internal_freq / div_q; 197 let freq = internal_freq / div_q;
204 #[cfg(not(feature = "unchecked-overclocking"))] 198 rcc_assert!(max::PLL_Q.contains(&freq));
205 assert!(max::PLL_Q.contains(&freq));
206 freq 199 freq
207 }); 200 });
208 201
@@ -212,8 +205,7 @@ pub(crate) unsafe fn init(config: Config) {
212 w.set_pllren(true); 205 w.set_pllren(true);
213 }); 206 });
214 let freq = internal_freq / div_r; 207 let freq = internal_freq / div_r;
215 #[cfg(not(feature = "unchecked-overclocking"))] 208 rcc_assert!(max::PLL_R.contains(&freq));
216 assert!(max::PLL_R.contains(&freq));
217 freq 209 freq
218 }); 210 });
219 211
@@ -235,17 +227,14 @@ pub(crate) unsafe fn init(config: Config) {
235 Sysclk::PLL1_R => unwrap!(pll.pll_r), 227 Sysclk::PLL1_R => unwrap!(pll.pll_r),
236 _ => unreachable!(), 228 _ => unreachable!(),
237 }; 229 };
238 #[cfg(not(feature = "unchecked-overclocking"))] 230 rcc_assert!(max::SYSCLK.contains(&sys));
239 assert!(max::SYSCLK.contains(&sys));
240 231
241 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency. 232 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency.
242 let hclk = sys / config.ahb_pre; 233 let hclk = sys / config.ahb_pre;
243 #[cfg(not(feature = "unchecked-overclocking"))] 234 rcc_assert!(max::HCLK.contains(&hclk));
244 assert!(max::HCLK.contains(&hclk));
245 235
246 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre); 236 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre);
247 #[cfg(not(feature = "unchecked-overclocking"))] 237 rcc_assert!(max::PCLK.contains(&pclk1));
248 assert!(max::PCLK.contains(&pclk1));
249 238
250 let latency = match (config.voltage_range, hclk.0) { 239 let latency = match (config.voltage_range, hclk.0) {
251 (VoltageRange::RANGE1, ..=24_000_000) => Latency::WS0, 240 (VoltageRange::RANGE1, ..=24_000_000) => Latency::WS0,
diff --git a/embassy-stm32/src/rcc/g4.rs b/embassy-stm32/src/rcc/g4.rs
index 09b2a8de8..e09b2915e 100644
--- a/embassy-stm32/src/rcc/g4.rs
+++ b/embassy-stm32/src/rcc/g4.rs
@@ -140,12 +140,9 @@ pub(crate) unsafe fn init(config: Config) {
140 None 140 None
141 } 141 }
142 Some(hse) => { 142 Some(hse) => {
143 #[cfg(not(feature = "unchecked-overclocking"))] 143 match hse.mode {
144 { 144 HseMode::Bypass => rcc_assert!(max::HSE_BYP.contains(&hse.freq)),
145 match hse.mode { 145 HseMode::Oscillator => rcc_assert!(max::HSE_OSC.contains(&hse.freq)),
146 HseMode::Bypass => assert!(max::HSE_BYP.contains(&hse.freq)),
147 HseMode::Oscillator => assert!(max::HSE_OSC.contains(&hse.freq)),
148 }
149 } 146 }
150 147
151 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator)); 148 RCC.cr().modify(|w| w.set_hsebyp(hse.mode != HseMode::Oscillator));
@@ -172,12 +169,10 @@ pub(crate) unsafe fn init(config: Config) {
172 while RCC.cr().read().pllrdy() {} 169 while RCC.cr().read().pllrdy() {}
173 170
174 let in_freq = src_freq / pll_config.prediv; 171 let in_freq = src_freq / pll_config.prediv;
175 #[cfg(not(feature = "unchecked-overclocking"))] 172 rcc_assert!(max::PLL_IN.contains(&in_freq));
176 assert!(max::PLL_IN.contains(&in_freq));
177 let internal_freq = in_freq * pll_config.mul; 173 let internal_freq = in_freq * pll_config.mul;
178 174
179 #[cfg(not(feature = "unchecked-overclocking"))] 175 rcc_assert!(max::PLL_VCO.contains(&internal_freq));
180 assert!(max::PLL_VCO.contains(&internal_freq));
181 176
182 RCC.pllcfgr().write(|w| { 177 RCC.pllcfgr().write(|w| {
183 w.set_plln(pll_config.mul); 178 w.set_plln(pll_config.mul);
@@ -191,8 +186,7 @@ pub(crate) unsafe fn init(config: Config) {
191 w.set_pllpen(true); 186 w.set_pllpen(true);
192 }); 187 });
193 let freq = internal_freq / div_p; 188 let freq = internal_freq / div_p;
194 #[cfg(not(feature = "unchecked-overclocking"))] 189 rcc_assert!(max::PLL_P.contains(&freq));
195 assert!(max::PLL_P.contains(&freq));
196 freq 190 freq
197 }); 191 });
198 192
@@ -202,8 +196,7 @@ pub(crate) unsafe fn init(config: Config) {
202 w.set_pllqen(true); 196 w.set_pllqen(true);
203 }); 197 });
204 let freq = internal_freq / div_q; 198 let freq = internal_freq / div_q;
205 #[cfg(not(feature = "unchecked-overclocking"))] 199 rcc_assert!(max::PLL_Q.contains(&freq));
206 assert!(max::PLL_Q.contains(&freq));
207 freq 200 freq
208 }); 201 });
209 202
@@ -213,8 +206,7 @@ pub(crate) unsafe fn init(config: Config) {
213 w.set_pllren(true); 206 w.set_pllren(true);
214 }); 207 });
215 let freq = internal_freq / div_r; 208 let freq = internal_freq / div_r;
216 #[cfg(not(feature = "unchecked-overclocking"))] 209 rcc_assert!(max::PLL_R.contains(&freq));
217 assert!(max::PLL_R.contains(&freq));
218 freq 210 freq
219 }); 211 });
220 212
@@ -237,18 +229,15 @@ pub(crate) unsafe fn init(config: Config) {
237 _ => unreachable!(), 229 _ => unreachable!(),
238 }; 230 };
239 231
240 #[cfg(not(feature = "unchecked-overclocking"))] 232 rcc_assert!(max::SYSCLK.contains(&sys));
241 assert!(max::SYSCLK.contains(&sys));
242 233
243 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency. 234 // Calculate the AHB frequency (HCLK), among other things so we can calculate the correct flash read latency.
244 let hclk = sys / config.ahb_pre; 235 let hclk = sys / config.ahb_pre;
245 #[cfg(not(feature = "unchecked-overclocking"))] 236 rcc_assert!(max::HCLK.contains(&hclk));
246 assert!(max::HCLK.contains(&hclk));
247 237
248 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre); 238 let (pclk1, pclk1_tim) = super::util::calc_pclk(hclk, config.apb1_pre);
249 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre); 239 let (pclk2, pclk2_tim) = super::util::calc_pclk(hclk, config.apb2_pre);
250 #[cfg(not(feature = "unchecked-overclocking"))] 240 rcc_assert!(max::PCLK.contains(&pclk2));
251 assert!(max::PCLK.contains(&pclk2));
252 241
253 // Configure Core Boost mode ([RM0440] p234 – inverted because setting r1mode to 0 enables boost mode!) 242 // Configure Core Boost mode ([RM0440] p234 – inverted because setting r1mode to 0 enables boost mode!)
254 if config.boost { 243 if config.boost {