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