diff options
Diffstat (limited to 'lib/chibios/os/hal/ports/STM32/STM32G4xx/hal_lld.h')
-rw-r--r-- | lib/chibios/os/hal/ports/STM32/STM32G4xx/hal_lld.h | 1985 |
1 files changed, 1985 insertions, 0 deletions
diff --git a/lib/chibios/os/hal/ports/STM32/STM32G4xx/hal_lld.h b/lib/chibios/os/hal/ports/STM32/STM32G4xx/hal_lld.h new file mode 100644 index 000000000..3954096a9 --- /dev/null +++ b/lib/chibios/os/hal/ports/STM32/STM32G4xx/hal_lld.h | |||
@@ -0,0 +1,1985 @@ | |||
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 | * @file STM32G4xx/hal_lld.h | ||
19 | * @brief STM32G4xx HAL subsystem low level driver header. | ||
20 | * @pre This module requires the following macros to be defined in the | ||
21 | * @p board.h file: | ||
22 | * - STM32_LSECLK. | ||
23 | * - STM32_LSEDRV. | ||
24 | * - STM32_LSE_BYPASS (optionally). | ||
25 | * - STM32_HSECLK. | ||
26 | * - STM32_HSE_BYPASS (optionally). | ||
27 | * . | ||
28 | * One of the following macros must also be defined: | ||
29 | * - STM32G431xx, STM32G441xx, STM32G471xx. | ||
30 | * - STM32G473xx, STM32G483xx. | ||
31 | * - STM32G474xx, STM32G484xx. | ||
32 | * - STM32GBK1CB. | ||
33 | * . | ||
34 | * | ||
35 | * @addtogroup HAL | ||
36 | * @{ | ||
37 | */ | ||
38 | |||
39 | #ifndef HAL_LLD_H | ||
40 | #define HAL_LLD_H | ||
41 | |||
42 | #include "stm32_registry.h" | ||
43 | |||
44 | /*===========================================================================*/ | ||
45 | /* Driver constants. */ | ||
46 | /*===========================================================================*/ | ||
47 | |||
48 | /** | ||
49 | * @name Platform identification | ||
50 | * @{ | ||
51 | */ | ||
52 | #if defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \ | ||
53 | defined(__DOXYGEN__) | ||
54 | #define PLATFORM_NAME "STM32G4 Access Line" | ||
55 | |||
56 | #elif defined(STM32G473xx) | ||
57 | #define PLATFORM_NAME "STM32G4 Performance Line" | ||
58 | |||
59 | #elif defined(STM32G483xx) | ||
60 | #define PLATFORM_NAME "STM32G4 Performance Line with Crypto" | ||
61 | |||
62 | #elif defined(STM32G474xx) | ||
63 | #define PLATFORM_NAME "STM32G4 Hi-resolution Line" | ||
64 | |||
65 | #elif defined(STM32G484xx) | ||
66 | #define PLATFORM_NAME "STM32G4 Hi-resolution Line with Crypto" | ||
67 | |||
68 | #elif defined(STM32GBK1CB) | ||
69 | #define PLATFORM_NAME "STM32G4 Mystery Line" | ||
70 | |||
71 | #else | ||
72 | #error "STM32G4 device not specified" | ||
73 | #endif | ||
74 | |||
75 | /** | ||
76 | * @brief Sub-family identifier. | ||
77 | */ | ||
78 | #if !defined(STM32G4XX) || defined(__DOXYGEN__) | ||
79 | #define STM32G4XX | ||
80 | #endif | ||
81 | /** @} */ | ||
82 | |||
83 | /** | ||
84 | * @name Internal clock sources | ||
85 | * @{ | ||
86 | */ | ||
87 | #define STM32_HSI16CLK 16000000U /**< 16MHz internal clock. */ | ||
88 | #define STM32_HSI48CLK 48000000U /**< 48MHz internal clock. */ | ||
89 | #define STM32_LSICLK 32000U /**< Low speed internal clock. */ | ||
90 | /** @} */ | ||
91 | |||
92 | /** | ||
93 | * @name VOS field definitions | ||
94 | * @{ | ||
95 | */ | ||
96 | #define STM32_VOS_MASK (3U << 9U) /**< Core voltage mask. */ | ||
97 | #define STM32_VOS_RANGE1 (1U << 9U) /**< Core voltage 1.2 Volts. */ | ||
98 | #define STM32_VOS_RANGE2 (2U << 9U) /**< Core voltage 1.0 Volts. */ | ||
99 | /** @} */ | ||
100 | |||
101 | /** | ||
102 | * @name RCC_CFGR register bits definitions | ||
103 | * @{ | ||
104 | */ | ||
105 | #define STM32_SW_MASK (3U << 0U) /**< SW field mask. */ | ||
106 | #define STM32_SW_HSI16 (1U << 0U) /**< SYSCLK source is HSI16. */ | ||
107 | #define STM32_SW_HSE (2U << 0U) /**< SYSCLK source is HSE. */ | ||
108 | #define STM32_SW_PLLRCLK (3U << 0U) /**< SYSCLK source is PLL. */ | ||
109 | |||
110 | #define STM32_HPRE_MASK (15U << 4U) /**< HPRE field mask. */ | ||
111 | #define STM32_HPRE_FIELD(n) ((n) << 4U) /**< HPRE field value. */ | ||
112 | #define STM32_HPRE_DIV1 STM32_HPRE_FIELD(0U) | ||
113 | #define STM32_HPRE_DIV2 STM32_HPRE_FIELD(8U) | ||
114 | #define STM32_HPRE_DIV4 STM32_HPRE_FIELD(9U) | ||
115 | #define STM32_HPRE_DIV8 STM32_HPRE_FIELD(10U) | ||
116 | #define STM32_HPRE_DIV16 STM32_HPRE_FIELD(11U) | ||
117 | #define STM32_HPRE_DIV64 STM32_HPRE_FIELD(12U) | ||
118 | #define STM32_HPRE_DIV128 STM32_HPRE_FIELD(13U) | ||
119 | #define STM32_HPRE_DIV256 STM32_HPRE_FIELD(14U) | ||
120 | #define STM32_HPRE_DIV512 STM32_HPRE_FIELD(15U) | ||
121 | |||
122 | #define STM32_PPRE1_MASK (7U << 8U) /**< PPRE1 field mask. */ | ||
123 | #define STM32_PPRE1_FIELD(n) ((n) << 8U) /**< PPRE1 field value. */ | ||
124 | #define STM32_PPRE1_DIV1 STM32_PPRE1_FIELD(0U) | ||
125 | #define STM32_PPRE1_DIV2 STM32_PPRE1_FIELD(4U) | ||
126 | #define STM32_PPRE1_DIV4 STM32_PPRE1_FIELD(5U) | ||
127 | #define STM32_PPRE1_DIV8 STM32_PPRE1_FIELD(6U) | ||
128 | #define STM32_PPRE1_DIV16 STM32_PPRE1_FIELD(7U) | ||
129 | |||
130 | #define STM32_PPRE2_MASK (7U << 11U) /**< PPRE2 field mask. */ | ||
131 | #define STM32_PPRE2_FIELD(n) ((n) << 11U) /**< PPRE2 field value. */ | ||
132 | #define STM32_PPRE2_DIV1 STM32_PPRE2_FIELD(0U) | ||
133 | #define STM32_PPRE2_DIV2 STM32_PPRE2_FIELD(4U) | ||
134 | #define STM32_PPRE2_DIV4 STM32_PPRE2_FIELD(5U) | ||
135 | #define STM32_PPRE2_DIV8 STM32_PPRE2_FIELD(6U) | ||
136 | #define STM32_PPRE2_DIV16 STM32_PPRE2_FIELD(7U) | ||
137 | |||
138 | #define STM32_MCOSEL_MASK (15U << 24U)/**< MCOSEL field mask. */ | ||
139 | #define STM32_MCOSEL_NOCLOCK (0U << 24U) /**< No clock on MCO pin. */ | ||
140 | #define STM32_MCOSEL_SYSCLK (1U << 24U) /**< SYSCLK on MCO pin. */ | ||
141 | #define STM32_MCOSEL_HSI16 (3U << 24U) /**< HSI16 clock on MCO pin. */ | ||
142 | #define STM32_MCOSEL_HSE (4U << 24U) /**< HSE clock on MCO pin. */ | ||
143 | #define STM32_MCOSEL_PLLRCLK (5U << 24U) /**< PLLR clock on MCO pin. */ | ||
144 | #define STM32_MCOSEL_LSI (6U << 24U) /**< LSI clock on MCO pin. */ | ||
145 | #define STM32_MCOSEL_LSE (7U << 24U) /**< LSE clock on MCO pin. */ | ||
146 | #define STM32_MCOSEL_HSI48 (8U << 24U) /**< HSI48 clock on MCO pin. */ | ||
147 | |||
148 | #define STM32_MCOPRE_MASK (7U << 28U) /**< MCOPRE field mask. */ | ||
149 | #define STM32_MCOPRE_FIELD(n) ((n) << 28U)/**< MCOPRE field value */ | ||
150 | #define STM32_MCOPRE_DIV1 STM32_MCOPRE_FIELD(0U) | ||
151 | #define STM32_MCOPRE_DIV2 STM32_MCOPRE_FIELD(1U) | ||
152 | #define STM32_MCOPRE_DIV4 STM32_MCOPRE_FIELD(2U) | ||
153 | #define STM32_MCOPRE_DIV8 STM32_MCOPRE_FIELD(3U) | ||
154 | #define STM32_MCOPRE_DIV16 STM32_MCOPRE_FIELD(4U) | ||
155 | /** @} */ | ||
156 | |||
157 | /** | ||
158 | * @name RCC_PLLCFGR register bits definitions | ||
159 | * @{ | ||
160 | */ | ||
161 | #define STM32_PLLSRC_MASK (3 << 0) /**< PLL clock source mask. */ | ||
162 | #define STM32_PLLSRC_NOCLOCK (0 << 0) /**< PLL clock source disabled. */ | ||
163 | #define STM32_PLLSRC_HSI16 (2 << 0) /**< PLL clock source is HSI16. */ | ||
164 | #define STM32_PLLSRC_HSE (3 << 0) /**< PLL clock source is HSE. */ | ||
165 | /** @} */ | ||
166 | |||
167 | /** | ||
168 | * @name RCC_CCIPR register bits definitions | ||
169 | * @{ | ||
170 | */ | ||
171 | #define STM32_USART1SEL_MASK (3U << 0U) /**< USART1SEL mask. */ | ||
172 | #define STM32_USART1SEL_PCLK2 (0U << 0U) /**< USART1 source is PCLK2. */ | ||
173 | #define STM32_USART1SEL_SYSCLK (1U << 0U) /**< USART1 source is SYSCLK. */ | ||
174 | #define STM32_USART1SEL_HSI16 (2U << 0U) /**< USART1 source is HSI16. */ | ||
175 | #define STM32_USART1SEL_LSE (3U << 0U) /**< USART1 source is LSE. */ | ||
176 | |||
177 | #define STM32_USART2SEL_MASK (3U << 2U) /**< USART2 mask. */ | ||
178 | #define STM32_USART2SEL_PCLK1 (0U << 2U) /**< USART2 source is PCLK1. */ | ||
179 | #define STM32_USART2SEL_SYSCLK (1U << 2U) /**< USART2 source is SYSCLK. */ | ||
180 | #define STM32_USART2SEL_HSI16 (2U << 2U) /**< USART2 source is HSI16. */ | ||
181 | #define STM32_USART2SEL_LSE (3U << 2U) /**< USART2 source is LSE. */ | ||
182 | |||
183 | #define STM32_USART3SEL_MASK (3U << 4U) /**< USART3 mask. */ | ||
184 | #define STM32_USART3SEL_PCLK1 (0U << 4U) /**< USART3 source is PCLK1. */ | ||
185 | #define STM32_USART3SEL_SYSCLK (1U << 4U) /**< USART3 source is SYSCLK. */ | ||
186 | #define STM32_USART3SEL_HSI16 (2U << 4U) /**< USART3 source is HSI16. */ | ||
187 | #define STM32_USART3SEL_LSE (3U << 4U) /**< USART3 source is LSE. */ | ||
188 | |||
189 | #define STM32_UART4SEL_MASK (3U << 6U) /**< UART4 mask. */ | ||
190 | #define STM32_UART4SEL_PCLK1 (0U << 6U) /**< UART4 source is PCLK1. */ | ||
191 | #define STM32_UART4SEL_SYSCLK (1U << 6U) /**< UART4 source is SYSCLK. */ | ||
192 | #define STM32_UART4SEL_HSI16 (2U << 6U) /**< UART4 source is HSI16. */ | ||
193 | #define STM32_UART4SEL_LSE (3U << 6U) /**< UART4 source is LSE. */ | ||
194 | |||
195 | #define STM32_UART5SEL_MASK (3U << 8U) /**< UART5 mask. */ | ||
196 | #define STM32_UART5SEL_PCLK1 (0U << 8U) /**< UART5 source is PCLK1. */ | ||
197 | #define STM32_UART5SEL_SYSCLK (1U << 8U) /**< UART5 source is SYSCLK. */ | ||
198 | #define STM32_UART5SEL_HSI16 (2U << 8U) /**< UART5 source is HSI16. */ | ||
199 | #define STM32_UART5SEL_LSE (3U << 8U) /**< UART5 source is LSE. */ | ||
200 | |||
201 | #define STM32_LPUART1SEL_MASK (3U << 10U) /**< LPUART1 mask. */ | ||
202 | #define STM32_LPUART1SEL_PCLK1 (0U << 10U) /**< LPUART1 source is PCLK1. */ | ||
203 | #define STM32_LPUART1SEL_SYSCLK (1U << 10U) /**< LPUART1 source is SYSCLK. */ | ||
204 | #define STM32_LPUART1SEL_HSI16 (2U << 10U) /**< LPUART1 source is HSI16. */ | ||
205 | #define STM32_LPUART1SEL_LSE (3U << 10U) /**< LPUART1 source is LSE. */ | ||
206 | |||
207 | #define STM32_I2C1SEL_MASK (3U << 12U) /**< I2C1SEL mask. */ | ||
208 | #define STM32_I2C1SEL_PCLK1 (0U << 12U) /**< I2C1 source is PCLK1. */ | ||
209 | #define STM32_I2C1SEL_SYSCLK (1U << 12U) /**< I2C1 source is SYSCLK. */ | ||
210 | #define STM32_I2C1SEL_HSI16 (2U << 12U) /**< I2C1 source is HSI16. */ | ||
211 | |||
212 | #define STM32_I2C2SEL_MASK (3U << 14U) /**< I2C2SEL mask. */ | ||
213 | #define STM32_I2C2SEL_PCLK1 (0U << 14U) /**< I2C2 source is PCLK1. */ | ||
214 | #define STM32_I2C2SEL_SYSCLK (1U << 14U) /**< I2C2 source is SYSCLK. */ | ||
215 | #define STM32_I2C2SEL_HSI16 (2U << 14U) /**< I2C2 source is HSI16. */ | ||
216 | |||
217 | #define STM32_I2C3SEL_MASK (3U << 16U) /**< I2C3SEL mask. */ | ||
218 | #define STM32_I2C3SEL_PCLK1 (0U << 16U) /**< I2C3 source is PCLK1. */ | ||
219 | #define STM32_I2C3SEL_SYSCLK (1U << 16U) /**< I2C3 source is SYSCLK. */ | ||
220 | #define STM32_I2C3SEL_HSI16 (2U << 16U) /**< I2C3 source is HSI16. */ | ||
221 | |||
222 | #define STM32_LPTIM1SEL_MASK (3U << 18U) /**< LPTIM1SEL mask. */ | ||
223 | #define STM32_LPTIM1SEL_PCLK1 (0U << 18U) /**< LPTIM1 source is PCLK1. */ | ||
224 | #define STM32_LPTIM1SEL_LSI (1U << 18U) /**< LPTIM1 source is LSI. */ | ||
225 | #define STM32_LPTIM1SEL_HSI16 (2U << 18U) /**< LPTIM1 source is HSI16. */ | ||
226 | #define STM32_LPTIM1SEL_LSE (3U << 18U) /**< LPTIM1 source is LSE. */ | ||
227 | |||
228 | #define STM32_SAI1SEL_MASK (3U << 20U) /**< SAI1SEL mask. */ | ||
229 | #define STM32_SAI1SEL_SYSCLK (0U << 20U) /**< SAI1 source is SYSCLK. */ | ||
230 | #define STM32_SAI1SEL_PLLQCLK (1U << 20U) /**< SAI1 source is PLLQCLK. */ | ||
231 | #define STM32_SAI1SEL_CKIN (2U << 20U) /**< SAI1 source is CKIN. */ | ||
232 | #define STM32_SAI1SEL_HSI16 (3U << 20U) /**< SAI1 source is HSI16. */ | ||
233 | |||
234 | #define STM32_I2S23SEL_MASK (3U << 22U) /**< I2S23SEL mask. */ | ||
235 | #define STM32_I2S23SEL_SYSCLK (0U << 22U) /**< I2S23 source is SYSCLK. */ | ||
236 | #define STM32_I2S23SEL_PLLQCLK (1U << 22U) /**< I2S23 source is PLLQCLK. */ | ||
237 | #define STM32_I2S23SEL_CKIN (2U << 22U) /**< I2S23 source is CKIN. */ | ||
238 | #define STM32_I2S23SEL_HSI16 (3U << 22U) /**< I2S23 source is HSI16. */ | ||
239 | |||
240 | #define STM32_FDCANSEL_MASK (3U << 24U) /**< FDCANSEL mask. */ | ||
241 | #define STM32_FDCANSEL_HSE (0U << 24U) /**< FDCAN source is HSE. */ | ||
242 | #define STM32_FDCANSEL_PLLQCLK (1U << 24U) /**< FDCAN source is PLLQCLK. */ | ||
243 | #define STM32_FDCANSEL_PCLK1 (2U << 24U) /**< FDCAN source is PCLK1. */ | ||
244 | |||
245 | #define STM32_CLK48SEL_MASK (3U << 26U) /**< CLK48SEL mask. */ | ||
246 | #define STM32_CLK48SEL_HSI48 (0U << 26U) /**< CLK48 source is HSI48. */ | ||
247 | #define STM32_CLK48SEL_PLLQCLK (2U << 26U) /**< CLK48 source is PLLQCLK. */ | ||
248 | |||
249 | #define STM32_ADC12SEL_MASK (3U << 28U) /**< ADC12SEL mask. */ | ||
250 | #define STM32_ADC12SEL_NOCLK (0U << 28U) /**< ADC12 source is none. */ | ||
251 | #define STM32_ADC12SEL_PLLPCLK (1U << 28U) /**< ADC12 source is PLLPCLK. */ | ||
252 | #define STM32_ADC12SEL_SYSCLK (2U << 28U) /**< ADC12 source is SYSCLK. */ | ||
253 | |||
254 | #define STM32_ADC345SEL_MASK (3U << 30U) /**< ADC345SEL mask. */ | ||
255 | #define STM32_ADC345SEL_NOCLK (0U << 30U) /**< ADC345 source is none. */ | ||
256 | #define STM32_ADC345SEL_PLLPCLK (1U << 30U) /**< ADC345 source is PLLPCLK. */ | ||
257 | #define STM32_ADC345SEL_SYSCLK (2U << 30U) /**< ADC345 source is SYSCLK. */ | ||
258 | /** @} */ | ||
259 | |||
260 | /** | ||
261 | * @name RCC_CCIPR2 register bits definitions | ||
262 | * @{ | ||
263 | */ | ||
264 | #define STM32_I2C4SEL_MASK (3U << 0U) /**< I2C4SEL mask. */ | ||
265 | #define STM32_I2C4SEL_PCLK1 (0U << 0U) /**< I2C4 source is PCLK1. */ | ||
266 | #define STM32_I2C4SEL_SYSCLK (1U << 0U) /**< I2C4 source is SYSCLK. */ | ||
267 | #define STM32_I2C4SEL_HSI16 (2U << 0U) /**< I2C4 source is HSI16. */ | ||
268 | |||
269 | #define STM32_QSPISEL_MASK (3U << 20U) /**< QSPISEL mask. */ | ||
270 | #define STM32_QSPISEL_SYSCLK (0U << 20U) /**< QSPI source is SYSCLK. */ | ||
271 | #define STM32_QSPISEL_HSI16 (1U << 20U) /**< QSPI source is HSI16. */ | ||
272 | #define STM32_QSPISEL_PLLQCLK (2U << 20U) /**< QSPI source is PLLQCLK. */ | ||
273 | /** @} */ | ||
274 | |||
275 | /** | ||
276 | * @name RCC_BDCR register bits definitions | ||
277 | * @{ | ||
278 | */ | ||
279 | #define STM32_RTCSEL_MASK (3U << 8U) /**< RTC source mask. */ | ||
280 | #define STM32_RTCSEL_NOCLOCK (0U << 8U) /**< No RTC source. */ | ||
281 | #define STM32_RTCSEL_LSE (1U << 8U) /**< RTC source is LSE. */ | ||
282 | #define STM32_RTCSEL_LSI (2U << 8U) /**< RTC source is LSI. */ | ||
283 | #define STM32_RTCSEL_HSEDIV (3U << 8U) /**< RTC source is HSE divided. */ | ||
284 | |||
285 | #define STM32_LSCOSEL_MASK (3U << 24U) /**< LSCO pin clock source. */ | ||
286 | #define STM32_LSCOSEL_NOCLOCK (0U << 24U) /**< No clock on LSCO pin. */ | ||
287 | #define STM32_LSCOSEL_LSI (1U << 24U) /**< LSI on LSCO pin. */ | ||
288 | #define STM32_LSCOSEL_LSE (3U << 24U) /**< LSE on LSCO pin. */ | ||
289 | /** @} */ | ||
290 | |||
291 | /*===========================================================================*/ | ||
292 | /* Driver pre-compile time settings. */ | ||
293 | /*===========================================================================*/ | ||
294 | |||
295 | /** | ||
296 | * @name Configuration options | ||
297 | * @{ | ||
298 | */ | ||
299 | /** | ||
300 | * @brief Disables the PWR/RCC initialization in the HAL. | ||
301 | */ | ||
302 | #if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) | ||
303 | #define STM32_NO_INIT FALSE | ||
304 | #endif | ||
305 | |||
306 | /** | ||
307 | * @brief Core voltage selection. | ||
308 | * @note This setting affects all the performance and clock related | ||
309 | * settings, the maximum performance is only obtainable selecting | ||
310 | * the maximum voltage. | ||
311 | */ | ||
312 | #if !defined(STM32_VOS) || defined(__DOXYGEN__) | ||
313 | #define STM32_VOS STM32_VOS_RANGE1 | ||
314 | #endif | ||
315 | |||
316 | /** | ||
317 | * @brief Core voltage boost. | ||
318 | * @note The boost can only be used when STM32_VOS==STM32_VOS_RANGE1. | ||
319 | */ | ||
320 | #if !defined(STM32_PWR_BOOST) || defined(__DOXYGEN__) | ||
321 | #define STM32_PWR_BOOST TRUE | ||
322 | #endif | ||
323 | |||
324 | /** | ||
325 | * @brief PWR CR2 register initialization value. | ||
326 | */ | ||
327 | #if !defined(STM32_PWR_CR2) || defined(__DOXYGEN__) | ||
328 | #define STM32_PWR_CR2 (PWR_CR2_PLS_LEV0) | ||
329 | #endif | ||
330 | |||
331 | /** | ||
332 | * @brief PWR CR3 register initialization value. | ||
333 | */ | ||
334 | #if !defined(STM32_PWR_CR3) || defined(__DOXYGEN__) | ||
335 | #define STM32_PWR_CR3 (PWR_CR3_EIWF) | ||
336 | #endif | ||
337 | |||
338 | /** | ||
339 | * @brief PWR CR4 register initialization value. | ||
340 | */ | ||
341 | #if !defined(STM32_PWR_CR4) || defined(__DOXYGEN__) | ||
342 | #define STM32_PWR_CR4 (0U) | ||
343 | #endif | ||
344 | |||
345 | /** | ||
346 | * @brief PWR PUCRA register initialization value. | ||
347 | */ | ||
348 | #if !defined(STM32_PWR_PUCRA) || defined(__DOXYGEN__) | ||
349 | #define STM32_PWR_PUCRA (0U) | ||
350 | #endif | ||
351 | |||
352 | /** | ||
353 | * @brief PWR PDCRA register initialization value. | ||
354 | */ | ||
355 | #if !defined(STM32_PWR_PDCRA) || defined(__DOXYGEN__) | ||
356 | #define STM32_PWR_PDCRA (0U) | ||
357 | #endif | ||
358 | |||
359 | /** | ||
360 | * @brief PWR PUCRB register initialization value. | ||
361 | */ | ||
362 | #if !defined(STM32_PWR_PUCRB) || defined(__DOXYGEN__) | ||
363 | #define STM32_PWR_PUCRB (0U) | ||
364 | #endif | ||
365 | |||
366 | /** | ||
367 | * @brief PWR PDCRB register initialization value. | ||
368 | */ | ||
369 | #if !defined(STM32_PWR_PDCRB) || defined(__DOXYGEN__) | ||
370 | #define STM32_PWR_PDCRB (0U) | ||
371 | #endif | ||
372 | |||
373 | /** | ||
374 | * @brief PWR PUCRC register initialization value. | ||
375 | */ | ||
376 | #if !defined(STM32_PWR_PUCRC) || defined(__DOXYGEN__) | ||
377 | #define STM32_PWR_PUCRC (0U) | ||
378 | #endif | ||
379 | |||
380 | /** | ||
381 | * @brief PWR PDCRC register initialization value. | ||
382 | */ | ||
383 | #if !defined(STM32_PWR_PDCRC) || defined(__DOXYGEN__) | ||
384 | #define STM32_PWR_PDCRC (0U) | ||
385 | #endif | ||
386 | |||
387 | /** | ||
388 | * @brief PWR PUCRD register initialization value. | ||
389 | */ | ||
390 | #if !defined(STM32_PWR_PUCRD) || defined(__DOXYGEN__) | ||
391 | #define STM32_PWR_PUCRD (0U) | ||
392 | #endif | ||
393 | |||
394 | /** | ||
395 | * @brief PWR PDCRD register initialization value. | ||
396 | */ | ||
397 | #if !defined(STM32_PWR_PDCRD) || defined(__DOXYGEN__) | ||
398 | #define STM32_PWR_PDCRD (0U) | ||
399 | #endif | ||
400 | |||
401 | /** | ||
402 | * @brief PWR PUCRE register initialization value. | ||
403 | */ | ||
404 | #if !defined(STM32_PWR_PUCRE) || defined(__DOXYGEN__) | ||
405 | #define STM32_PWR_PUCRE (0U) | ||
406 | #endif | ||
407 | |||
408 | /** | ||
409 | * @brief PWR PDCRE register initialization value. | ||
410 | */ | ||
411 | #if !defined(STM32_PWR_PDCRE) || defined(__DOXYGEN__) | ||
412 | #define STM32_PWR_PDCRE (0U) | ||
413 | #endif | ||
414 | |||
415 | /** | ||
416 | * @brief PWR PUCRF register initialization value. | ||
417 | */ | ||
418 | #if !defined(STM32_PWR_PUCRF) || defined(__DOXYGEN__) | ||
419 | #define STM32_PWR_PUCRF (0U) | ||
420 | #endif | ||
421 | |||
422 | /** | ||
423 | * @brief PWR PDCRF register initialization value. | ||
424 | */ | ||
425 | #if !defined(STM32_PWR_PDCRF) || defined(__DOXYGEN__) | ||
426 | #define STM32_PWR_PDCRF (0U) | ||
427 | #endif | ||
428 | |||
429 | /** | ||
430 | * @brief PWR PUCRG register initialization value. | ||
431 | */ | ||
432 | #if !defined(STM32_PWR_PUCRG) || defined(__DOXYGEN__) | ||
433 | #define STM32_PWR_PUCRG (0U) | ||
434 | #endif | ||
435 | |||
436 | /** | ||
437 | * @brief PWR PDCRG register initialization value. | ||
438 | */ | ||
439 | #if !defined(STM32_PWR_PDCRG) || defined(__DOXYGEN__) | ||
440 | #define STM32_PWR_PDCRG (0U) | ||
441 | #endif | ||
442 | |||
443 | /** | ||
444 | * @brief Enables or disables the HSI16 clock source. | ||
445 | */ | ||
446 | #if !defined(STM32_HSI16_ENABLED) || defined(__DOXYGEN__) | ||
447 | #define STM32_HSI16_ENABLED FALSE | ||
448 | #endif | ||
449 | |||
450 | /** | ||
451 | * @brief Enables or disables the HSI48 clock source. | ||
452 | */ | ||
453 | #if !defined(STM32_HSI48_ENABLED) || defined(__DOXYGEN__) | ||
454 | #define STM32_HSI48_ENABLED FALSE | ||
455 | #endif | ||
456 | |||
457 | /** | ||
458 | * @brief Enables or disables the HSE clock source. | ||
459 | */ | ||
460 | #if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) | ||
461 | #define STM32_HSE_ENABLED FALSE | ||
462 | #endif | ||
463 | |||
464 | /** | ||
465 | * @brief Enables or disables the LSI clock source. | ||
466 | */ | ||
467 | #if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) | ||
468 | #define STM32_LSI_ENABLED FALSE | ||
469 | #endif | ||
470 | |||
471 | /** | ||
472 | * @brief Enables or disables the LSE clock source. | ||
473 | */ | ||
474 | #if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__) | ||
475 | #define STM32_LSE_ENABLED FALSE | ||
476 | #endif | ||
477 | |||
478 | /** | ||
479 | * @brief Main clock source selection. | ||
480 | * @note If the selected clock source is not the PLL then the PLL is not | ||
481 | * initialized and started. | ||
482 | * @note The default value is calculated for a 170MHz system clock from | ||
483 | * the internal 16MHz HSI clock. | ||
484 | */ | ||
485 | #if !defined(STM32_SW) || defined(__DOXYGEN__) | ||
486 | #define STM32_SW STM32_SW_PLLRCLK | ||
487 | #endif | ||
488 | |||
489 | /** | ||
490 | * @brief Clock source for the PLL. | ||
491 | * @note This setting has only effect if the PLL is selected as the | ||
492 | * system clock source. | ||
493 | * @note The default value is calculated for a 170MHz system clock from | ||
494 | * the internal 16MHz HSI clock. | ||
495 | */ | ||
496 | #if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) | ||
497 | #define STM32_PLLSRC STM32_PLLSRC_HSI16 | ||
498 | #endif | ||
499 | |||
500 | /** | ||
501 | * @brief PLLM divider value. | ||
502 | * @note The allowed values are 1..16. | ||
503 | * @note The default value is calculated for a 170MHz system clock from | ||
504 | * the internal 16MHz HSI clock. | ||
505 | */ | ||
506 | #if !defined(STM32_PLLM_VALUE) || defined(__DOXYGEN__) | ||
507 | #define STM32_PLLM_VALUE 4 | ||
508 | #endif | ||
509 | |||
510 | /** | ||
511 | * @brief PLLN multiplier value. | ||
512 | * @note The allowed values are 8..127. | ||
513 | * @note The default value is calculated for a 170MHz system clock from | ||
514 | * the internal 16MHz HSI clock. | ||
515 | */ | ||
516 | #if !defined(STM32_PLLN_VALUE) || defined(__DOXYGEN__) | ||
517 | #define STM32_PLLN_VALUE 84 | ||
518 | #endif | ||
519 | |||
520 | /** | ||
521 | * @brief PLLPDIV divider value or zero if disabled. | ||
522 | * @note The allowed values are 0, 2..31. | ||
523 | */ | ||
524 | #if !defined(STM32_PLLPDIV_VALUE) || defined(__DOXYGEN__) | ||
525 | #define STM32_PLLPDIV_VALUE 0 | ||
526 | #endif | ||
527 | |||
528 | /** | ||
529 | * @brief PLLP divider value. | ||
530 | * @note The allowed values are 7, 17. | ||
531 | */ | ||
532 | #if !defined(STM32_PLLP_VALUE) || defined(__DOXYGEN__) | ||
533 | #define STM32_PLLP_VALUE 7 | ||
534 | #endif | ||
535 | |||
536 | /** | ||
537 | * @brief PLLQ divider value. | ||
538 | * @note The allowed values are 2, 4, 6, 8. | ||
539 | */ | ||
540 | #if !defined(STM32_PLLQ_VALUE) || defined(__DOXYGEN__) | ||
541 | #define STM32_PLLQ_VALUE 8 | ||
542 | #endif | ||
543 | |||
544 | /** | ||
545 | * @brief PLLR divider value. | ||
546 | * @note The allowed values are 2, 4, 6, 8. | ||
547 | * @note The default value is calculated for a 170MHz system clock from | ||
548 | * the internal 16MHz HSI clock. | ||
549 | */ | ||
550 | #if !defined(STM32_PLLR_VALUE) || defined(__DOXYGEN__) | ||
551 | #define STM32_PLLR_VALUE 2 | ||
552 | #endif | ||
553 | |||
554 | /** | ||
555 | * @brief AHB prescaler value. | ||
556 | * @note The default value is calculated for a 170MHz system clock from | ||
557 | * the internal 16MHz HSI clock. | ||
558 | */ | ||
559 | #if !defined(STM32_HPRE) || defined(__DOXYGEN__) | ||
560 | #define STM32_HPRE STM32_HPRE_DIV1 | ||
561 | #endif | ||
562 | |||
563 | /** | ||
564 | * @brief APB1 prescaler value. | ||
565 | */ | ||
566 | #if !defined(STM32_PPRE1) || defined(__DOXYGEN__) | ||
567 | #define STM32_PPRE1 STM32_PPRE1_DIV2 | ||
568 | #endif | ||
569 | |||
570 | /** | ||
571 | * @brief APB2 prescaler value. | ||
572 | */ | ||
573 | #if !defined(STM32_PPRE2) || defined(__DOXYGEN__) | ||
574 | #define STM32_PPRE2 STM32_PPRE2_DIV1 | ||
575 | #endif | ||
576 | |||
577 | /** | ||
578 | * @brief MCO clock source. | ||
579 | */ | ||
580 | #if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) | ||
581 | #define STM32_MCOSEL STM32_MCOSEL_NOCLOCK | ||
582 | #endif | ||
583 | |||
584 | /** | ||
585 | * @brief MCO divider setting. | ||
586 | */ | ||
587 | #if !defined(STM32_MCOPRE) || defined(__DOXYGEN__) | ||
588 | #define STM32_MCOPRE STM32_MCOPRE_DIV1 | ||
589 | #endif | ||
590 | |||
591 | /** | ||
592 | * @brief LSCO clock source. | ||
593 | */ | ||
594 | #if !defined(STM32_LSCOSEL) || defined(__DOXYGEN__) | ||
595 | #define STM32_LSCOSEL STM32_LSCOSEL_NOCLOCK | ||
596 | #endif | ||
597 | |||
598 | /** | ||
599 | * @brief USART1 clock source. | ||
600 | */ | ||
601 | #if !defined(STM32_USART1SEL) || defined(__DOXYGEN__) | ||
602 | #define STM32_USART1SEL STM32_USART1SEL_SYSCLK | ||
603 | #endif | ||
604 | |||
605 | /** | ||
606 | * @brief USART2 clock source. | ||
607 | */ | ||
608 | #if !defined(STM32_USART2SEL) || defined(__DOXYGEN__) | ||
609 | #define STM32_USART2SEL STM32_USART2SEL_SYSCLK | ||
610 | #endif | ||
611 | |||
612 | /** | ||
613 | * @brief USART3 clock source. | ||
614 | */ | ||
615 | #if !defined(STM32_USART3SEL) || defined(__DOXYGEN__) | ||
616 | #define STM32_USART3SEL STM32_USART3SEL_SYSCLK | ||
617 | #endif | ||
618 | |||
619 | /** | ||
620 | * @brief UART4 clock source. | ||
621 | */ | ||
622 | #if !defined(STM32_UART4SEL) || defined(__DOXYGEN__) | ||
623 | #define STM32_UART4SEL STM32_UART4SEL_SYSCLK | ||
624 | #endif | ||
625 | |||
626 | /** | ||
627 | * @brief UART5 clock source. | ||
628 | */ | ||
629 | #if !defined(STM32_UART5SEL) || defined(__DOXYGEN__) | ||
630 | #define STM32_UART5SEL STM32_UART5SEL_SYSCLK | ||
631 | #endif | ||
632 | |||
633 | /** | ||
634 | * @brief LPUART1 clock source. | ||
635 | */ | ||
636 | #if !defined(STM32_LPUART1SEL) || defined(__DOXYGEN__) | ||
637 | #define STM32_LPUART1SEL STM32_LPUART1SEL_SYSCLK | ||
638 | #endif | ||
639 | |||
640 | /** | ||
641 | * @brief I2C1 clock source. | ||
642 | */ | ||
643 | #if !defined(STM32_I2C1SEL) || defined(__DOXYGEN__) | ||
644 | #define STM32_I2C1SEL STM32_I2C1SEL_PCLK1 | ||
645 | #endif | ||
646 | |||
647 | /** | ||
648 | * @brief I2C2 clock source. | ||
649 | */ | ||
650 | #if !defined(STM32_I2C2SEL) || defined(__DOXYGEN__) | ||
651 | #define STM32_I2C2SEL STM32_I2C2SEL_PCLK1 | ||
652 | #endif | ||
653 | |||
654 | /** | ||
655 | * @brief I2C3 clock source. | ||
656 | */ | ||
657 | #if !defined(STM32_I2C3SEL) || defined(__DOXYGEN__) | ||
658 | #define STM32_I2C3SEL STM32_I2C3SEL_PCLK1 | ||
659 | #endif | ||
660 | |||
661 | /** | ||
662 | * @brief I2C4 clock source. | ||
663 | */ | ||
664 | #if !defined(STM32_I2C4SEL) || defined(__DOXYGEN__) | ||
665 | #define STM32_I2C4SEL STM32_I2C4SEL_PCLK1 | ||
666 | #endif | ||
667 | |||
668 | /** | ||
669 | * @brief LPTIM1 clock source. | ||
670 | */ | ||
671 | #if !defined(STM32_LPTIM1SEL) || defined(__DOXYGEN__) | ||
672 | #define STM32_LPTIM1SEL STM32_LPTIM1SEL_PCLK1 | ||
673 | #endif | ||
674 | |||
675 | /** | ||
676 | * @brief SAI1 clock source. | ||
677 | */ | ||
678 | #if !defined(STM32_SAI1SEL) || defined(__DOXYGEN__) | ||
679 | #define STM32_SAI1SEL STM32_SAI1SEL_SYSCLK | ||
680 | #endif | ||
681 | |||
682 | /** | ||
683 | * @brief I2S23 clock source. | ||
684 | */ | ||
685 | #if !defined(STM32_I2S23SEL) || defined(__DOXYGEN__) | ||
686 | #define STM32_I2S23SEL STM32_I2S23SEL_SYSCLK | ||
687 | #endif | ||
688 | |||
689 | /** | ||
690 | * @brief FDCAN clock source. | ||
691 | */ | ||
692 | #if !defined(STM32_FDCANSEL) || defined(__DOXYGEN__) | ||
693 | #define STM32_FDCANSEL STM32_FDCANSEL_HSE | ||
694 | #endif | ||
695 | |||
696 | /** | ||
697 | * @brief CLK48 clock source. | ||
698 | */ | ||
699 | #if !defined(STM32_CLK48SEL) || defined(__DOXYGEN__) | ||
700 | #define STM32_CLK48SEL STM32_CLK48SEL_HSI48 | ||
701 | #endif | ||
702 | |||
703 | /** | ||
704 | * @brief ADC12 clock source. | ||
705 | */ | ||
706 | #if !defined(STM32_ADC12SEL) || defined(__DOXYGEN__) | ||
707 | #define STM32_ADC12SEL STM32_ADC12SEL_PLLPCLK | ||
708 | #endif | ||
709 | |||
710 | /** | ||
711 | * @brief ADC34 clock source. | ||
712 | */ | ||
713 | #if !defined(STM32_ADC345SEL) || defined(__DOXYGEN__) | ||
714 | #define STM32_ADC345SEL STM32_ADC345SEL_PLLPCLK | ||
715 | #endif | ||
716 | |||
717 | /** | ||
718 | * @brief QSPI clock source. | ||
719 | */ | ||
720 | #if !defined(STM32_QSPISEL) || defined(__DOXYGEN__) | ||
721 | #define STM32_QSPISEL STM32_QSPISEL_SYSCLK | ||
722 | #endif | ||
723 | |||
724 | /** | ||
725 | * @brief RTC clock source. | ||
726 | */ | ||
727 | #if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) | ||
728 | #define STM32_RTCSEL STM32_RTCSEL_NOCLOCK | ||
729 | #endif | ||
730 | /** @} */ | ||
731 | |||
732 | /*===========================================================================*/ | ||
733 | /* Derived constants and error checks. */ | ||
734 | /*===========================================================================*/ | ||
735 | |||
736 | /* Boost mode checks.*/ | ||
737 | #if STM32_PWR_BOOST && (STM32_VOS != STM32_VOS_RANGE1) | ||
738 | #error "STM32_PWR_BOOST requires STM32_VOS_RANGE1" | ||
739 | #endif | ||
740 | |||
741 | /* | ||
742 | * Configuration-related checks. | ||
743 | */ | ||
744 | #if !defined(STM32G4xx_MCUCONF) | ||
745 | #error "Using a wrong mcuconf.h file, STM32G4xx_MCUCONF not defined" | ||
746 | #endif | ||
747 | |||
748 | #if defined(STM32G431xx) && !defined(STM32G431_MCUCONF) | ||
749 | #error "Using a wrong mcuconf.h file, STM32G431_MCUCONF not defined" | ||
750 | |||
751 | #elif defined(STM32G441xx) && !defined(STM32G441_MCUCONF) | ||
752 | #error "Using a wrong mcuconf.h file, STM32G441_MCUCONF not defined" | ||
753 | |||
754 | #elif defined(STM32G471xx) && !defined(STM32G471_MCUCONF) | ||
755 | #error "Using a wrong mcuconf.h file, STM32G471_MCUCONF not defined" | ||
756 | |||
757 | #elif defined(STM32G473xx) && !defined(STM32G473_MCUCONF) | ||
758 | #error "Using a wrong mcuconf.h file, STM32G473_MCUCONF not defined" | ||
759 | |||
760 | #elif defined(STM32G483xx) && !defined(STM32G473_MCUCONF) | ||
761 | #error "Using a wrong mcuconf.h file, STM32G483_MCUCONF not defined" | ||
762 | |||
763 | #elif defined(STM32G474xx) && !defined(STM32G474_MCUCONF) | ||
764 | #error "Using a wrong mcuconf.h file, STM32G474_MCUCONF not defined" | ||
765 | |||
766 | #elif defined(STM32G484xx) && !defined(STM32G484_MCUCONF) | ||
767 | #error "Using a wrong mcuconf.h file, STM32G484_MCUCONF not defined" | ||
768 | |||
769 | #elif defined(STM32GBK1CB) && !defined(STM32GBK1CB_MCUCONF) | ||
770 | #error "Using a wrong mcuconf.h file, STM32GBK1CB_MCUCONF not defined" | ||
771 | |||
772 | #endif | ||
773 | |||
774 | /* | ||
775 | * Board files sanity checks. | ||
776 | */ | ||
777 | #if !defined(STM32_LSECLK) | ||
778 | #error "STM32_LSECLK not defined in board.h" | ||
779 | #endif | ||
780 | |||
781 | #if !defined(STM32_LSEDRV) | ||
782 | #error "STM32_LSEDRV not defined in board.h" | ||
783 | #endif | ||
784 | |||
785 | #if !defined(STM32_HSECLK) | ||
786 | #error "STM32_HSECLK not defined in board.h" | ||
787 | #endif | ||
788 | |||
789 | /** | ||
790 | * @name System Limits for VOS range 1 with boost | ||
791 | * @{ | ||
792 | */ | ||
793 | #define STM32_BOOST_SYSCLK_MAX 170000000 | ||
794 | #define STM32_BOOST_HSECLK_MAX 48000000 | ||
795 | #define STM32_BOOST_HSECLK_BYP_MAX 48000000 | ||
796 | #define STM32_BOOST_HSECLK_MIN 8000000 | ||
797 | #define STM32_BOOST_HSECLK_BYP_MIN 8000000 | ||
798 | #define STM32_BOOST_LSECLK_MAX 32768 | ||
799 | #define STM32_BOOST_LSECLK_BYP_MAX 1000000 | ||
800 | #define STM32_BOOST_LSECLK_MIN 32768 | ||
801 | #define STM32_BOOST_LSECLK_BYP_MIN 32768 | ||
802 | #define STM32_BOOST_PLLIN_MAX 16000000 | ||
803 | #define STM32_BOOST_PLLIN_MIN 2660000 | ||
804 | #define STM32_BOOST_PLLVCO_MAX 344000000 | ||
805 | #define STM32_BOOST_PLLVCO_MIN 96000000 | ||
806 | #define STM32_BOOST_PLLP_MAX 170000000 | ||
807 | #define STM32_BOOST_PLLP_MIN 2064500 | ||
808 | #define STM32_BOOST_PLLQ_MAX 170000000 | ||
809 | #define STM32_BOOST_PLLQ_MIN 8000000 | ||
810 | #define STM32_BOOST_PLLR_MAX 170000000 | ||
811 | #define STM32_BOOST_PLLR_MIN 8000000 | ||
812 | #define STM32_BOOST_PCLK1_MAX 170000000 | ||
813 | #define STM32_BOOST_PCLK2_MAX 170000000 | ||
814 | #define STM32_BOOST_ADCCLK_MAX 60000000 | ||
815 | |||
816 | #define STM32_BOOST_0WS_THRESHOLD 34000000 | ||
817 | #define STM32_BOOST_1WS_THRESHOLD 68000000 | ||
818 | #define STM32_BOOST_2WS_THRESHOLD 102000000 | ||
819 | #define STM32_BOOST_3WS_THRESHOLD 136000000 | ||
820 | #define STM32_BOOST_4WS_THRESHOLD 170000000 | ||
821 | /** @} */ | ||
822 | |||
823 | /** | ||
824 | * @name System Limits for VOS range 1 without boost | ||
825 | * @{ | ||
826 | */ | ||
827 | #define STM32_VOS1_SYSCLK_MAX 150000000 | ||
828 | #define STM32_VOS1_HSECLK_MAX 48000000 | ||
829 | #define STM32_VOS1_HSECLK_BYP_MAX 48000000 | ||
830 | #define STM32_VOS1_HSECLK_MIN 8000000 | ||
831 | #define STM32_VOS1_HSECLK_BYP_MIN 8000000 | ||
832 | #define STM32_VOS1_LSECLK_MAX 32768 | ||
833 | #define STM32_VOS1_LSECLK_BYP_MAX 1000000 | ||
834 | #define STM32_VOS1_LSECLK_MIN 32768 | ||
835 | #define STM32_VOS1_LSECLK_BYP_MIN 32768 | ||
836 | #define STM32_VOS1_PLLIN_MAX 16000000 | ||
837 | #define STM32_VOS1_PLLIN_MIN 2660000 | ||
838 | #define STM32_VOS1_PLLVCO_MAX 344000000 | ||
839 | #define STM32_VOS1_PLLVCO_MIN 96000000 | ||
840 | #define STM32_VOS1_PLLP_MAX 150000000 | ||
841 | #define STM32_VOS1_PLLP_MIN 2064500 | ||
842 | #define STM32_VOS1_PLLQ_MAX 150000000 | ||
843 | #define STM32_VOS1_PLLQ_MIN 8000000 | ||
844 | #define STM32_VOS1_PLLR_MAX 150000000 | ||
845 | #define STM32_VOS1_PLLR_MIN 8000000 | ||
846 | #define STM32_VOS1_PCLK1_MAX 150000000 | ||
847 | #define STM32_VOS1_PCLK2_MAX 150000000 | ||
848 | #define STM32_VOS1_ADCCLK_MAX 60000000 | ||
849 | |||
850 | #define STM32_VOS1_0WS_THRESHOLD 30000000 | ||
851 | #define STM32_VOS1_1WS_THRESHOLD 60000000 | ||
852 | #define STM32_VOS1_2WS_THRESHOLD 90000000 | ||
853 | #define STM32_VOS1_3WS_THRESHOLD 120000000 | ||
854 | #define STM32_VOS1_4WS_THRESHOLD 150000000 | ||
855 | /** @} */ | ||
856 | |||
857 | /** | ||
858 | * @name System Limits for VOS range 2 | ||
859 | * @{ | ||
860 | */ | ||
861 | #define STM32_VOS2_SYSCLK_MAX 26000000 | ||
862 | #define STM32_VOS2_HSECLK_MAX 26000000 | ||
863 | #define STM32_VOS2_HSECLK_BYP_MAX 26000000 | ||
864 | #define STM32_VOS2_HSECLK_MIN 8000000 | ||
865 | #define STM32_VOS2_HSECLK_BYP_MIN 8000000 | ||
866 | #define STM32_VOS2_LSECLK_MAX 32768 | ||
867 | #define STM32_VOS2_LSECLK_BYP_MAX 1000000 | ||
868 | #define STM32_VOS2_LSECLK_MIN 32768 | ||
869 | #define STM32_VOS2_LSECLK_BYP_MIN 32768 | ||
870 | #define STM32_VOS2_PLLIN_MAX 16000000 | ||
871 | #define STM32_VOS2_PLLIN_MIN 2660000 | ||
872 | #define STM32_VOS2_PLLVCO_MAX 128000000 | ||
873 | #define STM32_VOS2_PLLVCO_MIN 96000000 | ||
874 | #define STM32_VOS2_PLLP_MAX 26000000 | ||
875 | #define STM32_VOS2_PLLP_MIN 2064500 | ||
876 | #define STM32_VOS2_PLLQ_MAX 26000000 | ||
877 | #define STM32_VOS2_PLLQ_MIN 8000000 | ||
878 | #define STM32_VOS2_PLLR_MAX 26000000 | ||
879 | #define STM32_VOS2_PLLR_MIN 8000000 | ||
880 | #define STM32_VOS2_PCLK1_MAX 26000000 | ||
881 | #define STM32_VOS2_PCLK2_MAX 26000000 | ||
882 | #define STM32_VOS2_ADCCLK_MAX 26000000 | ||
883 | |||
884 | #define STM32_VOS2_0WS_THRESHOLD 12000000 | ||
885 | #define STM32_VOS2_1WS_THRESHOLD 24000000 | ||
886 | #define STM32_VOS2_2WS_THRESHOLD 26000000 | ||
887 | #define STM32_VOS2_3WS_THRESHOLD 0 | ||
888 | #define STM32_VOS2_4WS_THRESHOLD 0 | ||
889 | /** @} */ | ||
890 | |||
891 | /* Voltage related limits.*/ | ||
892 | #if (STM32_VOS == STM32_VOS_RANGE1) || defined(__DOXYGEN__) | ||
893 | #if STM32_PWR_BOOST || defined(__DOXYGEN__) | ||
894 | #define STM32_SYSCLK_MAX STM32_BOOST_SYSCLK_MAX | ||
895 | #define STM32_HSECLK_MAX STM32_BOOST_HSECLK_MAX | ||
896 | #define STM32_HSECLK_BYP_MAX STM32_BOOST_HSECLK_BYP_MAX | ||
897 | #define STM32_HSECLK_MIN STM32_BOOST_HSECLK_MIN | ||
898 | #define STM32_HSECLK_BYP_MIN STM32_BOOST_HSECLK_BYP_MIN | ||
899 | #define STM32_LSECLK_MAX STM32_BOOST_LSECLK_MAX | ||
900 | #define STM32_LSECLK_BYP_MAX STM32_BOOST_LSECLK_BYP_MAX | ||
901 | #define STM32_LSECLK_MIN STM32_BOOST_LSECLK_MIN | ||
902 | #define STM32_LSECLK_BYP_MIN STM32_BOOST_LSECLK_BYP_MIN | ||
903 | #define STM32_PLLIN_MAX STM32_BOOST_PLLIN_MAX | ||
904 | #define STM32_PLLIN_MIN STM32_BOOST_PLLIN_MIN | ||
905 | #define STM32_PLLVCO_MAX STM32_BOOST_PLLVCO_MAX | ||
906 | #define STM32_PLLVCO_MIN STM32_BOOST_PLLVCO_MIN | ||
907 | #define STM32_PLLP_MAX STM32_BOOST_PLLP_MAX | ||
908 | #define STM32_PLLP_MIN STM32_BOOST_PLLP_MIN | ||
909 | #define STM32_PLLQ_MAX STM32_BOOST_PLLQ_MAX | ||
910 | #define STM32_PLLQ_MIN STM32_BOOST_PLLQ_MIN | ||
911 | #define STM32_PLLR_MAX STM32_BOOST_PLLR_MAX | ||
912 | #define STM32_PLLR_MIN STM32_BOOST_PLLR_MIN | ||
913 | #define STM32_PCLK1_MAX STM32_BOOST_PCLK1_MAX | ||
914 | #define STM32_PCLK2_MAX STM32_BOOST_PCLK2_MAX | ||
915 | #define STM32_ADCCLK_MAX STM32_BOOST_ADCCLK_MAX | ||
916 | |||
917 | #define STM32_0WS_THRESHOLD STM32_BOOST_0WS_THRESHOLD | ||
918 | #define STM32_1WS_THRESHOLD STM32_BOOST_1WS_THRESHOLD | ||
919 | #define STM32_2WS_THRESHOLD STM32_BOOST_2WS_THRESHOLD | ||
920 | #define STM32_3WS_THRESHOLD STM32_BOOST_3WS_THRESHOLD | ||
921 | #define STM32_4WS_THRESHOLD STM32_BOOST_4WS_THRESHOLD | ||
922 | #define STM32_5WS_THRESHOLD STM32_BOOST_5WS_THRESHOLD | ||
923 | #define STM32_6WS_THRESHOLD STM32_BOOST_6WS_THRESHOLD | ||
924 | #define STM32_7WS_THRESHOLD STM32_BOOST_7WS_THRESHOLD | ||
925 | #define STM32_8WS_THRESHOLD STM32_BOOST_8WS_THRESHOLD | ||
926 | |||
927 | #else /* !STM32_PWR_BOOST */ | ||
928 | #define STM32_SYSCLK_MAX STM32_VOS1_SYSCLK_MAX_NOBOOST | ||
929 | #define STM32_HSECLK_MAX STM32_VOS1_HSECLK_MAX | ||
930 | #define STM32_HSECLK_BYP_MAX STM32_VOS1_HSECLK_BYP_MAX | ||
931 | #define STM32_HSECLK_MIN STM32_VOS1_HSECLK_MIN | ||
932 | #define STM32_HSECLK_BYP_MIN STM32_VOS1_HSECLK_BYP_MIN | ||
933 | #define STM32_LSECLK_MAX STM32_VOS1_LSECLK_MAX | ||
934 | #define STM32_LSECLK_BYP_MAX STM32_VOS1_LSECLK_BYP_MAX | ||
935 | #define STM32_LSECLK_MIN STM32_VOS1_LSECLK_MIN | ||
936 | #define STM32_LSECLK_BYP_MIN STM32_VOS1_LSECLK_BYP_MIN | ||
937 | #define STM32_PLLIN_MAX STM32_VOS1_PLLIN_MAX | ||
938 | #define STM32_PLLIN_MIN STM32_VOS1_PLLIN_MIN | ||
939 | #define STM32_PLLVCO_MAX STM32_VOS1_PLLVCO_MAX | ||
940 | #define STM32_PLLVCO_MIN STM32_VOS1_PLLVCO_MIN | ||
941 | #define STM32_PLLP_MAX STM32_VOS1_PLLP_MAX | ||
942 | #define STM32_PLLP_MIN STM32_VOS1_PLLP_MIN | ||
943 | #define STM32_PLLQ_MAX STM32_VOS1_PLLQ_MAX | ||
944 | #define STM32_PLLQ_MIN STM32_VOS1_PLLQ_MIN | ||
945 | #define STM32_PLLR_MAX STM32_VOS1_PLLR_MAX | ||
946 | #define STM32_PLLR_MIN STM32_VOS1_PLLR_MIN | ||
947 | #define STM32_PCLK1_MAX STM32_VOS1_PCLK1_MAX | ||
948 | #define STM32_PCLK2_MAX STM32_VOS1_PCLK2_MAX | ||
949 | #define STM32_ADCCLK_MAX STM32_VOS1_ADCCLK_MAX | ||
950 | |||
951 | #define STM32_0WS_THRESHOLD STM32_VOS1_0WS_THRESHOLD | ||
952 | #define STM32_1WS_THRESHOLD STM32_VOS1_1WS_THRESHOLD | ||
953 | #define STM32_2WS_THRESHOLD STM32_VOS1_2WS_THRESHOLD | ||
954 | #define STM32_3WS_THRESHOLD STM32_VOS1_3WS_THRESHOLD | ||
955 | #define STM32_4WS_THRESHOLD STM32_VOS1_4WS_THRESHOLD | ||
956 | #define STM32_5WS_THRESHOLD STM32_VOS1_5WS_THRESHOLD | ||
957 | #define STM32_6WS_THRESHOLD STM32_VOS1_6WS_THRESHOLD | ||
958 | #define STM32_7WS_THRESHOLD STM32_VOS1_7WS_THRESHOLD | ||
959 | #define STM32_8WS_THRESHOLD STM32_VOS1_8WS_THRESHOLD | ||
960 | #endif /* !STM32_PWR_BOOST */ | ||
961 | |||
962 | #elif STM32_VOS == STM32_VOS_RANGE2 | ||
963 | #define STM32_SYSCLK_MAX STM32_VOS2_SYSCLK_MAX | ||
964 | #define STM32_SYSCLK_MAX_NOBOOST STM32_VOS2_SYSCLK_MAX_NOBOOST | ||
965 | #define STM32_HSECLK_MAX STM32_VOS2_HSECLK_MAX | ||
966 | #define STM32_HSECLK_BYP_MAX STM32_VOS2_HSECLK_BYP_MAX | ||
967 | #define STM32_HSECLK_MIN STM32_VOS2_HSECLK_MIN | ||
968 | #define STM32_HSECLK_BYP_MIN STM32_VOS2_HSECLK_BYP_MIN | ||
969 | #define STM32_LSECLK_MAX STM32_VOS2_LSECLK_MAX | ||
970 | #define STM32_LSECLK_BYP_MAX STM32_VOS2_LSECLK_BYP_MAX | ||
971 | #define STM32_LSECLK_MIN STM32_VOS2_LSECLK_MIN | ||
972 | #define STM32_LSECLK_BYP_MIN STM32_VOS2_LSECLK_BYP_MIN | ||
973 | #define STM32_PLLIN_MAX STM32_VOS2_PLLIN_MAX | ||
974 | #define STM32_PLLIN_MIN STM32_VOS2_PLLIN_MIN | ||
975 | #define STM32_PLLVCO_MAX STM32_VOS2_PLLVCO_MAX | ||
976 | #define STM32_PLLVCO_MIN STM32_VOS2_PLLVCO_MIN | ||
977 | #define STM32_PLLP_MAX STM32_VOS2_PLLP_MAX | ||
978 | #define STM32_PLLP_MIN STM32_VOS2_PLLP_MIN | ||
979 | #define STM32_PLLQ_MAX STM32_VOS2_PLLQ_MAX | ||
980 | #define STM32_PLLQ_MIN STM32_VOS2_PLLQ_MIN | ||
981 | #define STM32_PLLR_MAX STM32_VOS2_PLLR_MAX | ||
982 | #define STM32_PLLR_MIN STM32_VOS2_PLLR_MIN | ||
983 | #define STM32_PCLK1_MAX STM32_VOS2_PCLK1_MAX | ||
984 | #define STM32_PCLK2_MAX STM32_VOS2_PCLK2_MAX | ||
985 | #define STM32_ADCCLK_MAX STM32_VOS2_ADCCLK_MAX | ||
986 | |||
987 | #define STM32_0WS_THRESHOLD STM32_VOS2_0WS_THRESHOLD | ||
988 | #define STM32_1WS_THRESHOLD STM32_VOS2_1WS_THRESHOLD | ||
989 | #define STM32_2WS_THRESHOLD STM32_VOS2_2WS_THRESHOLD | ||
990 | #define STM32_3WS_THRESHOLD STM32_VOS2_3WS_THRESHOLD | ||
991 | #define STM32_4WS_THRESHOLD STM32_VOS2_4WS_THRESHOLD | ||
992 | #define STM32_5WS_THRESHOLD STM32_VOS2_5WS_THRESHOLD | ||
993 | #define STM32_6WS_THRESHOLD STM32_VOS2_6WS_THRESHOLD | ||
994 | #define STM32_7WS_THRESHOLD STM32_VOS2_7WS_THRESHOLD | ||
995 | #define STM32_8WS_THRESHOLD STM32_VOS2_8WS_THRESHOLD | ||
996 | |||
997 | #else | ||
998 | #error "invalid STM32_VOS value specified" | ||
999 | #endif | ||
1000 | |||
1001 | /* | ||
1002 | * HSI16 related checks. | ||
1003 | */ | ||
1004 | #if STM32_HSI16_ENABLED | ||
1005 | #else /* !STM32_HSI16_ENABLED */ | ||
1006 | |||
1007 | #if STM32_SW == STM32_SW_HSI16 | ||
1008 | #error "HSI16 not enabled, required by STM32_SW" | ||
1009 | #endif | ||
1010 | |||
1011 | #if (STM32_SW == STM32_SW_PLLRCLK) && (STM32_PLLSRC == STM32_PLLSRC_HSI16) | ||
1012 | #error "HSI16 not enabled, required by STM32_SW and STM32_PLLSRC" | ||
1013 | #endif | ||
1014 | |||
1015 | #if (STM32_MCOSEL == STM32_MCOSEL_HSI16) || \ | ||
1016 | ((STM32_MCOSEL == STM32_MCOSEL_PLLRCLK) && \ | ||
1017 | (STM32_PLLSRC == STM32_PLLSRC_HSI16)) | ||
1018 | #error "HSI16 not enabled, required by STM32_MCOSEL" | ||
1019 | #endif | ||
1020 | |||
1021 | #if (STM32_USART1SEL == STM32_USART1SEL_HSI16) | ||
1022 | #error "HSI16 not enabled, required by STM32_USART1SEL" | ||
1023 | #endif | ||
1024 | #if (STM32_USART2SEL == STM32_USART2SEL_HSI16) | ||
1025 | #error "HSI16 not enabled, required by STM32_USART2SEL" | ||
1026 | #endif | ||
1027 | #if (STM32_USART3SEL == STM32_USART3SEL_HSI16) | ||
1028 | #error "HSI16 not enabled, required by STM32_USART3SEL" | ||
1029 | #endif | ||
1030 | #if (STM32_UART4SEL == STM32_UART4SEL_HSI16) | ||
1031 | #error "HSI16 not enabled, required by STM32_UART4SEL_HSI16" | ||
1032 | #endif | ||
1033 | #if (STM32_UART5SEL == STM32_UART5SEL_HSI16) | ||
1034 | #error "HSI16 not enabled, required by STM32_UART5SEL_HSI16" | ||
1035 | #endif | ||
1036 | #if (STM32_LPUART1SEL == STM32_LPUART1SEL_HSI16) | ||
1037 | #error "HSI16 not enabled, required by STM32_LPUART1SEL" | ||
1038 | #endif | ||
1039 | |||
1040 | #if (STM32_I2C1SEL == STM32_I2C1SEL_HSI16) | ||
1041 | #error "HSI16 not enabled, required by STM32_I2C1SEL" | ||
1042 | #endif | ||
1043 | #if (STM32_I2C2SEL == STM32_I2C2SEL_HSI16) | ||
1044 | #error "HSI16 not enabled, required by STM32_I2C2SEL" | ||
1045 | #endif | ||
1046 | #if (STM32_I2C3SEL == STM32_I2C3SEL_HSI16) | ||
1047 | #error "HSI16 not enabled, required by STM32_I2C3SEL" | ||
1048 | #endif | ||
1049 | #if (STM32_I2C4SEL == STM32_I2C4SEL_HSI16) | ||
1050 | #error "HSI16 not enabled, required by STM32_I2C4SEL" | ||
1051 | #endif | ||
1052 | |||
1053 | #if (STM32_SAI1SEL == STM32_SAI1SEL_HSI16) | ||
1054 | #error "HSI16 not enabled, required by STM32_SAI1SEL" | ||
1055 | #endif | ||
1056 | #if (STM32_I2S23SEL == STM32_I2S23SEL_HSI16) | ||
1057 | #error "HSI16 not enabled, required by STM32_I2S23SEL" | ||
1058 | #endif | ||
1059 | |||
1060 | #if (STM32_LPTIM1SEL == STM32_LPTIM1SEL_HSI16) | ||
1061 | #error "HSI16 not enabled, required by STM32_LPTIM1SEL" | ||
1062 | #endif | ||
1063 | |||
1064 | #if (STM32_QSPISEL == STM32_QSPISEL_HSI16) | ||
1065 | #error "HSI16 not enabled, required by STM32_QSPISEL_HSI16" | ||
1066 | #endif | ||
1067 | |||
1068 | #endif /* !STM32_HSI16_ENABLED */ | ||
1069 | |||
1070 | /* | ||
1071 | * HSI48 related checks. | ||
1072 | */ | ||
1073 | #if STM32_HSI48_ENABLED | ||
1074 | #else /* !STM32_HSI48_ENABLED */ | ||
1075 | |||
1076 | #if STM32_MCOSEL == STM32_MCOSEL_HSI48 | ||
1077 | #error "HSI48 not enabled, required by STM32_MCOSEL" | ||
1078 | #endif | ||
1079 | |||
1080 | #if STM32_CLK48SEL == STM32_CLK48SEL_HSI48 | ||
1081 | #error "HSI48 not enabled, required by STM32_CLK48SEL" | ||
1082 | #endif | ||
1083 | |||
1084 | #endif /* !STM32_HSI48_ENABLED */ | ||
1085 | |||
1086 | /* | ||
1087 | * HSE related checks. | ||
1088 | */ | ||
1089 | #if STM32_HSE_ENABLED | ||
1090 | |||
1091 | #else /* !STM32_HSE_ENABLED */ | ||
1092 | |||
1093 | #if STM32_SW == STM32_SW_HSE | ||
1094 | #error "HSE not enabled, required by STM32_SW" | ||
1095 | #endif | ||
1096 | |||
1097 | #if (STM32_SW == STM32_SW_PLLRCLK) && (STM32_PLLSRC == STM32_PLLSRC_HSE) | ||
1098 | #error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" | ||
1099 | #endif | ||
1100 | |||
1101 | #if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ | ||
1102 | ((STM32_MCOSEL == STM32_MCOSEL_PLLRCLK) && \ | ||
1103 | (STM32_PLLSRC == STM32_PLLSRC_HSE)) | ||
1104 | #error "HSE not enabled, required by STM32_MCOSEL" | ||
1105 | #endif | ||
1106 | |||
1107 | #if STM32_RTCSEL == STM32_RTCSEL_HSEDIV | ||
1108 | #error "HSE not enabled, required by STM32_RTCSEL" | ||
1109 | #endif | ||
1110 | |||
1111 | #endif /* !STM32_HSE_ENABLED */ | ||
1112 | |||
1113 | /* | ||
1114 | * LSI related checks. | ||
1115 | */ | ||
1116 | #if STM32_LSI_ENABLED | ||
1117 | #else /* !STM32_LSI_ENABLED */ | ||
1118 | |||
1119 | #if HAL_USE_RTC && (STM32_RTCSEL == STM32_RTCSEL_LSI) | ||
1120 | #error "LSI not enabled, required by STM32_RTCSEL" | ||
1121 | #endif | ||
1122 | |||
1123 | #if STM32_MCOSEL == STM32_MCOSEL_LSI | ||
1124 | #error "LSI not enabled, required by STM32_MCOSEL" | ||
1125 | #endif | ||
1126 | |||
1127 | #if STM32_LSCOSEL == STM32_LSCOSEL_LSI | ||
1128 | #error "LSI not enabled, required by STM32_LSCOSEL" | ||
1129 | #endif | ||
1130 | |||
1131 | #endif /* !STM32_LSI_ENABLED */ | ||
1132 | |||
1133 | /* | ||
1134 | * LSE related checks. | ||
1135 | */ | ||
1136 | #if STM32_LSE_ENABLED | ||
1137 | |||
1138 | #if (STM32_LSECLK == 0) | ||
1139 | #error "LSE frequency not defined" | ||
1140 | #endif | ||
1141 | |||
1142 | #if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) | ||
1143 | #error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" | ||
1144 | #endif | ||
1145 | |||
1146 | #else /* !STM32_LSE_ENABLED */ | ||
1147 | |||
1148 | #if STM32_RTCSEL == STM32_RTCSEL_LSE | ||
1149 | #error "LSE not enabled, required by STM32_RTCSEL" | ||
1150 | #endif | ||
1151 | |||
1152 | #if STM32_MCOSEL == STM32_MCOSEL_LSE | ||
1153 | #error "LSE not enabled, required by STM32_MCOSEL" | ||
1154 | #endif | ||
1155 | |||
1156 | #if STM32_LSCOSEL == STM32_LSCOSEL_LSE | ||
1157 | #error "LSE not enabled, required by STM32_LSCOSEL" | ||
1158 | #endif | ||
1159 | |||
1160 | #endif /* !STM32_LSE_ENABLED */ | ||
1161 | |||
1162 | /** | ||
1163 | * @brief STM32_PLLM field. | ||
1164 | */ | ||
1165 | #if ((STM32_PLLM_VALUE >= 1) && (STM32_PLLM_VALUE <= 16)) || \ | ||
1166 | defined(__DOXYGEN__) | ||
1167 | #define STM32_PLLM ((STM32_PLLM_VALUE - 1) << 4) | ||
1168 | #else | ||
1169 | #error "invalid STM32_PLLM_VALUE value specified" | ||
1170 | #endif | ||
1171 | |||
1172 | /** | ||
1173 | * @brief PLL input clock frequency. | ||
1174 | */ | ||
1175 | #if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) | ||
1176 | #define STM32_PLLCLKIN (STM32_HSECLK / STM32_PLLM_VALUE) | ||
1177 | |||
1178 | #elif STM32_PLLSRC == STM32_PLLSRC_HSI16 | ||
1179 | #define STM32_PLLCLKIN (STM32_HSI16CLK / STM32_PLLM_VALUE) | ||
1180 | |||
1181 | #elif STM32_PLLSRC == STM32_PLLSRC_NOCLOCK | ||
1182 | #define STM32_PLLCLKIN 0 | ||
1183 | |||
1184 | #else | ||
1185 | #error "invalid STM32_PLLSRC value specified" | ||
1186 | #endif | ||
1187 | |||
1188 | /* | ||
1189 | * PLL input frequency range check. | ||
1190 | */ | ||
1191 | #if (STM32_PLLCLKIN != 0) && \ | ||
1192 | ((STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX)) | ||
1193 | #error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" | ||
1194 | #endif | ||
1195 | |||
1196 | /* | ||
1197 | * PLL enable check. | ||
1198 | */ | ||
1199 | #if (STM32_SW == STM32_SW_PLLRCLK) || \ | ||
1200 | (STM32_MCOSEL == STM32_MCOSEL_PLLRCLK) || \ | ||
1201 | (STM32_ADC12SEL == STM32_ADC12SEL_PLLPCLK) || \ | ||
1202 | (STM32_ADC345SEL == STM32_ADC345SEL_PLLPCLK) || \ | ||
1203 | (STM32_SAI1SEL == STM32_SAI1SEL_PLLQCLK) || \ | ||
1204 | (STM32_I2S23SEL == STM32_I2S23SEL_PLLQCLK) || \ | ||
1205 | (STM32_FDCANSEL == STM32_FDCANSEL_PLLQCLK) || \ | ||
1206 | (STM32_CLK48SEL == STM32_CLK48SEL_PLLQCLK) || \ | ||
1207 | (STM32_QSPISEL == STM32_QSPISEL_PLLQCLK) || \ | ||
1208 | defined(__DOXYGEN__) | ||
1209 | |||
1210 | #if STM32_PLLCLKIN == 0 | ||
1211 | #error "PLL activation required but no PLL clock selected" | ||
1212 | #endif | ||
1213 | |||
1214 | /** | ||
1215 | * @brief PLL activation flag. | ||
1216 | */ | ||
1217 | #define STM32_ACTIVATE_PLL TRUE | ||
1218 | #else | ||
1219 | |||
1220 | #define STM32_ACTIVATE_PLL FALSE | ||
1221 | #endif | ||
1222 | |||
1223 | /** | ||
1224 | * @brief STM32_PLLN field. | ||
1225 | */ | ||
1226 | #if ((STM32_PLLN_VALUE >= 8) && (STM32_PLLN_VALUE <= 127)) || \ | ||
1227 | defined(__DOXYGEN__) | ||
1228 | #define STM32_PLLN (STM32_PLLN_VALUE << 8) | ||
1229 | #else | ||
1230 | #error "invalid STM32_PLLN_VALUE value specified" | ||
1231 | #endif | ||
1232 | |||
1233 | /** | ||
1234 | * @brief STM32_PLLP field. | ||
1235 | */ | ||
1236 | #if (STM32_PLLP_VALUE == 7) || defined(__DOXYGEN__) | ||
1237 | #define STM32_PLLP (0 << 17) | ||
1238 | |||
1239 | #elif STM32_PLLP_VALUE == 17 | ||
1240 | #define STM32_PLLP (1 << 17) | ||
1241 | |||
1242 | #else | ||
1243 | #error "invalid STM32_PLLP_VALUE value specified" | ||
1244 | #endif | ||
1245 | |||
1246 | /** | ||
1247 | * @brief STM32_PLLQ field. | ||
1248 | */ | ||
1249 | #if (STM32_PLLQ_VALUE == 2) || defined(__DOXYGEN__) | ||
1250 | #define STM32_PLLQ (0 << 21) | ||
1251 | |||
1252 | #elif STM32_PLLQ_VALUE == 4 | ||
1253 | #define STM32_PLLQ (1 << 21) | ||
1254 | |||
1255 | #elif STM32_PLLQ_VALUE == 6 | ||
1256 | #define STM32_PLLQ (2 << 21) | ||
1257 | |||
1258 | #elif STM32_PLLQ_VALUE == 8 | ||
1259 | #define STM32_PLLQ (3 << 21) | ||
1260 | |||
1261 | #else | ||
1262 | #error "invalid STM32_PLLQ_VALUE value specified" | ||
1263 | #endif | ||
1264 | |||
1265 | /** | ||
1266 | * @brief STM32_PLLR field. | ||
1267 | */ | ||
1268 | #if (STM32_PLLR_VALUE == 2) || defined(__DOXYGEN__) | ||
1269 | #define STM32_PLLR (0 << 25) | ||
1270 | |||
1271 | #elif STM32_PLLR_VALUE == 4 | ||
1272 | #define STM32_PLLR (1 << 25) | ||
1273 | |||
1274 | #elif STM32_PLLR_VALUE == 6 | ||
1275 | #define STM32_PLLR (2 << 25) | ||
1276 | |||
1277 | #elif STM32_PLLR_VALUE == 8 | ||
1278 | #define STM32_PLLR (3 << 25) | ||
1279 | |||
1280 | #else | ||
1281 | #error "invalid STM32_PLLR_VALUE value specified" | ||
1282 | #endif | ||
1283 | |||
1284 | /** | ||
1285 | * @brief STM32_PLLPDIV field. | ||
1286 | */ | ||
1287 | #if (STM32_PLLPDIV_VALUE == 0) || \ | ||
1288 | ((STM32_PLLPDIV_VALUE >= 2) && (STM32_PLLPDIV_VALUE <= 31)) || \ | ||
1289 | defined(__DOXYGEN__) | ||
1290 | #define STM32_PLLPDIV (STM32_PLLPDIV_VALUE << 27) | ||
1291 | #else | ||
1292 | #error "invalid STM32_PLLPDIV_VALUE value specified" | ||
1293 | #endif | ||
1294 | |||
1295 | /** | ||
1296 | * @brief STM32_PLLPEN field. | ||
1297 | */ | ||
1298 | #if (STM32_ADC12SEL == STM32_ADC12SEL_PLLPCLK) || \ | ||
1299 | (STM32_ADC345SEL == STM32_ADC345SEL_PLLPCLK) || \ | ||
1300 | defined(__DOXYGEN__) | ||
1301 | #define STM32_PLLPEN (1 << 16) | ||
1302 | |||
1303 | #else | ||
1304 | #define STM32_PLLPEN (0 << 16) | ||
1305 | #endif | ||
1306 | |||
1307 | /** | ||
1308 | * @brief STM32_PLLQEN field. | ||
1309 | */ | ||
1310 | #if (STM32_QSPISEL == STM32_QSPISEL_PLLQCLK) || \ | ||
1311 | (STM32_FDCANSEL == STM32_FDCANSEL_PLLQCLK) || \ | ||
1312 | (STM32_CLK48SEL == STM32_CLK48SEL_PLLQCLK) || \ | ||
1313 | (STM32_SAI1SEL == STM32_SAI1SEL_PLLQCLK) || \ | ||
1314 | (STM32_I2S23SEL == STM32_I2S23SEL_PLLQCLK) || \ | ||
1315 | defined(__DOXYGEN__) | ||
1316 | #define STM32_PLLQEN (1 << 20) | ||
1317 | |||
1318 | #else | ||
1319 | #define STM32_PLLQEN (0 << 20) | ||
1320 | #endif | ||
1321 | |||
1322 | /** | ||
1323 | * @brief STM32_PLLREN field. | ||
1324 | */ | ||
1325 | #if (STM32_SW == STM32_SW_PLLRCLK) || \ | ||
1326 | (STM32_MCOSEL == STM32_MCOSEL_PLLRCLK) || \ | ||
1327 | defined(__DOXYGEN__) | ||
1328 | #define STM32_PLLREN (1 << 24) | ||
1329 | |||
1330 | #else | ||
1331 | #define STM32_PLLREN (0 << 24) | ||
1332 | #endif | ||
1333 | |||
1334 | /** | ||
1335 | * @brief PLL VCO frequency. | ||
1336 | */ | ||
1337 | #define STM32_PLLVCO (STM32_PLLCLKIN * STM32_PLLN_VALUE) | ||
1338 | |||
1339 | /* | ||
1340 | * PLL VCO frequency range check. | ||
1341 | */ | ||
1342 | #if STM32_ACTIVATE_PLL && \ | ||
1343 | ((STM32_PLLVCO < STM32_PLLVCO_MIN) || (STM32_PLLVCO > STM32_PLLVCO_MAX)) | ||
1344 | #error "STM32_PLLVCO outside acceptable range (STM32_PLLVCO_MIN...STM32_PLLVCO_MAX)" | ||
1345 | #endif | ||
1346 | |||
1347 | /** | ||
1348 | * @brief PLL P output clock frequency. | ||
1349 | */ | ||
1350 | #if (STM32_PLLPDIV_VALUE == 0) || defined(__DOXYGEN__) | ||
1351 | #define STM32_PLL_P_CLKOUT (STM32_PLLVCO / STM32_PLLP_VALUE) | ||
1352 | #else | ||
1353 | #define STM32_PLL_P_CLKOUT (STM32_PLLVCO / STM32_PLLPDIV_VALUE) | ||
1354 | #endif | ||
1355 | |||
1356 | /** | ||
1357 | * @brief PLL Q output clock frequency. | ||
1358 | */ | ||
1359 | #define STM32_PLL_Q_CLKOUT (STM32_PLLVCO / STM32_PLLQ_VALUE) | ||
1360 | |||
1361 | /** | ||
1362 | * @brief PLL R output clock frequency. | ||
1363 | */ | ||
1364 | #define STM32_PLL_R_CLKOUT (STM32_PLLVCO / STM32_PLLR_VALUE) | ||
1365 | |||
1366 | /* | ||
1367 | * PLL-P output frequency range check. | ||
1368 | */ | ||
1369 | #if STM32_ACTIVATE_PLL && \ | ||
1370 | ((STM32_PLL_P_CLKOUT < STM32_PLLP_MIN) || (STM32_PLL_P_CLKOUT > STM32_PLLP_MAX)) | ||
1371 | #error "STM32_PLL_P_CLKOUT outside acceptable range (STM32_PLLP_MIN...STM32_PLLP_MAX)" | ||
1372 | #endif | ||
1373 | |||
1374 | /* | ||
1375 | * PLL-Q output frequency range check. | ||
1376 | */ | ||
1377 | #if STM32_ACTIVATE_PLL && \ | ||
1378 | ((STM32_PLL_Q_CLKOUT < STM32_PLLQ_MIN) || (STM32_PLL_Q_CLKOUT > STM32_PLLQ_MAX)) | ||
1379 | #error "STM32_PLL_Q_CLKOUT outside acceptable range (STM32_PLLQ_MIN...STM32_PLLQ_MAX)" | ||
1380 | #endif | ||
1381 | |||
1382 | /* | ||
1383 | * PLL-R output frequency range check. | ||
1384 | */ | ||
1385 | #if STM32_ACTIVATE_PLL && \ | ||
1386 | ((STM32_PLL_R_CLKOUT < STM32_PLLR_MIN) || (STM32_PLL_R_CLKOUT > STM32_PLLR_MAX)) | ||
1387 | #error "STM32_PLL_R_CLKOUT outside acceptable range (STM32_PLLR_MIN...STM32_PLLR_MAX)" | ||
1388 | #endif | ||
1389 | |||
1390 | /** | ||
1391 | * @brief System clock source. | ||
1392 | */ | ||
1393 | #if STM32_NO_INIT || defined(__DOXYGEN__) | ||
1394 | #define STM32_SYSCLK STM32_HSI16CLK | ||
1395 | |||
1396 | #elif (STM32_SW == STM32_SW_HSI16) | ||
1397 | #define STM32_SYSCLK STM32_HSI16CLK | ||
1398 | |||
1399 | #elif (STM32_SW == STM32_SW_HSE) | ||
1400 | #define STM32_SYSCLK STM32_HSECLK | ||
1401 | |||
1402 | #elif (STM32_SW == STM32_SW_PLLRCLK) | ||
1403 | #define STM32_SYSCLK STM32_PLL_R_CLKOUT | ||
1404 | |||
1405 | #else | ||
1406 | #error "invalid STM32_SW value specified" | ||
1407 | #endif | ||
1408 | |||
1409 | /* | ||
1410 | * Check on the system clock. | ||
1411 | */ | ||
1412 | #if STM32_SYSCLK > STM32_SYSCLK_MAX | ||
1413 | #error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" | ||
1414 | #endif | ||
1415 | |||
1416 | /** | ||
1417 | * @brief AHB frequency. | ||
1418 | */ | ||
1419 | #if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) | ||
1420 | #define STM32_HCLK (STM32_SYSCLK / 1) | ||
1421 | |||
1422 | #elif STM32_HPRE == STM32_HPRE_DIV2 | ||
1423 | #define STM32_HCLK (STM32_SYSCLK / 2) | ||
1424 | |||
1425 | #elif STM32_HPRE == STM32_HPRE_DIV4 | ||
1426 | #define STM32_HCLK (STM32_SYSCLK / 4) | ||
1427 | |||
1428 | #elif STM32_HPRE == STM32_HPRE_DIV8 | ||
1429 | #define STM32_HCLK (STM32_SYSCLK / 8) | ||
1430 | |||
1431 | #elif STM32_HPRE == STM32_HPRE_DIV16 | ||
1432 | #define STM32_HCLK (STM32_SYSCLK / 16) | ||
1433 | |||
1434 | #elif STM32_HPRE == STM32_HPRE_DIV64 | ||
1435 | #define STM32_HCLK (STM32_SYSCLK / 64) | ||
1436 | |||
1437 | #elif STM32_HPRE == STM32_HPRE_DIV128 | ||
1438 | #define STM32_HCLK (STM32_SYSCLK / 128) | ||
1439 | |||
1440 | #elif STM32_HPRE == STM32_HPRE_DIV256 | ||
1441 | #define STM32_HCLK (STM32_SYSCLK / 256) | ||
1442 | |||
1443 | #elif STM32_HPRE == STM32_HPRE_DIV512 | ||
1444 | #define STM32_HCLK (STM32_SYSCLK / 512) | ||
1445 | |||
1446 | #else | ||
1447 | #error "invalid STM32_HPRE value specified" | ||
1448 | #endif | ||
1449 | |||
1450 | /* | ||
1451 | * AHB frequency check. | ||
1452 | */ | ||
1453 | #if STM32_HCLK > STM32_SYSCLK_MAX | ||
1454 | #error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" | ||
1455 | #endif | ||
1456 | |||
1457 | /** | ||
1458 | * @brief APB1 frequency. | ||
1459 | */ | ||
1460 | #if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) | ||
1461 | #define STM32_PCLK1 (STM32_HCLK / 1) | ||
1462 | |||
1463 | #elif STM32_PPRE1 == STM32_PPRE1_DIV2 | ||
1464 | #define STM32_PCLK1 (STM32_HCLK / 2) | ||
1465 | |||
1466 | #elif STM32_PPRE1 == STM32_PPRE1_DIV4 | ||
1467 | #define STM32_PCLK1 (STM32_HCLK / 4) | ||
1468 | |||
1469 | #elif STM32_PPRE1 == STM32_PPRE1_DIV8 | ||
1470 | #define STM32_PCLK1 (STM32_HCLK / 8) | ||
1471 | |||
1472 | #elif STM32_PPRE1 == STM32_PPRE1_DIV16 | ||
1473 | #define STM32_PCLK1 (STM32_HCLK / 16) | ||
1474 | |||
1475 | #else | ||
1476 | #error "invalid STM32_PPRE1 value specified" | ||
1477 | #endif | ||
1478 | |||
1479 | /* | ||
1480 | * APB1 frequency check. | ||
1481 | */ | ||
1482 | #if STM32_PCLK1 > STM32_PCLK1_MAX | ||
1483 | #error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" | ||
1484 | #endif | ||
1485 | |||
1486 | /** | ||
1487 | * @brief APB2 frequency. | ||
1488 | */ | ||
1489 | #if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) | ||
1490 | #define STM32_PCLK2 (STM32_HCLK / 1) | ||
1491 | |||
1492 | #elif STM32_PPRE2 == STM32_PPRE2_DIV2 | ||
1493 | #define STM32_PCLK2 (STM32_HCLK / 2) | ||
1494 | |||
1495 | #elif STM32_PPRE2 == STM32_PPRE2_DIV4 | ||
1496 | #define STM32_PCLK2 (STM32_HCLK / 4) | ||
1497 | |||
1498 | #elif STM32_PPRE2 == STM32_PPRE2_DIV8 | ||
1499 | #define STM32_PCLK2 (STM32_HCLK / 8) | ||
1500 | |||
1501 | #elif STM32_PPRE2 == STM32_PPRE2_DIV16 | ||
1502 | #define STM32_PCLK2 (STM32_HCLK / 16) | ||
1503 | |||
1504 | #else | ||
1505 | #error "invalid STM32_PPRE2 value specified" | ||
1506 | #endif | ||
1507 | |||
1508 | /* | ||
1509 | * APB2 frequency check. | ||
1510 | */ | ||
1511 | #if STM32_PCLK2 > STM32_PCLK2_MAX | ||
1512 | #error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" | ||
1513 | #endif | ||
1514 | |||
1515 | /** | ||
1516 | * @brief MCO divider clock frequency. | ||
1517 | */ | ||
1518 | #if (STM32_MCOSEL == STM32_MCOSEL_NOCLOCK) || defined(__DOXYGEN__) | ||
1519 | #define STM32_MCODIVCLK 0 | ||
1520 | |||
1521 | #elif STM32_MCOSEL == STM32_MCOSEL_SYSCLK | ||
1522 | #define STM32_MCODIVCLK STM32_SYSCLK | ||
1523 | |||
1524 | #elif STM32_MCOSEL == STM32_MCOSEL_HSI16 | ||
1525 | #define STM32_MCODIVCLK STM32_HSI16CLK | ||
1526 | |||
1527 | #elif STM32_MCOSEL == STM32_MCOSEL_HSE | ||
1528 | #define STM32_MCODIVCLK STM32_HSECLK | ||
1529 | |||
1530 | #elif STM32_MCOSEL == STM32_MCOSEL_PLLRCLK | ||
1531 | #define STM32_MCODIVCLK STM32_PLL_R_CLKOUT | ||
1532 | |||
1533 | #elif STM32_MCOSEL == STM32_MCOSEL_LSI | ||
1534 | #define STM32_MCODIVCLK STM32_LSICLK | ||
1535 | |||
1536 | #elif STM32_MCOSEL == STM32_MCOSEL_LSE | ||
1537 | #define STM32_MCODIVCLK STM32_LSECLK | ||
1538 | |||
1539 | #elif STM32_MCOSEL == STM32_MCOSEL_HSI48 | ||
1540 | #define STM32_MCODIVCLK STM32_HSI48CLK | ||
1541 | |||
1542 | #else | ||
1543 | #error "invalid STM32_MCOSEL value specified" | ||
1544 | #endif | ||
1545 | |||
1546 | /** | ||
1547 | * @brief MCO output pin clock frequency. | ||
1548 | */ | ||
1549 | #if (STM32_MCOPRE == STM32_MCOPRE_DIV1) || defined(__DOXYGEN__) | ||
1550 | #define STM32_MCOCLK STM32_MCODIVCLK | ||
1551 | |||
1552 | #elif STM32_MCOPRE == STM32_MCOPRE_DIV2 | ||
1553 | #define STM32_MCOCLK (STM32_MCODIVCLK / 2) | ||
1554 | |||
1555 | #elif STM32_MCOPRE == STM32_MCOPRE_DIV4 | ||
1556 | #define STM32_MCOCLK (STM32_MCODIVCLK / 4) | ||
1557 | |||
1558 | #elif STM32_MCOPRE == STM32_MCOPRE_DIV8 | ||
1559 | #define STM32_MCOCLK (STM32_MCODIVCLK / 8) | ||
1560 | |||
1561 | #elif STM32_MCOPRE == STM32_MCOPRE_DIV16 | ||
1562 | #define STM32_MCOCLK (STM32_MCODIVCLK / 16) | ||
1563 | |||
1564 | #else | ||
1565 | #error "invalid STM32_MCOPRE value specified" | ||
1566 | #endif | ||
1567 | |||
1568 | /** | ||
1569 | * @brief RTC clock frequency. | ||
1570 | */ | ||
1571 | #if (STM32_RTCSEL == STM32_RTCSEL_NOCLOCK) || defined(__DOXYGEN__) | ||
1572 | #define STM32_RTCCLK 0 | ||
1573 | |||
1574 | #elif STM32_RTCSEL == STM32_RTCSEL_LSE | ||
1575 | #define STM32_RTCCLK STM32_LSECLK | ||
1576 | |||
1577 | #elif STM32_RTCSEL == STM32_RTCSEL_LSI | ||
1578 | #define STM32_RTCCLK STM32_LSICLK | ||
1579 | |||
1580 | #elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV | ||
1581 | #define STM32_RTCCLK (STM32_HSECLK / 32) | ||
1582 | |||
1583 | #else | ||
1584 | #error "invalid STM32_RTCSEL value specified" | ||
1585 | #endif | ||
1586 | |||
1587 | /** | ||
1588 | * @brief USART1 clock frequency. | ||
1589 | */ | ||
1590 | #if (STM32_USART1SEL == STM32_USART1SEL_PCLK2) || defined(__DOXYGEN__) | ||
1591 | #define STM32_USART1CLK STM32_PCLK2 | ||
1592 | |||
1593 | #elif STM32_USART1SEL == STM32_USART1SEL_SYSCLK | ||
1594 | #define STM32_USART1CLK STM32_SYSCLK | ||
1595 | |||
1596 | #elif STM32_USART1SEL == STM32_USART1SEL_HSI16 | ||
1597 | #define STM32_USART1CLK STM32_HSI16CLK | ||
1598 | |||
1599 | #elif STM32_USART1SEL == STM32_USART1SEL_LSE | ||
1600 | #define STM32_USART1CLK STM32_LSECLK | ||
1601 | |||
1602 | #else | ||
1603 | #error "invalid source selected for USART1 clock" | ||
1604 | #endif | ||
1605 | |||
1606 | /** | ||
1607 | * @brief USART2 clock frequency. | ||
1608 | */ | ||
1609 | #if (STM32_USART2SEL == STM32_USART2SEL_PCLK1) || defined(__DOXYGEN__) | ||
1610 | #define STM32_USART2CLK STM32_PCLK1 | ||
1611 | |||
1612 | #elif STM32_USART2SEL == STM32_USART2SEL_SYSCLK | ||
1613 | #define STM32_USART2CLK STM32_SYSCLK | ||
1614 | |||
1615 | #elif STM32_USART2SEL == STM32_USART2SEL_HSI16 | ||
1616 | #define STM32_USART2CLK STM32_HSI16CLK | ||
1617 | |||
1618 | #elif STM32_USART2SEL == STM32_USART2SEL_LSE | ||
1619 | #define STM32_USART2CLK STM32_LSECLK | ||
1620 | |||
1621 | #else | ||
1622 | #error "invalid source selected for USART2 clock" | ||
1623 | #endif | ||
1624 | |||
1625 | /** | ||
1626 | * @brief USART3 clock frequency. | ||
1627 | */ | ||
1628 | #if (STM32_USART3SEL == STM32_USART3SEL_PCLK1) || defined(__DOXYGEN__) | ||
1629 | #define STM32_USART3CLK STM32_PCLK1 | ||
1630 | |||
1631 | #elif STM32_USART3SEL == STM32_USART3SEL_SYSCLK | ||
1632 | #define STM32_USART3CLK STM32_SYSCLK | ||
1633 | |||
1634 | #elif STM32_USART3SEL == STM32_USART3SEL_HSI16 | ||
1635 | #define STM32_USART3CLK STM32_HSI16CLK | ||
1636 | |||
1637 | #elif STM32_USART3SEL == STM32_USART3SEL_LSE | ||
1638 | #define STM32_USART3CLK STM32_LSECLK | ||
1639 | |||
1640 | #else | ||
1641 | #error "invalid source selected for USART3 clock" | ||
1642 | #endif | ||
1643 | |||
1644 | /** | ||
1645 | * @brief UART4 clock frequency. | ||
1646 | */ | ||
1647 | #if (STM32_UART4SEL == STM32_UART4SEL_PCLK1) || defined(__DOXYGEN__) | ||
1648 | #define STM32_UART4CLK STM32_PCLK1 | ||
1649 | |||
1650 | #elif STM32_UART4SEL == STM32_UART4SEL_SYSCLK | ||
1651 | #define STM32_UART4CLK STM32_SYSCLK | ||
1652 | |||
1653 | #elif STM32_UART4SEL == STM32_UART4SEL_HSI16 | ||
1654 | #define STM32_UART4CLK STM32_HSI16CLK | ||
1655 | |||
1656 | #elif STM32_UART4SEL == STM32_UART4SEL_LSE | ||
1657 | #define STM32_UART4CLK STM32_LSECLK | ||
1658 | |||
1659 | #else | ||
1660 | #error "invalid source selected for UART4 clock" | ||
1661 | #endif | ||
1662 | |||
1663 | /** | ||
1664 | * @brief UART5 clock frequency. | ||
1665 | */ | ||
1666 | #if (STM32_UART5SEL == STM32_UART5SEL_PCLK1) || defined(__DOXYGEN__) | ||
1667 | #define STM32_UART5CLK STM32_PCLK1 | ||
1668 | |||
1669 | #elif STM32_UART5SEL == STM32_UART5SEL_SYSCLK | ||
1670 | #define STM32_UART5CLK STM32_SYSCLK | ||
1671 | |||
1672 | #elif STM32_UART5SEL == STM32_UART5SEL_HSI16 | ||
1673 | #define STM32_UART5CLK STM32_HSI16CLK | ||
1674 | |||
1675 | #elif STM32_UART5SEL == STM32_UART5SEL_LSE | ||
1676 | #define STM32_UART5CLK STM32_LSECLK | ||
1677 | |||
1678 | #else | ||
1679 | #error "invalid source selected for UART5 clock" | ||
1680 | #endif | ||
1681 | |||
1682 | /** | ||
1683 | * @brief LPUART1 clock frequency. | ||
1684 | */ | ||
1685 | #if (STM32_LPUART1SEL == STM32_LPUART1SEL_PCLK1) || defined(__DOXYGEN__) | ||
1686 | #define STM32_LPUART1CLK STM32_PCLK1 | ||
1687 | |||
1688 | #elif STM32_LPUART1SEL == STM32_LPUART1SEL_SYSCLK | ||
1689 | #define STM32_LPUART1CLK STM32_SYSCLK | ||
1690 | |||
1691 | #elif STM32_LPUART1SEL == STM32_LPUART1SEL_HSI16 | ||
1692 | #define STM32_LPUART1CLK STM32_HSI16CLK | ||
1693 | |||
1694 | #elif STM32_LPUART1SEL == STM32_LPUART1SEL_LSE | ||
1695 | #define STM32_LPUART1CLK STM32_LSECLK | ||
1696 | |||
1697 | #else | ||
1698 | #error "invalid source selected for LPUART1 clock" | ||
1699 | #endif | ||
1700 | |||
1701 | /** | ||
1702 | * @brief I2C1 clock frequency. | ||
1703 | */ | ||
1704 | #if (STM32_I2C1SEL == STM32_I2C1SEL_PCLK1) || defined(__DOXYGEN__) | ||
1705 | #define STM32_I2C1CLK STM32_PCLK1 | ||
1706 | |||
1707 | #elif STM32_I2C1SEL == STM32_I2C1SEL_SYSCLK | ||
1708 | #define STM32_I2C1CLK STM32_SYSCLK | ||
1709 | |||
1710 | #elif STM32_I2C1SEL == STM32_I2C1SEL_HSI16 | ||
1711 | #define STM32_I2C1CLK STM32_HSI16CLK | ||
1712 | |||
1713 | #else | ||
1714 | #error "invalid source selected for I2C1 clock" | ||
1715 | #endif | ||
1716 | |||
1717 | /** | ||
1718 | * @brief I2C2 clock frequency. | ||
1719 | */ | ||
1720 | #if (STM32_I2C2SEL == STM32_I2C2SEL_PCLK1) || defined(__DOXYGEN__) | ||
1721 | #define STM32_I2C2CLK STM32_PCLK1 | ||
1722 | |||
1723 | #elif STM32_I2C2SEL == STM32_I2C2SEL_SYSCLK | ||
1724 | #define STM32_I2C2CLK STM32_SYSCLK | ||
1725 | |||
1726 | #elif STM32_I2C2SEL == STM32_I2C2SEL_HSI16 | ||
1727 | #define STM32_I2C2CLK STM32_HSI16CLK | ||
1728 | |||
1729 | #else | ||
1730 | #error "invalid source selected for I2C1 clock" | ||
1731 | #endif | ||
1732 | |||
1733 | /** | ||
1734 | * @brief I2C3 clock frequency. | ||
1735 | */ | ||
1736 | #if (STM32_I2C3SEL == STM32_I2C3SEL_PCLK1) || defined(__DOXYGEN__) | ||
1737 | #define STM32_I2C3CLK STM32_PCLK1 | ||
1738 | |||
1739 | #elif STM32_I2C3SEL == STM32_I2C3SEL_SYSCLK | ||
1740 | #define STM32_I2C3CLK STM32_SYSCLK | ||
1741 | |||
1742 | #elif STM32_I2C3SEL == STM32_I2C3SEL_HSI16 | ||
1743 | #define STM32_I2C3CLK STM32_HSI16CLK | ||
1744 | |||
1745 | #else | ||
1746 | #error "invalid source selected for I2C3 clock" | ||
1747 | #endif | ||
1748 | |||
1749 | /** | ||
1750 | * @brief I2C4 clock frequency. | ||
1751 | */ | ||
1752 | #if (STM32_I2C4SEL == STM32_I2C4SEL_PCLK1) || defined(__DOXYGEN__) | ||
1753 | #define STM32_I2C4CLK STM32_PCLK1 | ||
1754 | |||
1755 | #elif STM32_I2C4SEL == STM32_I2C4SEL_SYSCLK | ||
1756 | #define STM32_I2C4CLK STM32_SYSCLK | ||
1757 | |||
1758 | #elif STM32_I2C4SEL == STM32_I2C4SEL_HSI16 | ||
1759 | #define STM32_I2C4CLK STM32_HSI16CLK | ||
1760 | |||
1761 | #else | ||
1762 | #error "invalid source selected for I2C4 clock" | ||
1763 | #endif | ||
1764 | |||
1765 | /** | ||
1766 | * @brief LPTIM1 clock frequency. | ||
1767 | */ | ||
1768 | #if (STM32_LPTIM1SEL == STM32_LPTIM1SEL_PCLK1) || defined(__DOXYGEN__) | ||
1769 | #define STM32_LPTIM1CLK STM32_PCLK1 | ||
1770 | |||
1771 | #elif STM32_LPTIM1SEL == STM32_LPTIM1SEL_LSI | ||
1772 | #define STM32_LPTIM1CLK STM32_LSICLK | ||
1773 | |||
1774 | #elif STM32_LPTIM1SEL == STM32_LPTIM1SEL_HSI16 | ||
1775 | #define STM32_LPTIM1CLK STM32_HSI16CLK | ||
1776 | |||
1777 | #elif STM32_LPTIM1SEL == STM32_LPTIM1SEL_LSE | ||
1778 | #define STM32_LPTIM1CLK STM32_LSECLK | ||
1779 | |||
1780 | #else | ||
1781 | #error "invalid source selected for LPTIM1 clock" | ||
1782 | #endif | ||
1783 | |||
1784 | /** | ||
1785 | * @brief SAI1 clock frequency. | ||
1786 | */ | ||
1787 | #if (STM32_SAI1SEL == STM32_SAI1SEL_SYSCLK) || defined(__DOXYGEN__) | ||
1788 | #define STM32_SAI1CLK STM32_SYSCLK | ||
1789 | |||
1790 | #elif STM32_SAI1SEL == STM32_SAI1SEL_PLLQCLK | ||
1791 | #define STM32_SAI1CLK STM32_PLL_Q_CLKOUT | ||
1792 | |||
1793 | #elif STM32_SAI1SEL == STM32_SAI1SEL_HSI16 | ||
1794 | #define STM32_SAI1CLK STM32_HSI16CLK | ||
1795 | |||
1796 | #elif STM32_SAI1SEL == STM32_SAI1SEL_CKIN | ||
1797 | #define STM32_SAI1CLK 0 /* Unknown, would require a board value */ | ||
1798 | |||
1799 | #else | ||
1800 | #error "invalid source selected for SAI1 clock" | ||
1801 | #endif | ||
1802 | |||
1803 | /** | ||
1804 | * @brief I2S23 clock frequency. | ||
1805 | */ | ||
1806 | #if (STM32_I2S23SEL == STM32_I2S23SEL_SYSCLK) || defined(__DOXYGEN__) | ||
1807 | #define STM32_I2S23CLK STM32_SYSCLK | ||
1808 | |||
1809 | #elif STM32_I2S23SEL == STM32_I2S23SEL_PLLPCLK | ||
1810 | #define STM32_I2S23CLK STM32_PLL_P_CLKOUT | ||
1811 | |||
1812 | #elif STM32_I2S23SEL == STM32_I2S23SEL_HSI16 | ||
1813 | #define STM32_I2S23CLK STM32_HSI16CLK | ||
1814 | |||
1815 | #elif STM32_I2S23SEL == STM32_I2S23SEL_CKIN | ||
1816 | #define STM32_I2S23CLK 0 /* Unknown, would require a board value */ | ||
1817 | |||
1818 | #else | ||
1819 | #error "invalid source selected for SAI1 clock" | ||
1820 | #endif | ||
1821 | |||
1822 | /** | ||
1823 | * @brief FDCAN clock frequency. | ||
1824 | */ | ||
1825 | #if (STM32_FDCANSEL == STM32_FDCANSEL_HSE) || defined(__DOXYGEN__) | ||
1826 | #define STM32_FDCANCLK STM32_HSECLK | ||
1827 | |||
1828 | #elif STM32_FDCANSEL == STM32_FDCANSEL_PLLQCLK | ||
1829 | #define STM32_FDCANCLK STM32_PLL_Q_CLKOUT | ||
1830 | |||
1831 | #elif STM32_FDCANSEL == STM32_FDCANSEL_PCLK1 | ||
1832 | #define STM32_FDCANCLK STM32_PCLK1 | ||
1833 | |||
1834 | #else | ||
1835 | #error "invalid source selected for FDCAN clock" | ||
1836 | #endif | ||
1837 | |||
1838 | /** | ||
1839 | * @brief 48MHz clock frequency. | ||
1840 | */ | ||
1841 | #if (STM32_CLK48SEL == STM32_CLK48SEL_HSI48) || defined(__DOXYGEN__) | ||
1842 | #define STM32_48CLK STM32_HSI48CLK | ||
1843 | |||
1844 | #elif STM32_CLK48SEL == STM32_CLK48SEL_PLLQCLK | ||
1845 | #define STM32_48CLK STM32_PLL_Q_CLKOUT | ||
1846 | |||
1847 | #else | ||
1848 | #error "invalid source selected for 48MHz clock" | ||
1849 | #endif | ||
1850 | |||
1851 | /** | ||
1852 | * @brief ADC clock frequency. | ||
1853 | */ | ||
1854 | #if (STM32_ADC12SEL == STM32_ADC12SEL_NOCLK) || defined(__DOXYGEN__) | ||
1855 | #define STM32_ADC12CLK 0 | ||
1856 | |||
1857 | #elif STM32_ADC12SEL == STM32_ADC12SEL_PLLPCLK | ||
1858 | #define STM32_ADC12CLK STM32_PLL_P_CLKOUT | ||
1859 | |||
1860 | #elif STM32_ADC12SEL == STM32_ADC12SEL_SYSCLK | ||
1861 | #define STM32_ADC12CLK STM32_SYSCLK | ||
1862 | |||
1863 | #else | ||
1864 | #error "invalid source selected for ADC clock" | ||
1865 | #endif | ||
1866 | |||
1867 | /** | ||
1868 | * @brief ADC clock frequency. | ||
1869 | */ | ||
1870 | #if (STM32_ADC345SEL == STM32_ADC345SEL_NOCLK) || defined(__DOXYGEN__) | ||
1871 | #define STM32_ADC345CLK 0 | ||
1872 | |||
1873 | #elif STM32_ADC345SEL == STM32_ADC345SEL_PLLPCLK | ||
1874 | #define STM32_ADC345CLK STM32_PLL_P_CLKOUT | ||
1875 | |||
1876 | #elif STM32_ADC345SEL == STM32_ADC345SEL_SYSCLK | ||
1877 | #define STM32_ADC345CLK STM32_SYSCLK | ||
1878 | |||
1879 | #else | ||
1880 | #error "invalid source selected for ADC clock" | ||
1881 | #endif | ||
1882 | |||
1883 | /** | ||
1884 | * @brief TIMP1CLK clock frequency. | ||
1885 | */ | ||
1886 | #if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) | ||
1887 | #define STM32_TIMP1CLK (STM32_PCLK1 * 1) | ||
1888 | #else | ||
1889 | #define STM32_TIMP1CLK (STM32_PCLK1 * 2) | ||
1890 | #endif | ||
1891 | |||
1892 | /** | ||
1893 | * @brief TIMP2CLK clock frequency. | ||
1894 | */ | ||
1895 | #if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) | ||
1896 | #define STM32_TIMP2CLK (STM32_PCLK2 * 1) | ||
1897 | #else | ||
1898 | #define STM32_TIMP2CLK (STM32_PCLK2 * 2) | ||
1899 | #endif | ||
1900 | |||
1901 | /** | ||
1902 | * @brief Clock of timers connected to APB1. | ||
1903 | */ | ||
1904 | #define STM32_TIMCLK1 STM32_TIMP1CLK | ||
1905 | |||
1906 | /** | ||
1907 | * @brief Clock of timers connected to APB2. | ||
1908 | */ | ||
1909 | #define STM32_TIMCLK2 STM32_TIMP2CLK | ||
1910 | |||
1911 | /** | ||
1912 | * @brief RNG clock point. | ||
1913 | */ | ||
1914 | #define STM32_RNGCLK STM32_48CLK | ||
1915 | |||
1916 | /** | ||
1917 | * @brief USB clock point. | ||
1918 | */ | ||
1919 | #define STM32_USBCLK STM32_48CLK | ||
1920 | |||
1921 | /** | ||
1922 | * @brief Voltage boost settings. | ||
1923 | */ | ||
1924 | #if STM32_PWR_BOOST || defined(__DOXYGEN__) | ||
1925 | #define STM32_CR5BITS PWR_CR5_R1MODE | ||
1926 | #else | ||
1927 | #define STM32_CR5BITS 0U | ||
1928 | #endif | ||
1929 | |||
1930 | /** | ||
1931 | * @brief Flash settings. | ||
1932 | */ | ||
1933 | #if (STM32_HCLK <= STM32_0WS_THRESHOLD) || defined(__DOXYGEN__) | ||
1934 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_0WS | ||
1935 | |||
1936 | #elif STM32_HCLK <= STM32_1WS_THRESHOLD | ||
1937 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_1WS | ||
1938 | |||
1939 | #elif STM32_HCLK <= STM32_2WS_THRESHOLD | ||
1940 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_2WS | ||
1941 | |||
1942 | #elif STM32_HCLK <= STM32_3WS_THRESHOLD | ||
1943 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_3WS | ||
1944 | |||
1945 | #elif STM32_HCLK <= STM32_4WS_THRESHOLD | ||
1946 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_4WS | ||
1947 | |||
1948 | #else | ||
1949 | #define STM32_FLASHBITS FLASH_ACR_LATENCY_5WS | ||
1950 | #endif | ||
1951 | |||
1952 | /*===========================================================================*/ | ||
1953 | /* Driver data structures and types. */ | ||
1954 | /*===========================================================================*/ | ||
1955 | |||
1956 | /*===========================================================================*/ | ||
1957 | /* Driver macros. */ | ||
1958 | /*===========================================================================*/ | ||
1959 | |||
1960 | /*===========================================================================*/ | ||
1961 | /* External declarations. */ | ||
1962 | /*===========================================================================*/ | ||
1963 | |||
1964 | /* Various helpers.*/ | ||
1965 | #include "nvic.h" | ||
1966 | #include "cache.h" | ||
1967 | #include "mpu_v7m.h" | ||
1968 | #include "stm32_isr.h" | ||
1969 | #include "stm32_dma.h" | ||
1970 | #include "stm32_exti.h" | ||
1971 | #include "stm32_rcc.h" | ||
1972 | #include "stm32_tim.h" | ||
1973 | |||
1974 | #ifdef __cplusplus | ||
1975 | extern "C" { | ||
1976 | #endif | ||
1977 | void hal_lld_init(void); | ||
1978 | void stm32_clock_init(void); | ||
1979 | #ifdef __cplusplus | ||
1980 | } | ||
1981 | #endif | ||
1982 | |||
1983 | #endif /* HAL_LLD_H */ | ||
1984 | |||
1985 | /** @} */ | ||