diff options
Diffstat (limited to 'lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h')
-rw-r--r-- | lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h | 575 |
1 files changed, 575 insertions, 0 deletions
diff --git a/lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h b/lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h new file mode 100644 index 000000000..725a09870 --- /dev/null +++ b/lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h | |||
@@ -0,0 +1,575 @@ | |||
1 | /* | ||
2 | ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio | ||
3 | |||
4 | Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | you may not use this file except in compliance with the License. | ||
6 | You may obtain a copy of the License at | ||
7 | |||
8 | http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | |||
10 | Unless required by applicable law or agreed to in writing, software | ||
11 | distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | See the License for the specific language governing permissions and | ||
14 | limitations under the License. | ||
15 | */ | ||
16 | |||
17 | /** | ||
18 | * @defgroup STM32F100_HAL STM32F100 HAL Support | ||
19 | * @details HAL support for STM32 Value Line LD, MD and HD sub-families. | ||
20 | * | ||
21 | * @ingroup HAL | ||
22 | */ | ||
23 | |||
24 | /** | ||
25 | * @file STM32F1xx/hal_lld_f100.h | ||
26 | * @brief STM32F100 Value Line HAL subsystem low level driver header. | ||
27 | * | ||
28 | * @addtogroup STM32F100_HAL | ||
29 | * @{ | ||
30 | */ | ||
31 | |||
32 | #ifndef _HAL_LLD_F100_H_ | ||
33 | #define _HAL_LLD_F100_H_ | ||
34 | |||
35 | /*===========================================================================*/ | ||
36 | /* Driver constants. */ | ||
37 | /*===========================================================================*/ | ||
38 | |||
39 | /** | ||
40 | * @name Absolute Maximum Ratings | ||
41 | * @{ | ||
42 | */ | ||
43 | /** | ||
44 | * @brief Maximum system clock frequency. | ||
45 | */ | ||
46 | #define STM32_SYSCLK_MAX 24000000 | ||
47 | |||
48 | /** | ||
49 | * @brief Maximum HSE clock frequency. | ||
50 | */ | ||
51 | #define STM32_HSECLK_MAX 24000000 | ||
52 | |||
53 | /** | ||
54 | * @brief Minimum HSE clock frequency. | ||
55 | */ | ||
56 | #define STM32_HSECLK_MIN 1000000 | ||
57 | |||
58 | /** | ||
59 | * @brief Maximum LSE clock frequency. | ||
60 | */ | ||
61 | #define STM32_LSECLK_MAX 1000000 | ||
62 | |||
63 | /** | ||
64 | * @brief Minimum LSE clock frequency. | ||
65 | */ | ||
66 | #define STM32_LSECLK_MIN 32768 | ||
67 | |||
68 | /** | ||
69 | * @brief Maximum PLLs input clock frequency. | ||
70 | */ | ||
71 | #define STM32_PLLIN_MAX 24000000 | ||
72 | |||
73 | /** | ||
74 | * @brief Minimum PLLs input clock frequency. | ||
75 | */ | ||
76 | #define STM32_PLLIN_MIN 1000000 | ||
77 | |||
78 | /** | ||
79 | * @brief Maximum PLL output clock frequency. | ||
80 | */ | ||
81 | #define STM32_PLLOUT_MAX 24000000 | ||
82 | |||
83 | /** | ||
84 | * @brief Minimum PLL output clock frequency. | ||
85 | */ | ||
86 | #define STM32_PLLOUT_MIN 16000000 | ||
87 | |||
88 | /** | ||
89 | * @brief Maximum APB1 clock frequency. | ||
90 | */ | ||
91 | #define STM32_PCLK1_MAX 24000000 | ||
92 | |||
93 | /** | ||
94 | * @brief Maximum APB2 clock frequency. | ||
95 | */ | ||
96 | #define STM32_PCLK2_MAX 24000000 | ||
97 | |||
98 | /** | ||
99 | * @brief Maximum ADC clock frequency. | ||
100 | */ | ||
101 | #define STM32_ADCCLK_MAX 12000000 | ||
102 | /** @} */ | ||
103 | |||
104 | /** | ||
105 | * @name RCC_CFGR register bits definitions | ||
106 | * @{ | ||
107 | */ | ||
108 | #define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ | ||
109 | #define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ | ||
110 | #define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ | ||
111 | |||
112 | #define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ | ||
113 | #define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ | ||
114 | #define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ | ||
115 | #define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ | ||
116 | #define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ | ||
117 | #define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ | ||
118 | #define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ | ||
119 | #define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ | ||
120 | #define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ | ||
121 | |||
122 | #define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ | ||
123 | #define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ | ||
124 | #define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ | ||
125 | #define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ | ||
126 | #define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ | ||
127 | |||
128 | #define STM32_PPRE2_DIV1 (0 << 11) /**< HCLK divided by 1. */ | ||
129 | #define STM32_PPRE2_DIV2 (4 << 11) /**< HCLK divided by 2. */ | ||
130 | #define STM32_PPRE2_DIV4 (5 << 11) /**< HCLK divided by 4. */ | ||
131 | #define STM32_PPRE2_DIV8 (6 << 11) /**< HCLK divided by 8. */ | ||
132 | #define STM32_PPRE2_DIV16 (7 << 11) /**< HCLK divided by 16. */ | ||
133 | |||
134 | #define STM32_ADCPRE_DIV2 (0 << 14) /**< PPRE2 divided by 2. */ | ||
135 | #define STM32_ADCPRE_DIV4 (1 << 14) /**< PPRE2 divided by 4. */ | ||
136 | #define STM32_ADCPRE_DIV6 (2 << 14) /**< PPRE2 divided by 6. */ | ||
137 | #define STM32_ADCPRE_DIV8 (3 << 14) /**< PPRE2 divided by 8. */ | ||
138 | |||
139 | #define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ | ||
140 | #define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is HSE. */ | ||
141 | |||
142 | #define STM32_PLLXTPRE_DIV1 (0 << 17) /**< HSE divided by 1. */ | ||
143 | #define STM32_PLLXTPRE_DIV2 (1 << 17) /**< HSE divided by 2. */ | ||
144 | |||
145 | #define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ | ||
146 | #define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ | ||
147 | #define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ | ||
148 | #define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ | ||
149 | #define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ | ||
150 | /** @} */ | ||
151 | |||
152 | /** | ||
153 | * @name RCC_BDCR register bits definitions | ||
154 | * @{ | ||
155 | */ | ||
156 | #define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ | ||
157 | #define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ | ||
158 | #define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ | ||
159 | #define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ | ||
160 | #define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 128 used as | ||
161 | RTC clock. */ | ||
162 | /** @} */ | ||
163 | |||
164 | /*===========================================================================*/ | ||
165 | /* Driver pre-compile time settings. */ | ||
166 | /*===========================================================================*/ | ||
167 | |||
168 | /** | ||
169 | * @name Configuration options | ||
170 | * @{ | ||
171 | */ | ||
172 | /** | ||
173 | * @brief Main clock source selection. | ||
174 | * @note If the selected clock source is not the PLL then the PLL is not | ||
175 | * initialized and started. | ||
176 | * @note The default value is calculated for a 72MHz system clock from | ||
177 | * a 8MHz crystal using the PLL. | ||
178 | */ | ||
179 | #if !defined(STM32_SW) || defined(__DOXYGEN__) | ||
180 | #define STM32_SW STM32_SW_PLL | ||
181 | #endif | ||
182 | |||
183 | /** | ||
184 | * @brief Clock source for the PLL. | ||
185 | * @note This setting has only effect if the PLL is selected as the | ||
186 | * system clock source. | ||
187 | * @note The default value is calculated for a 72MHz system clock from | ||
188 | * a 8MHz crystal using the PLL. | ||
189 | */ | ||
190 | #if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) | ||
191 | #define STM32_PLLSRC STM32_PLLSRC_HSE | ||
192 | #endif | ||
193 | |||
194 | /** | ||
195 | * @brief Crystal PLL pre-divider. | ||
196 | * @note This setting has only effect if the PLL is selected as the | ||
197 | * system clock source. | ||
198 | * @note The default value is calculated for a 72MHz system clock from | ||
199 | * a 8MHz crystal using the PLL. | ||
200 | */ | ||
201 | #if !defined(STM32_PLLXTPRE) || defined(__DOXYGEN__) | ||
202 | #define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 | ||
203 | #endif | ||
204 | |||
205 | /** | ||
206 | * @brief PLL multiplier value. | ||
207 | * @note The allowed range is 2...16. | ||
208 | * @note The default value is calculated for a 24MHz system clock from | ||
209 | * a 8MHz crystal using the PLL. | ||
210 | */ | ||
211 | #if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) | ||
212 | #define STM32_PLLMUL_VALUE 3 | ||
213 | #endif | ||
214 | |||
215 | /** | ||
216 | * @brief AHB prescaler value. | ||
217 | * @note The default value is calculated for a 24MHz system clock from | ||
218 | * a 8MHz crystal using the PLL. | ||
219 | */ | ||
220 | #if !defined(STM32_HPRE) || defined(__DOXYGEN__) | ||
221 | #define STM32_HPRE STM32_HPRE_DIV1 | ||
222 | #endif | ||
223 | |||
224 | /** | ||
225 | * @brief APB1 prescaler value. | ||
226 | */ | ||
227 | #if !defined(STM32_PPRE1) || defined(__DOXYGEN__) | ||
228 | #define STM32_PPRE1 STM32_PPRE1_DIV1 | ||
229 | #endif | ||
230 | |||
231 | /** | ||
232 | * @brief APB2 prescaler value. | ||
233 | */ | ||
234 | #if !defined(STM32_PPRE2) || defined(__DOXYGEN__) | ||
235 | #define STM32_PPRE2 STM32_PPRE2_DIV1 | ||
236 | #endif | ||
237 | |||
238 | /** | ||
239 | * @brief ADC prescaler value. | ||
240 | */ | ||
241 | #if !defined(STM32_ADCPRE) || defined(__DOXYGEN__) | ||
242 | #define STM32_ADCPRE STM32_ADCPRE_DIV2 | ||
243 | #endif | ||
244 | |||
245 | /** | ||
246 | * @brief MCO pin setting. | ||
247 | */ | ||
248 | #if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) | ||
249 | #define STM32_MCOSEL STM32_MCOSEL_NOCLOCK | ||
250 | #endif | ||
251 | |||
252 | /** | ||
253 | * @brief RTC clock source. | ||
254 | */ | ||
255 | #if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) | ||
256 | #define STM32_RTCSEL STM32_RTCSEL_LSI | ||
257 | #endif | ||
258 | /** @} */ | ||
259 | |||
260 | /*===========================================================================*/ | ||
261 | /* Derived constants and error checks. */ | ||
262 | /*===========================================================================*/ | ||
263 | |||
264 | /* | ||
265 | * Configuration-related checks. | ||
266 | */ | ||
267 | #if !defined(STM32F100_MCUCONF) | ||
268 | #error "Using a wrong mcuconf.h file, STM32F100_MCUCONF not defined" | ||
269 | #endif | ||
270 | |||
271 | /* | ||
272 | * HSI related checks. | ||
273 | */ | ||
274 | #if STM32_HSI_ENABLED | ||
275 | #else /* !STM32_HSI_ENABLED */ | ||
276 | |||
277 | #if STM32_SW == STM32_SW_HSI | ||
278 | #error "HSI not enabled, required by STM32_SW" | ||
279 | #endif | ||
280 | |||
281 | #if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) | ||
282 | #error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" | ||
283 | #endif | ||
284 | |||
285 | #if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ | ||
286 | ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ | ||
287 | (STM32_PLLSRC == STM32_PLLSRC_HSI)) | ||
288 | #error "HSI not enabled, required by STM32_MCOSEL" | ||
289 | #endif | ||
290 | |||
291 | #endif /* !STM32_HSI_ENABLED */ | ||
292 | |||
293 | /* | ||
294 | * HSE related checks. | ||
295 | */ | ||
296 | #if STM32_HSE_ENABLED | ||
297 | |||
298 | #if STM32_HSECLK == 0 | ||
299 | #error "HSE frequency not defined" | ||
300 | #elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) | ||
301 | #error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" | ||
302 | #endif | ||
303 | |||
304 | #else /* !STM32_HSE_ENABLED */ | ||
305 | |||
306 | #if STM32_SW == STM32_SW_HSE | ||
307 | #error "HSE not enabled, required by STM32_SW" | ||
308 | #endif | ||
309 | |||
310 | #if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) | ||
311 | #error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" | ||
312 | #endif | ||
313 | |||
314 | #if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ | ||
315 | ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ | ||
316 | (STM32_PLLSRC == STM32_PLLSRC_HSE)) | ||
317 | #error "HSE not enabled, required by STM32_MCOSEL" | ||
318 | #endif | ||
319 | |||
320 | #if STM32_RTCSEL == STM32_RTCSEL_HSEDIV | ||
321 | #error "HSE not enabled, required by STM32_RTCSELSEL" | ||
322 | #endif | ||
323 | |||
324 | #endif /* !STM32_HSE_ENABLED */ | ||
325 | |||
326 | /* | ||
327 | * LSI related checks. | ||
328 | */ | ||
329 | #if STM32_LSI_ENABLED | ||
330 | #else /* !STM32_LSI_ENABLED */ | ||
331 | |||
332 | #if HAL_USE_RTC && (STM32_RTCSEL == STM32_RTCSEL_LSI) | ||
333 | #error "LSI not enabled, required by STM32_RTCSEL" | ||
334 | #endif | ||
335 | |||
336 | #endif /* !STM32_LSI_ENABLED */ | ||
337 | |||
338 | /* | ||
339 | * LSE related checks. | ||
340 | */ | ||
341 | #if STM32_LSE_ENABLED | ||
342 | |||
343 | #if (STM32_LSECLK == 0) | ||
344 | #error "LSE frequency not defined" | ||
345 | #endif | ||
346 | |||
347 | #if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) | ||
348 | #error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" | ||
349 | #endif | ||
350 | |||
351 | #else /* !STM32_LSE_ENABLED */ | ||
352 | |||
353 | #if STM32_RTCSEL == STM32_RTCSEL_LSE | ||
354 | #error "LSE not enabled, required by STM32_RTCSEL" | ||
355 | #endif | ||
356 | |||
357 | #endif /* !STM32_LSE_ENABLED */ | ||
358 | |||
359 | /* PLL activation conditions.*/ | ||
360 | #if (STM32_SW == STM32_SW_PLL) || \ | ||
361 | (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ | ||
362 | defined(__DOXYGEN__) | ||
363 | /** | ||
364 | * @brief PLL activation flag. | ||
365 | */ | ||
366 | #define STM32_ACTIVATE_PLL TRUE | ||
367 | #else | ||
368 | #define STM32_ACTIVATE_PLL FALSE | ||
369 | #endif | ||
370 | |||
371 | /* HSE prescaler setting check.*/ | ||
372 | #if (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV1) && \ | ||
373 | (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV2) | ||
374 | #error "invalid STM32_PLLXTPRE value specified" | ||
375 | #endif | ||
376 | |||
377 | /** | ||
378 | * @brief PLLMUL field. | ||
379 | */ | ||
380 | #if ((STM32_PLLMUL_VALUE >= 2) && (STM32_PLLMUL_VALUE <= 16)) || \ | ||
381 | defined(__DOXYGEN__) | ||
382 | #define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) | ||
383 | #else | ||
384 | #error "invalid STM32_PLLMUL_VALUE value specified" | ||
385 | #endif | ||
386 | |||
387 | /** | ||
388 | * @brief PLL input clock frequency. | ||
389 | */ | ||
390 | #if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) | ||
391 | #if STM32_PLLXTPRE == STM32_PLLXTPRE_DIV1 | ||
392 | #define STM32_PLLCLKIN (STM32_HSECLK / 1) | ||
393 | #else | ||
394 | #define STM32_PLLCLKIN (STM32_HSECLK / 2) | ||
395 | #endif | ||
396 | #elif STM32_PLLSRC == STM32_PLLSRC_HSI | ||
397 | #define STM32_PLLCLKIN (STM32_HSICLK / 2) | ||
398 | #else | ||
399 | #error "invalid STM32_PLLSRC value specified" | ||
400 | #endif | ||
401 | |||
402 | /* PLL input frequency range check.*/ | ||
403 | #if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) | ||
404 | #error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" | ||
405 | #endif | ||
406 | |||
407 | /** | ||
408 | * @brief PLL output clock frequency. | ||
409 | */ | ||
410 | #define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) | ||
411 | |||
412 | /* PLL output frequency range check.*/ | ||
413 | #if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) | ||
414 | #error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" | ||
415 | #endif | ||
416 | |||
417 | /** | ||
418 | * @brief System clock source. | ||
419 | */ | ||
420 | #if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) | ||
421 | #define STM32_SYSCLK STM32_PLLCLKOUT | ||
422 | #elif (STM32_SW == STM32_SW_HSI) | ||
423 | #define STM32_SYSCLK STM32_HSICLK | ||
424 | #elif (STM32_SW == STM32_SW_HSE) | ||
425 | #define STM32_SYSCLK STM32_HSECLK | ||
426 | #else | ||
427 | #error "invalid STM32_SW value specified" | ||
428 | #endif | ||
429 | |||
430 | /* Check on the system clock.*/ | ||
431 | #if STM32_SYSCLK > STM32_SYSCLK_MAX | ||
432 | #error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" | ||
433 | #endif | ||
434 | |||
435 | /** | ||
436 | * @brief AHB frequency. | ||
437 | */ | ||
438 | #if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) | ||
439 | #define STM32_HCLK (STM32_SYSCLK / 1) | ||
440 | #elif STM32_HPRE == STM32_HPRE_DIV2 | ||
441 | #define STM32_HCLK (STM32_SYSCLK / 2) | ||
442 | #elif STM32_HPRE == STM32_HPRE_DIV4 | ||
443 | #define STM32_HCLK (STM32_SYSCLK / 4) | ||
444 | #elif STM32_HPRE == STM32_HPRE_DIV8 | ||
445 | #define STM32_HCLK (STM32_SYSCLK / 8) | ||
446 | #elif STM32_HPRE == STM32_HPRE_DIV16 | ||
447 | #define STM32_HCLK (STM32_SYSCLK / 16) | ||
448 | #elif STM32_HPRE == STM32_HPRE_DIV64 | ||
449 | #define STM32_HCLK (STM32_SYSCLK / 64) | ||
450 | #elif STM32_HPRE == STM32_HPRE_DIV128 | ||
451 | #define STM32_HCLK (STM32_SYSCLK / 128) | ||
452 | #elif STM32_HPRE == STM32_HPRE_DIV256 | ||
453 | #define STM32_HCLK (STM32_SYSCLK / 256) | ||
454 | #elif STM32_HPRE == STM32_HPRE_DIV512 | ||
455 | #define STM32_HCLK (STM32_SYSCLK / 512) | ||
456 | #else | ||
457 | #error "invalid STM32_HPRE value specified" | ||
458 | #endif | ||
459 | |||
460 | /* AHB frequency check.*/ | ||
461 | #if STM32_HCLK > STM32_SYSCLK_MAX | ||
462 | #error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" | ||
463 | #endif | ||
464 | |||
465 | /** | ||
466 | * @brief APB1 frequency. | ||
467 | */ | ||
468 | #if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) | ||
469 | #define STM32_PCLK1 (STM32_HCLK / 1) | ||
470 | #elif STM32_PPRE1 == STM32_PPRE1_DIV2 | ||
471 | #define STM32_PCLK1 (STM32_HCLK / 2) | ||
472 | #elif STM32_PPRE1 == STM32_PPRE1_DIV4 | ||
473 | #define STM32_PCLK1 (STM32_HCLK / 4) | ||
474 | #elif STM32_PPRE1 == STM32_PPRE1_DIV8 | ||
475 | #define STM32_PCLK1 (STM32_HCLK / 8) | ||
476 | #elif STM32_PPRE1 == STM32_PPRE1_DIV16 | ||
477 | #define STM32_PCLK1 (STM32_HCLK / 16) | ||
478 | #else | ||
479 | #error "invalid STM32_PPRE1 value specified" | ||
480 | #endif | ||
481 | |||
482 | /* APB1 frequency check.*/ | ||
483 | #if STM32_PCLK1 > STM32_PCLK1_MAX | ||
484 | #error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" | ||
485 | #endif | ||
486 | |||
487 | /** | ||
488 | * @brief APB2 frequency. | ||
489 | */ | ||
490 | #if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) | ||
491 | #define STM32_PCLK2 (STM32_HCLK / 1) | ||
492 | #elif STM32_PPRE2 == STM32_PPRE2_DIV2 | ||
493 | #define STM32_PCLK2 (STM32_HCLK / 2) | ||
494 | #elif STM32_PPRE2 == STM32_PPRE2_DIV4 | ||
495 | #define STM32_PCLK2 (STM32_HCLK / 4) | ||
496 | #elif STM32_PPRE2 == STM32_PPRE2_DIV8 | ||
497 | #define STM32_PCLK2 (STM32_HCLK / 8) | ||
498 | #elif STM32_PPRE2 == STM32_PPRE2_DIV16 | ||
499 | #define STM32_PCLK2 (STM32_HCLK / 16) | ||
500 | #else | ||
501 | #error "invalid STM32_PPRE2 value specified" | ||
502 | #endif | ||
503 | |||
504 | /* APB2 frequency check.*/ | ||
505 | #if STM32_PCLK2 > STM32_PCLK2_MAX | ||
506 | #error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" | ||
507 | #endif | ||
508 | |||
509 | /** | ||
510 | * @brief RTC clock. | ||
511 | */ | ||
512 | #if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) | ||
513 | #define STM32_RTCCLK STM32_LSECLK | ||
514 | #elif STM32_RTCSEL == STM32_RTCSEL_LSI | ||
515 | #define STM32_RTCCLK STM32_LSICLK | ||
516 | #elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV | ||
517 | #define STM32_RTCCLK (STM32_HSECLK / 128) | ||
518 | #elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK | ||
519 | #define STM32_RTCCLK 0 | ||
520 | #else | ||
521 | #error "invalid source selected for RTC clock" | ||
522 | #endif | ||
523 | |||
524 | /** | ||
525 | * @brief ADC frequency. | ||
526 | */ | ||
527 | #if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) | ||
528 | #define STM32_ADCCLK (STM32_PCLK2 / 2) | ||
529 | #elif STM32_ADCPRE == STM32_ADCPRE_DIV4 | ||
530 | #define STM32_ADCCLK (STM32_PCLK2 / 4) | ||
531 | #elif STM32_ADCPRE == STM32_ADCPRE_DIV6 | ||
532 | #define STM32_ADCCLK (STM32_PCLK2 / 6) | ||
533 | #elif STM32_ADCPRE == STM32_ADCPRE_DIV8 | ||
534 | #define STM32_ADCCLK (STM32_PCLK2 / 8) | ||
535 | #else | ||
536 | #error "invalid STM32_ADCPRE value specified" | ||
537 | #endif | ||
538 | |||
539 | /* ADC frequency check.*/ | ||
540 | #if STM32_ADCCLK > STM32_ADCCLK_MAX | ||
541 | #error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" | ||
542 | #endif | ||
543 | |||
544 | /** | ||
545 | * @brief Timers 2, 3, 4, 5, 6, 7, 12, 13, 14 clock. | ||
546 | */ | ||
547 | #if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) | ||
548 | #define STM32_TIMCLK1 (STM32_PCLK1 * 1) | ||
549 | #else | ||
550 | #define STM32_TIMCLK1 (STM32_PCLK1 * 2) | ||
551 | #endif | ||
552 | |||
553 | /** | ||
554 | * @brief Timers 1, 8, 9, 10, 11 clock. | ||
555 | */ | ||
556 | #if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) | ||
557 | #define STM32_TIMCLK2 (STM32_PCLK2 * 1) | ||
558 | #else | ||
559 | #define STM32_TIMCLK2 (STM32_PCLK2 * 2) | ||
560 | #endif | ||
561 | |||
562 | /** | ||
563 | * @brief Flash settings. | ||
564 | */ | ||
565 | #if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) | ||
566 | #define STM32_FLASHBITS 0x00000010 | ||
567 | #elif STM32_HCLK <= 48000000 | ||
568 | #define STM32_FLASHBITS 0x00000011 | ||
569 | #else | ||
570 | #define STM32_FLASHBITS 0x00000012 | ||
571 | #endif | ||
572 | |||
573 | #endif /* _HAL_LLD_F100_H_ */ | ||
574 | |||
575 | /** @} */ | ||