aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios/os/hal/ports/STM32/STM32F1xx/hal_lld_f100.h
diff options
context:
space:
mode:
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.h575
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/** @} */