1+ #include " Arduino.h"
2+
3+ #if defined(GIGA_PINS)
4+ #undef HSE_VALUE
5+ #define HSE_VALUE 16000000
6+ #endif
7+
8+ extern " C" uint32_t HAL_RCC_GetSysClockFreq (void )
9+ {
10+ uint32_t pllp, pllsource, pllm, pllfracen, hsivalue;
11+ float_t fracn1, pllvco;
12+ uint32_t sysclockfreq;
13+
14+ /* Get SYSCLK source -------------------------------------------------------*/
15+
16+ switch (RCC->CFGR & RCC_CFGR_SWS)
17+ {
18+ case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */
19+
20+ if (__HAL_RCC_GET_FLAG (RCC_FLAG_HSIDIV) != 0U )
21+ {
22+ sysclockfreq = (uint32_t ) (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER ()>> 3 ));
23+ }
24+ else
25+ {
26+ sysclockfreq = (uint32_t ) HSI_VALUE;
27+ }
28+
29+ break ;
30+
31+ case RCC_CFGR_SWS_CSI: /* CSI used as system clock source */
32+ sysclockfreq = CSI_VALUE;
33+ break ;
34+
35+ case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */
36+ sysclockfreq = HSE_VALUE;
37+ break ;
38+
39+ case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */
40+
41+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
42+ SYSCLK = PLL_VCO / PLLR
43+ */
44+ pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
45+ pllm = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM1)>> 4 ) ;
46+ pllfracen = ((RCC-> PLLCFGR & RCC_PLLCFGR_PLL1FRACEN)>>RCC_PLLCFGR_PLL1FRACEN_Pos);
47+ fracn1 = (float_t )(uint32_t )(pllfracen* ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1)>> 3 ));
48+
49+ if (pllm != 0U )
50+ {
51+ switch (pllsource)
52+ {
53+ case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
54+
55+ if (__HAL_RCC_GET_FLAG (RCC_FLAG_HSIDIV) != 0U )
56+ {
57+ hsivalue= (HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER ()>> 3 ));
58+ pllvco = ( (float_t )hsivalue / (float_t )pllm) * ((float_t )(uint32_t )(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t )0x2000 ) +(float_t )1 );
59+ }
60+ else
61+ {
62+ pllvco = ((float_t )HSI_VALUE / (float_t )pllm) * ((float_t )(uint32_t )(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t )0x2000 ) +(float_t )1 );
63+ }
64+ break ;
65+
66+ case RCC_PLLSOURCE_CSI: /* CSI used as PLL clock source */
67+ pllvco = ((float_t )CSI_VALUE / (float_t )pllm) * ((float_t )(uint32_t )(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t )0x2000 ) +(float_t )1 );
68+ break ;
69+
70+ case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
71+ pllvco = ((float_t )HSE_VALUE / (float_t )pllm) * ((float_t )(uint32_t )(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t )0x2000 ) +(float_t )1 );
72+ break ;
73+
74+ default :
75+ pllvco = ((float_t )CSI_VALUE / (float_t )pllm) * ((float_t )(uint32_t )(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t )0x2000 ) +(float_t )1 );
76+ break ;
77+ }
78+ pllp = (((RCC->PLL1DIVR & RCC_PLL1DIVR_P1) >>9 ) + 1U ) ;
79+ sysclockfreq = (uint32_t )(float_t )(pllvco/(float_t )pllp);
80+ }
81+ else
82+ {
83+ sysclockfreq = 0U ;
84+ }
85+ break ;
86+
87+ default :
88+ sysclockfreq = CSI_VALUE;
89+ break ;
90+ }
91+
92+ return sysclockfreq;
93+ }
0 commit comments