Mercurial > pub > halpp
comparison f103c8/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c @ 2:0c59e7a7782a
Working on GPIO and RCC
author | cin |
---|---|
date | Mon, 16 Jan 2017 11:04:47 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:a0b14b11ad9f | 2:0c59e7a7782a |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @file stm32f1xx_hal_rcc_ex.c | |
4 * @author MCD Application Team | |
5 * @version V1.0.4 | |
6 * @date 29-April-2016 | |
7 * @brief Extended RCC HAL module driver. | |
8 * This file provides firmware functions to manage the following | |
9 * functionalities RCC extension peripheral: | |
10 * + Extended Peripheral Control functions | |
11 * | |
12 ****************************************************************************** | |
13 * @attention | |
14 * | |
15 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
16 * | |
17 * Redistribution and use in source and binary forms, with or without modification, | |
18 * are permitted provided that the following conditions are met: | |
19 * 1. Redistributions of source code must retain the above copyright notice, | |
20 * this list of conditions and the following disclaimer. | |
21 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
22 * this list of conditions and the following disclaimer in the documentation | |
23 * and/or other materials provided with the distribution. | |
24 * 3. Neither the name of STMicroelectronics nor the names of its contributors | |
25 * may be used to endorse or promote products derived from this software | |
26 * without specific prior written permission. | |
27 * | |
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
29 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
31 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
34 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
36 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
38 * | |
39 ****************************************************************************** | |
40 */ | |
41 | |
42 /* Includes ------------------------------------------------------------------*/ | |
43 #include "stm32f1xx_hal.h" | |
44 | |
45 /** @addtogroup STM32F1xx_HAL_Driver | |
46 * @{ | |
47 */ | |
48 | |
49 #ifdef HAL_RCC_MODULE_ENABLED | |
50 | |
51 /** @defgroup RCCEx RCCEx | |
52 * @brief RCC Extension HAL module driver. | |
53 * @{ | |
54 */ | |
55 | |
56 /* Private typedef -----------------------------------------------------------*/ | |
57 /* Private define ------------------------------------------------------------*/ | |
58 /** @defgroup RCCEx_Private_Constants RCCEx Private Constants | |
59 * @{ | |
60 */ | |
61 /** | |
62 * @} | |
63 */ | |
64 | |
65 /* Private macro -------------------------------------------------------------*/ | |
66 /** @defgroup RCCEx_Private_Macros RCCEx Private Macros | |
67 * @{ | |
68 */ | |
69 /** | |
70 * @} | |
71 */ | |
72 | |
73 /* Private variables ---------------------------------------------------------*/ | |
74 /* Private function prototypes -----------------------------------------------*/ | |
75 /* Private functions ---------------------------------------------------------*/ | |
76 | |
77 /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions | |
78 * @{ | |
79 */ | |
80 | |
81 /** @defgroup RCCEx_Exported_Functions_Group1 Peripheral Control functions | |
82 * @brief Extended Peripheral Control functions | |
83 * | |
84 @verbatim | |
85 =============================================================================== | |
86 ##### Extended Peripheral Control functions ##### | |
87 =============================================================================== | |
88 [..] | |
89 This subsection provides a set of functions allowing to control the RCC Clocks | |
90 frequencies. | |
91 [..] | |
92 (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to | |
93 select the RTC clock source; in this case the Backup domain will be reset in | |
94 order to modify the RTC Clock source, as consequence RTC registers (including | |
95 the backup registers) are set to their reset values. | |
96 | |
97 @endverbatim | |
98 * @{ | |
99 */ | |
100 | |
101 /** | |
102 * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the | |
103 * RCC_PeriphCLKInitTypeDef. | |
104 * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that | |
105 * contains the configuration information for the Extended Peripherals clocks(RTC clock). | |
106 * | |
107 * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select | |
108 * the RTC clock source; in this case the Backup domain will be reset in | |
109 * order to modify the RTC Clock source, as consequence RTC registers (including | |
110 * the backup registers) are set to their reset values. | |
111 * | |
112 * @note In case of STM32F105xC or STM32F107xC devices, PLLI2S will be enabled if requested on | |
113 * one of 2 I2S interfaces. When PLLI2S is enabled, you need to call HAL_RCCEx_DisablePLLI2S to | |
114 * manually disable it. | |
115 * | |
116 * @retval HAL status | |
117 */ | |
118 HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) | |
119 { | |
120 uint32_t tickstart = 0, temp_reg = 0; | |
121 #if defined(STM32F105xC) || defined(STM32F107xC) | |
122 uint32_t pllactive = 0; | |
123 #endif /* STM32F105xC || STM32F107xC */ | |
124 | |
125 /* Check the parameters */ | |
126 assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); | |
127 | |
128 /*------------------------------- RTC/LCD Configuration ------------------------*/ | |
129 if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)) | |
130 { | |
131 /* check for RTC Parameters used to output RTCCLK */ | |
132 assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); | |
133 | |
134 /* Enable Power Clock*/ | |
135 __HAL_RCC_PWR_CLK_ENABLE(); | |
136 | |
137 /* Enable write access to Backup domain */ | |
138 SET_BIT(PWR->CR, PWR_CR_DBP); | |
139 | |
140 /* Wait for Backup domain Write protection disable */ | |
141 tickstart = HAL_GetTick(); | |
142 | |
143 while((PWR->CR & PWR_CR_DBP) == RESET) | |
144 { | |
145 if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) | |
146 { | |
147 return HAL_TIMEOUT; | |
148 } | |
149 } | |
150 | |
151 /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ | |
152 temp_reg = (RCC->BDCR & RCC_BDCR_RTCSEL); | |
153 if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) | |
154 { | |
155 /* Store the content of BDCR register before the reset of Backup Domain */ | |
156 temp_reg = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); | |
157 /* RTC Clock selection can be changed only if the Backup Domain is reset */ | |
158 __HAL_RCC_BACKUPRESET_FORCE(); | |
159 __HAL_RCC_BACKUPRESET_RELEASE(); | |
160 /* Restore the Content of BDCR register */ | |
161 RCC->BDCR = temp_reg; | |
162 | |
163 /* Wait for LSERDY if LSE was enabled */ | |
164 if (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSEON)) | |
165 { | |
166 /* Get timeout */ | |
167 tickstart = HAL_GetTick(); | |
168 | |
169 /* Wait till LSE is ready */ | |
170 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) | |
171 { | |
172 if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) | |
173 { | |
174 return HAL_TIMEOUT; | |
175 } | |
176 } | |
177 } | |
178 } | |
179 __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); | |
180 } | |
181 | |
182 /*------------------------------ ADC clock Configuration ------------------*/ | |
183 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) | |
184 { | |
185 /* Check the parameters */ | |
186 assert_param(IS_RCC_ADCPLLCLK_DIV(PeriphClkInit->AdcClockSelection)); | |
187 | |
188 /* Configure the ADC clock source */ | |
189 __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection); | |
190 } | |
191 | |
192 #if defined(STM32F105xC) || defined(STM32F107xC) | |
193 /*------------------------------ I2S2 Configuration ------------------------*/ | |
194 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S2) == RCC_PERIPHCLK_I2S2) | |
195 { | |
196 /* Check the parameters */ | |
197 assert_param(IS_RCC_I2S2CLKSOURCE(PeriphClkInit->I2s2ClockSelection)); | |
198 | |
199 /* Configure the I2S2 clock source */ | |
200 __HAL_RCC_I2S2_CONFIG(PeriphClkInit->I2s2ClockSelection); | |
201 } | |
202 | |
203 /*------------------------------ I2S3 Configuration ------------------------*/ | |
204 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S3) == RCC_PERIPHCLK_I2S3) | |
205 { | |
206 /* Check the parameters */ | |
207 assert_param(IS_RCC_I2S3CLKSOURCE(PeriphClkInit->I2s3ClockSelection)); | |
208 | |
209 /* Configure the I2S3 clock source */ | |
210 __HAL_RCC_I2S3_CONFIG(PeriphClkInit->I2s3ClockSelection); | |
211 } | |
212 | |
213 /*------------------------------ PLL I2S Configuration ----------------------*/ | |
214 /* Check that PLLI2S need to be enabled */ | |
215 if (HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_I2S2SRC) || HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) | |
216 { | |
217 /* Update flag to indicate that PLL I2S should be active */ | |
218 pllactive = 1; | |
219 } | |
220 | |
221 /* Check if PLL I2S need to be enabled */ | |
222 if (pllactive == 1) | |
223 { | |
224 /* Enable PLL I2S only if not active */ | |
225 if (HAL_IS_BIT_CLR(RCC->CR, RCC_CR_PLL3ON)) | |
226 { | |
227 /* Check the parameters */ | |
228 assert_param(IS_RCC_PLLI2S_MUL(PeriphClkInit->PLLI2S.PLLI2SMUL)); | |
229 assert_param(IS_RCC_HSE_PREDIV2(PeriphClkInit->PLLI2S.HSEPrediv2Value)); | |
230 | |
231 /* Prediv2 can be written only when the PLL2 is disabled. */ | |
232 /* Return an error only if new value is different from the programmed value */ | |
233 if (HAL_IS_BIT_SET(RCC->CR,RCC_CR_PLL2ON) && \ | |
234 (__HAL_RCC_HSE_GET_PREDIV2() != PeriphClkInit->PLLI2S.HSEPrediv2Value)) | |
235 { | |
236 return HAL_ERROR; | |
237 } | |
238 | |
239 /* Configure the HSE prediv2 factor --------------------------------*/ | |
240 __HAL_RCC_HSE_PREDIV2_CONFIG(PeriphClkInit->PLLI2S.HSEPrediv2Value); | |
241 | |
242 /* Configure the main PLLI2S multiplication factors. */ | |
243 __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SMUL); | |
244 | |
245 /* Enable the main PLLI2S. */ | |
246 __HAL_RCC_PLLI2S_ENABLE(); | |
247 | |
248 /* Get Start Tick*/ | |
249 tickstart = HAL_GetTick(); | |
250 | |
251 /* Wait till PLLI2S is ready */ | |
252 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) | |
253 { | |
254 if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) | |
255 { | |
256 return HAL_TIMEOUT; | |
257 } | |
258 } | |
259 } | |
260 else | |
261 { | |
262 /* Return an error only if user wants to change the PLLI2SMUL whereas PLLI2S is active */ | |
263 if (READ_BIT(RCC->CFGR2, RCC_CFGR2_PLL3MUL) != PeriphClkInit->PLLI2S.PLLI2SMUL) | |
264 { | |
265 return HAL_ERROR; | |
266 } | |
267 } | |
268 } | |
269 #endif /* STM32F105xC || STM32F107xC */ | |
270 | |
271 #if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ | |
272 || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ | |
273 || defined(STM32F105xC) || defined(STM32F107xC) | |
274 /*------------------------------ USB clock Configuration ------------------*/ | |
275 if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) | |
276 { | |
277 /* Check the parameters */ | |
278 assert_param(IS_RCC_USBPLLCLK_DIV(PeriphClkInit->UsbClockSelection)); | |
279 | |
280 /* Configure the USB clock source */ | |
281 __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection); | |
282 } | |
283 #endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ | |
284 | |
285 return HAL_OK; | |
286 } | |
287 | |
288 /** | |
289 * @brief Get the PeriphClkInit according to the internal | |
290 * RCC configuration registers. | |
291 * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that | |
292 * returns the configuration information for the Extended Peripherals clocks(RTC, I2S, ADC clocks). | |
293 * @retval None | |
294 */ | |
295 void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) | |
296 { | |
297 uint32_t srcclk = 0; | |
298 | |
299 /* Set all possible values for the extended clock type parameter------------*/ | |
300 PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_RTC; | |
301 | |
302 /* Get the RTC configuration -----------------------------------------------*/ | |
303 srcclk = __HAL_RCC_GET_RTC_SOURCE(); | |
304 /* Source clock is LSE or LSI*/ | |
305 PeriphClkInit->RTCClockSelection = srcclk; | |
306 | |
307 /* Get the ADC clock configuration -----------------------------------------*/ | |
308 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC; | |
309 PeriphClkInit->AdcClockSelection = __HAL_RCC_GET_ADC_SOURCE(); | |
310 | |
311 #if defined(STM32F105xC) || defined(STM32F107xC) | |
312 /* Get the I2S2 clock configuration -----------------------------------------*/ | |
313 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S2; | |
314 PeriphClkInit->I2s2ClockSelection = __HAL_RCC_GET_I2S2_SOURCE(); | |
315 | |
316 /* Get the I2S3 clock configuration -----------------------------------------*/ | |
317 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S3; | |
318 PeriphClkInit->I2s3ClockSelection = __HAL_RCC_GET_I2S3_SOURCE(); | |
319 | |
320 #endif /* STM32F105xC || STM32F107xC */ | |
321 | |
322 #if defined(STM32F103xE) || defined(STM32F103xG) | |
323 /* Get the I2S2 clock configuration -----------------------------------------*/ | |
324 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S2; | |
325 PeriphClkInit->I2s2ClockSelection = RCC_I2S2CLKSOURCE_SYSCLK; | |
326 | |
327 /* Get the I2S3 clock configuration -----------------------------------------*/ | |
328 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S3; | |
329 PeriphClkInit->I2s3ClockSelection = RCC_I2S3CLKSOURCE_SYSCLK; | |
330 | |
331 #endif /* STM32F103xE || STM32F103xG */ | |
332 | |
333 #if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ | |
334 || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ | |
335 || defined(STM32F105xC) || defined(STM32F107xC) | |
336 /* Get the USB clock configuration -----------------------------------------*/ | |
337 PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USB; | |
338 PeriphClkInit->UsbClockSelection = __HAL_RCC_GET_USB_SOURCE(); | |
339 #endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ | |
340 } | |
341 | |
342 /** | |
343 * @brief Returns the peripheral clock frequency | |
344 * @note Returns 0 if peripheral clock is unknown | |
345 * @param PeriphClk Peripheral clock identifier | |
346 * This parameter can be one of the following values: | |
347 * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock | |
348 * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock | |
349 @if STM32F103xE | |
350 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
351 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
352 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
353 @endif | |
354 @if STM32F103xG | |
355 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
356 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
357 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
358 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
359 @endif | |
360 @if STM32F105xC | |
361 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
362 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
363 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
364 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
365 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
366 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
367 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
368 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock | |
369 @endif | |
370 @if STM32F107xC | |
371 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
372 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
373 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
374 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
375 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
376 * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock | |
377 * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock | |
378 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock | |
379 @endif | |
380 @if STM32F102xx | |
381 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock | |
382 @endif | |
383 @if STM32F103xx | |
384 * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock | |
385 @endif | |
386 * @retval Frequency in Hz (0: means that no available frequency for the peripheral) | |
387 */ | |
388 uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) | |
389 { | |
390 #if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ | |
391 || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ | |
392 || defined(STM32F105xC) || defined(STM32F107xC) | |
393 #if defined(STM32F105xC) || defined(STM32F107xC) | |
394 const uint8_t aPLLMULFactorTable[12] = {0, 0, 4, 5, 6, 7, 8, 9, 0, 0, 0, 13}; | |
395 const uint8_t aPredivFactorTable[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16}; | |
396 #else | |
397 const uint8_t aPLLMULFactorTable[16] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16}; | |
398 const uint8_t aPredivFactorTable[2] = { 1, 2}; | |
399 #endif | |
400 #endif | |
401 uint32_t temp_reg = 0, frequency = 0; | |
402 #if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ | |
403 || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ | |
404 || defined(STM32F105xC) || defined(STM32F107xC) | |
405 uint32_t prediv1 = 0, pllclk = 0, pllmul = 0; | |
406 #endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ | |
407 #if defined(STM32F105xC) || defined(STM32F107xC) | |
408 uint32_t pll2mul = 0, pll3mul = 0, prediv2 = 0; | |
409 #endif /* STM32F105xC || STM32F107xC */ | |
410 | |
411 /* Check the parameters */ | |
412 assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); | |
413 | |
414 switch (PeriphClk) | |
415 { | |
416 #if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ | |
417 || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ | |
418 || defined(STM32F105xC) || defined(STM32F107xC) | |
419 case RCC_PERIPHCLK_USB: | |
420 { | |
421 /* Get RCC configuration ------------------------------------------------------*/ | |
422 temp_reg = RCC->CFGR; | |
423 | |
424 /* Check if PLL is enabled */ | |
425 if (HAL_IS_BIT_SET(RCC->CR,RCC_CR_PLLON)) | |
426 { | |
427 pllmul = aPLLMULFactorTable[(uint32_t)(temp_reg & RCC_CFGR_PLLMULL) >> POSITION_VAL(RCC_CFGR_PLLMULL)]; | |
428 if ((temp_reg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2) | |
429 { | |
430 #if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ | |
431 || defined(STM32F100xE) | |
432 prediv1 = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV1) >> POSITION_VAL(RCC_CFGR2_PREDIV1)]; | |
433 #else | |
434 prediv1 = aPredivFactorTable[(uint32_t)(RCC->CFGR & RCC_CFGR_PLLXTPRE) >> POSITION_VAL(RCC_CFGR_PLLXTPRE)]; | |
435 #endif /* STM32F105xC || STM32F107xC || STM32F100xB || STM32F100xE */ | |
436 | |
437 #if defined(STM32F105xC) || defined(STM32F107xC) | |
438 if(HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) | |
439 { | |
440 /* PLL2 selected as Prediv1 source */ | |
441 /* PLLCLK = PLL2CLK / PREDIV1 * PLLMUL with PLL2CLK = HSE/PREDIV2 * PLL2MUL */ | |
442 prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> POSITION_VAL(RCC_CFGR2_PREDIV2)) + 1; | |
443 pll2mul = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> POSITION_VAL(RCC_CFGR2_PLL2MUL)) + 2; | |
444 pllclk = (uint32_t)((((HSE_VALUE / prediv2) * pll2mul) / prediv1) * pllmul); | |
445 } | |
446 else | |
447 { | |
448 /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ | |
449 pllclk = (uint32_t)((HSE_VALUE / prediv1) * pllmul); | |
450 } | |
451 | |
452 /* If PLLMUL was set to 13 means that it was to cover the case PLLMUL 6.5 (avoid using float) */ | |
453 /* In this case need to divide pllclk by 2 */ | |
454 if (pllmul == aPLLMULFactorTable[(uint32_t)(RCC_CFGR_PLLMULL6_5) >> POSITION_VAL(RCC_CFGR_PLLMULL)]) | |
455 { | |
456 pllclk = pllclk / 2; | |
457 } | |
458 #else | |
459 if ((temp_reg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2) | |
460 { | |
461 /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ | |
462 pllclk = (uint32_t)((HSE_VALUE / prediv1) * pllmul); | |
463 } | |
464 #endif /* STM32F105xC || STM32F107xC */ | |
465 } | |
466 else | |
467 { | |
468 /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ | |
469 pllclk = (uint32_t)((HSI_VALUE >> 1) * pllmul); | |
470 } | |
471 | |
472 /* Calcul of the USB frequency*/ | |
473 #if defined(STM32F105xC) || defined(STM32F107xC) | |
474 /* USBCLK = PLLVCO = (2 x PLLCLK) / USB prescaler */ | |
475 if (__HAL_RCC_GET_USB_SOURCE() == RCC_USBCLKSOURCE_PLL_DIV2) | |
476 { | |
477 /* Prescaler of 2 selected for USB */ | |
478 frequency = pllclk; | |
479 } | |
480 else | |
481 { | |
482 /* Prescaler of 3 selected for USB */ | |
483 frequency = (2 * pllclk) / 3; | |
484 } | |
485 #else | |
486 /* USBCLK = PLLCLK / USB prescaler */ | |
487 if (__HAL_RCC_GET_USB_SOURCE() == RCC_USBCLKSOURCE_PLL) | |
488 { | |
489 /* No prescaler selected for USB */ | |
490 frequency = pllclk; | |
491 } | |
492 else | |
493 { | |
494 /* Prescaler of 1.5 selected for USB */ | |
495 frequency = (pllclk * 2) / 3; | |
496 } | |
497 #endif | |
498 } | |
499 break; | |
500 } | |
501 #endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ | |
502 #if defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ | |
503 || defined(STM32F107xC) | |
504 case RCC_PERIPHCLK_I2S2: | |
505 { | |
506 #if defined(STM32F103xE) || defined(STM32F103xG) | |
507 /* SYSCLK used as source clock for I2S2 */ | |
508 frequency = HAL_RCC_GetSysClockFreq(); | |
509 #else | |
510 if (__HAL_RCC_GET_I2S2_SOURCE() == RCC_I2S2CLKSOURCE_SYSCLK) | |
511 { | |
512 /* SYSCLK used as source clock for I2S2 */ | |
513 frequency = HAL_RCC_GetSysClockFreq(); | |
514 } | |
515 else | |
516 { | |
517 /* Check if PLLI2S is enabled */ | |
518 if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON)) | |
519 { | |
520 /* PLLI2SVCO = 2 * PLLI2SCLK = 2 * (HSE/PREDIV2 * PLL3MUL) */ | |
521 prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> POSITION_VAL(RCC_CFGR2_PREDIV2)) + 1; | |
522 pll3mul = ((RCC->CFGR2 & RCC_CFGR2_PLL3MUL) >> POSITION_VAL(RCC_CFGR2_PLL3MUL)) + 2; | |
523 frequency = (uint32_t)(2 * ((HSE_VALUE / prediv2) * pll3mul)); | |
524 } | |
525 } | |
526 #endif /* STM32F103xE || STM32F103xG */ | |
527 break; | |
528 } | |
529 case RCC_PERIPHCLK_I2S3: | |
530 { | |
531 #if defined(STM32F103xE) || defined(STM32F103xG) | |
532 /* SYSCLK used as source clock for I2S3 */ | |
533 frequency = HAL_RCC_GetSysClockFreq(); | |
534 #else | |
535 if (__HAL_RCC_GET_I2S3_SOURCE() == RCC_I2S3CLKSOURCE_SYSCLK) | |
536 { | |
537 /* SYSCLK used as source clock for I2S3 */ | |
538 frequency = HAL_RCC_GetSysClockFreq(); | |
539 } | |
540 else | |
541 { | |
542 /* Check if PLLI2S is enabled */ | |
543 if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON)) | |
544 { | |
545 /* PLLI2SVCO = 2 * PLLI2SCLK = 2 * (HSE/PREDIV2 * PLL3MUL) */ | |
546 prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> POSITION_VAL(RCC_CFGR2_PREDIV2)) + 1; | |
547 pll3mul = ((RCC->CFGR2 & RCC_CFGR2_PLL3MUL) >> POSITION_VAL(RCC_CFGR2_PLL3MUL)) + 2; | |
548 frequency = (uint32_t)(2 * ((HSE_VALUE / prediv2) * pll3mul)); | |
549 } | |
550 } | |
551 #endif /* STM32F103xE || STM32F103xG */ | |
552 break; | |
553 } | |
554 #endif /* STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ | |
555 case RCC_PERIPHCLK_RTC: | |
556 { | |
557 /* Get RCC BDCR configuration ------------------------------------------------------*/ | |
558 temp_reg = RCC->BDCR; | |
559 | |
560 /* Check if LSE is ready if RTC clock selection is LSE */ | |
561 if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_LSE) && (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSERDY))) | |
562 { | |
563 frequency = LSE_VALUE; | |
564 } | |
565 /* Check if LSI is ready if RTC clock selection is LSI */ | |
566 else if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) | |
567 { | |
568 frequency = LSI_VALUE; | |
569 } | |
570 else if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_HSE_DIV128) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))) | |
571 { | |
572 frequency = HSE_VALUE / 128; | |
573 } | |
574 /* Clock not enabled for RTC*/ | |
575 else | |
576 { | |
577 frequency = 0; | |
578 } | |
579 break; | |
580 } | |
581 case RCC_PERIPHCLK_ADC: | |
582 { | |
583 frequency = HAL_RCC_GetPCLK2Freq() / (((__HAL_RCC_GET_ADC_SOURCE() >> POSITION_VAL(RCC_CFGR_ADCPRE_DIV4)) + 1) * 2); | |
584 break; | |
585 } | |
586 default: | |
587 { | |
588 break; | |
589 } | |
590 } | |
591 return(frequency); | |
592 } | |
593 | |
594 /** | |
595 * @} | |
596 */ | |
597 | |
598 #if defined(STM32F105xC) || defined(STM32F107xC) | |
599 /** @defgroup RCCEx_Exported_Functions_Group2 PLLI2S Management function | |
600 * @brief PLLI2S Management functions | |
601 * | |
602 @verbatim | |
603 =============================================================================== | |
604 ##### Extended PLLI2S Management functions ##### | |
605 =============================================================================== | |
606 [..] | |
607 This subsection provides a set of functions allowing to control the PLLI2S | |
608 activation or deactivation | |
609 @endverbatim | |
610 * @{ | |
611 */ | |
612 | |
613 /** | |
614 * @brief Enable PLLI2S | |
615 * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that | |
616 * contains the configuration information for the PLLI2S | |
617 * @note The PLLI2S configuration not modified if used by I2S2 or I2S3 Interface. | |
618 * @retval HAL status | |
619 */ | |
620 HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) | |
621 { | |
622 uint32_t tickstart = 0; | |
623 | |
624 /* Check that PLL I2S has not been already enabled by I2S2 or I2S3*/ | |
625 if (HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S2SRC) && HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) | |
626 { | |
627 /* Check the parameters */ | |
628 assert_param(IS_RCC_PLLI2S_MUL(PLLI2SInit->PLLI2SMUL)); | |
629 assert_param(IS_RCC_HSE_PREDIV2(PLLI2SInit->HSEPrediv2Value)); | |
630 | |
631 /* Prediv2 can be written only when the PLL2 is disabled. */ | |
632 /* Return an error only if new value is different from the programmed value */ | |
633 if (HAL_IS_BIT_SET(RCC->CR,RCC_CR_PLL2ON) && \ | |
634 (__HAL_RCC_HSE_GET_PREDIV2() != PLLI2SInit->HSEPrediv2Value)) | |
635 { | |
636 return HAL_ERROR; | |
637 } | |
638 | |
639 /* Disable the main PLLI2S. */ | |
640 __HAL_RCC_PLLI2S_DISABLE(); | |
641 | |
642 /* Get Start Tick*/ | |
643 tickstart = HAL_GetTick(); | |
644 | |
645 /* Wait till PLLI2S is ready */ | |
646 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) | |
647 { | |
648 if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) | |
649 { | |
650 return HAL_TIMEOUT; | |
651 } | |
652 } | |
653 | |
654 /* Configure the HSE prediv2 factor --------------------------------*/ | |
655 __HAL_RCC_HSE_PREDIV2_CONFIG(PLLI2SInit->HSEPrediv2Value); | |
656 | |
657 | |
658 /* Configure the main PLLI2S multiplication factors. */ | |
659 __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SMUL); | |
660 | |
661 /* Enable the main PLLI2S. */ | |
662 __HAL_RCC_PLLI2S_ENABLE(); | |
663 | |
664 /* Get Start Tick*/ | |
665 tickstart = HAL_GetTick(); | |
666 | |
667 /* Wait till PLLI2S is ready */ | |
668 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) | |
669 { | |
670 if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) | |
671 { | |
672 return HAL_TIMEOUT; | |
673 } | |
674 } | |
675 } | |
676 else | |
677 { | |
678 /* PLLI2S cannot be modified as already used by I2S2 or I2S3 */ | |
679 return HAL_ERROR; | |
680 } | |
681 | |
682 return HAL_OK; | |
683 } | |
684 | |
685 /** | |
686 * @brief Disable PLLI2S | |
687 * @note PLLI2S is not disabled if used by I2S2 or I2S3 Interface. | |
688 * @retval HAL status | |
689 */ | |
690 HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) | |
691 { | |
692 uint32_t tickstart = 0; | |
693 | |
694 /* Disable PLL I2S as not requested by I2S2 or I2S3*/ | |
695 if (HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S2SRC) && HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) | |
696 { | |
697 /* Disable the main PLLI2S. */ | |
698 __HAL_RCC_PLLI2S_DISABLE(); | |
699 | |
700 /* Get Start Tick*/ | |
701 tickstart = HAL_GetTick(); | |
702 | |
703 /* Wait till PLLI2S is ready */ | |
704 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) | |
705 { | |
706 if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) | |
707 { | |
708 return HAL_TIMEOUT; | |
709 } | |
710 } | |
711 } | |
712 else | |
713 { | |
714 /* PLLI2S is currently used by I2S2 or I2S3. Cannot be disabled.*/ | |
715 return HAL_ERROR; | |
716 } | |
717 | |
718 return HAL_OK; | |
719 } | |
720 | |
721 /** | |
722 * @} | |
723 */ | |
724 | |
725 /** @defgroup RCCEx_Exported_Functions_Group3 PLL2 Management function | |
726 * @brief PLL2 Management functions | |
727 * | |
728 @verbatim | |
729 =============================================================================== | |
730 ##### Extended PLL2 Management functions ##### | |
731 =============================================================================== | |
732 [..] | |
733 This subsection provides a set of functions allowing to control the PLL2 | |
734 activation or deactivation | |
735 @endverbatim | |
736 * @{ | |
737 */ | |
738 | |
739 /** | |
740 * @brief Enable PLL2 | |
741 * @param PLL2Init pointer to an RCC_PLL2InitTypeDef structure that | |
742 * contains the configuration information for the PLL2 | |
743 * @note The PLL2 configuration not modified if used indirectly as system clock. | |
744 * @retval HAL status | |
745 */ | |
746 HAL_StatusTypeDef HAL_RCCEx_EnablePLL2(RCC_PLL2InitTypeDef *PLL2Init) | |
747 { | |
748 uint32_t tickstart = 0; | |
749 | |
750 /* This bit can not be cleared if the PLL2 clock is used indirectly as system | |
751 clock (i.e. it is used as PLL clock entry that is used as system clock). */ | |
752 if((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \ | |
753 (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \ | |
754 ((READ_BIT(RCC->CFGR2,RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2)) | |
755 { | |
756 return HAL_ERROR; | |
757 } | |
758 else | |
759 { | |
760 /* Check the parameters */ | |
761 assert_param(IS_RCC_PLL2_MUL(PLL2Init->PLL2MUL)); | |
762 assert_param(IS_RCC_HSE_PREDIV2(PLL2Init->HSEPrediv2Value)); | |
763 | |
764 /* Prediv2 can be written only when the PLLI2S is disabled. */ | |
765 /* Return an error only if new value is different from the programmed value */ | |
766 if (HAL_IS_BIT_SET(RCC->CR,RCC_CR_PLL3ON) && \ | |
767 (__HAL_RCC_HSE_GET_PREDIV2() != PLL2Init->HSEPrediv2Value)) | |
768 { | |
769 return HAL_ERROR; | |
770 } | |
771 | |
772 /* Disable the main PLL2. */ | |
773 __HAL_RCC_PLL2_DISABLE(); | |
774 | |
775 /* Get Start Tick*/ | |
776 tickstart = HAL_GetTick(); | |
777 | |
778 /* Wait till PLL2 is disabled */ | |
779 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) | |
780 { | |
781 if((HAL_GetTick() - tickstart ) > PLL2_TIMEOUT_VALUE) | |
782 { | |
783 return HAL_TIMEOUT; | |
784 } | |
785 } | |
786 | |
787 /* Configure the HSE prediv2 factor --------------------------------*/ | |
788 __HAL_RCC_HSE_PREDIV2_CONFIG(PLL2Init->HSEPrediv2Value); | |
789 | |
790 /* Configure the main PLL2 multiplication factors. */ | |
791 __HAL_RCC_PLL2_CONFIG(PLL2Init->PLL2MUL); | |
792 | |
793 /* Enable the main PLL2. */ | |
794 __HAL_RCC_PLL2_ENABLE(); | |
795 | |
796 /* Get Start Tick*/ | |
797 tickstart = HAL_GetTick(); | |
798 | |
799 /* Wait till PLL2 is ready */ | |
800 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == RESET) | |
801 { | |
802 if((HAL_GetTick() - tickstart ) > PLL2_TIMEOUT_VALUE) | |
803 { | |
804 return HAL_TIMEOUT; | |
805 } | |
806 } | |
807 } | |
808 | |
809 return HAL_OK; | |
810 } | |
811 | |
812 /** | |
813 * @brief Disable PLL2 | |
814 * @note PLL2 is not disabled if used indirectly as system clock. | |
815 * @retval HAL status | |
816 */ | |
817 HAL_StatusTypeDef HAL_RCCEx_DisablePLL2(void) | |
818 { | |
819 uint32_t tickstart = 0; | |
820 | |
821 /* This bit can not be cleared if the PLL2 clock is used indirectly as system | |
822 clock (i.e. it is used as PLL clock entry that is used as system clock). */ | |
823 if((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \ | |
824 (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \ | |
825 ((READ_BIT(RCC->CFGR2,RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2)) | |
826 { | |
827 return HAL_ERROR; | |
828 } | |
829 else | |
830 { | |
831 /* Disable the main PLL2. */ | |
832 __HAL_RCC_PLL2_DISABLE(); | |
833 | |
834 /* Get Start Tick*/ | |
835 tickstart = HAL_GetTick(); | |
836 | |
837 /* Wait till PLL2 is disabled */ | |
838 while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) | |
839 { | |
840 if((HAL_GetTick() - tickstart ) > PLL2_TIMEOUT_VALUE) | |
841 { | |
842 return HAL_TIMEOUT; | |
843 } | |
844 } | |
845 } | |
846 | |
847 return HAL_OK; | |
848 } | |
849 | |
850 /** | |
851 * @} | |
852 */ | |
853 #endif /* STM32F105xC || STM32F107xC */ | |
854 | |
855 /** | |
856 * @} | |
857 */ | |
858 | |
859 /** | |
860 * @} | |
861 */ | |
862 | |
863 #endif /* HAL_RCC_MODULE_ENABLED */ | |
864 | |
865 /** | |
866 * @} | |
867 */ | |
868 | |
869 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | |
870 |