20
20
* | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)
21
21
* | 3- USE_PLL_HSI (internal 16 MHz)
22
22
*-----------------------------------------------------------------
23
- * SYSCLK(MHz) | 64
24
- * AHBCLK (MHz) | 64
25
- * APB1CLK (MHz) | 64
23
+ * SYSCLK(MHz) | 160 (default configuration) / 170 (CAN disabled)
26
24
* USB capable | NO
27
25
*-----------------------------------------------------------------
28
26
*/
29
27
30
28
#include "stm32g4xx.h"
31
29
#include "mbed_error.h"
32
30
33
- /*!< Uncomment the following line if you need to relocate your vector Table in
34
- Internal SRAM. */
35
- /* #define VECT_TAB_SRAM */
36
- #define VECT_TAB_OFFSET 0x00U /*!< Vector Table base offset field.
37
- This value must be a multiple of 0x100. */
38
-
39
31
#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO)
40
32
#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board)
41
33
#define USE_PLL_HSI 0x2 // Use HSI internal clock
@@ -90,17 +82,19 @@ void SetSysClock(void)
90
82
/******************************************************************************/
91
83
/* PLL (clocked by HSE) used as System clock source */
92
84
/******************************************************************************/
93
- uint8_t SetSysClock_PLL_HSE (uint8_t bypass )
85
+ MBED_WEAK uint8_t SetSysClock_PLL_HSE (uint8_t bypass )
94
86
{
95
87
RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
96
88
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
97
- RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = { 0 };
98
89
99
- /** Configure the main internal regulator output voltage
100
- */
90
+ #if HSE_VALUE != 24000000
91
+ #error Unsupported externall clock value, check HSE_VALUE define
92
+ #endif
93
+
94
+ /* Configure the main internal regulator output voltage */
95
+ __HAL_RCC_PWR_CLK_ENABLE ();
101
96
HAL_PWREx_ControlVoltageScaling (PWR_REGULATOR_VOLTAGE_SCALE1_BOOST );
102
- /** Initializes the CPU, AHB and APB busses clocks
103
- */
97
+
104
98
RCC_OscInitStruct .OscillatorType = RCC_OSCILLATORTYPE_HSE ;
105
99
RCC_OscInitStruct .HSEState = RCC_HSE_ON ;
106
100
RCC_OscInitStruct .PLL .PLLState = RCC_PLL_ON ;
@@ -117,35 +111,20 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
117
111
RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;
118
112
RCC_OscInitStruct .PLL .PLLQ = RCC_PLLQ_DIV2 ;
119
113
RCC_OscInitStruct .PLL .PLLR = RCC_PLLR_DIV2 ;
120
-
121
- // For USB: Default to USB driven by HSI48 Clock. (USB needs a 48 MHz Clock).
122
- // Code below enables the HSI48 Clock
123
- // (Sidenote: RNG is also driven (and according to STM specs) verified with the 48MHz HSI48)
114
+ #if defined(DEVICE_TRNG )
124
115
RCC_OscInitStruct .OscillatorType |= RCC_OSCILLATORTYPE_HSI48 ;
125
116
RCC_OscInitStruct .HSI48State = RCC_HSI48_ON ;
126
-
117
+ #endif
127
118
if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK ) {
128
119
return 0 ; // FAIL
129
120
}
130
121
131
- // For USB: Default to USB driven by HSI48 Clock.
132
- // Code below connects USB (and RNG) to the HSI48 Clock.
133
- RCC_PeriphCLKInitStruct .PeriphClockSelection = RCC_PERIPHCLK_USB ;
134
- RCC_PeriphCLKInitStruct .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
135
- if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphCLKInitStruct ) != HAL_OK ) {
136
- return 0 ; // FAIL
137
- }
138
-
139
- /** Initializes the CPU, AHB and APB busses clocks
140
- */
141
122
RCC_ClkInitStruct .ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
142
123
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 ;
143
124
RCC_ClkInitStruct .SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ;
144
125
RCC_ClkInitStruct .AHBCLKDivider = RCC_SYSCLK_DIV1 ;
145
126
RCC_ClkInitStruct .APB1CLKDivider = RCC_HCLK_DIV1 ;
146
127
RCC_ClkInitStruct .APB2CLKDivider = RCC_HCLK_DIV1 ;
147
-
148
- // This is an assumption: Using same Flash Latency as for G474RE
149
128
if (HAL_RCC_ClockConfig (& RCC_ClkInitStruct , FLASH_LATENCY_8 ) != HAL_OK ) {
150
129
return 0 ; // FAIL
151
130
}
@@ -162,43 +141,42 @@ uint8_t SetSysClock_PLL_HSI(void)
162
141
{
163
142
RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
164
143
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
165
- RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = { 0 };
166
144
167
- /** Configure the main internal regulator output voltage
168
- */
169
- HAL_PWREx_ControlVoltageScaling (PWR_REGULATOR_VOLTAGE_SCALE1 );
170
- /** Initializes the CPU, AHB and APB busses clocks
171
- */
145
+ /* Configure the main internal regulator output voltage */
146
+ __HAL_RCC_PWR_CLK_ENABLE ();
147
+ HAL_PWREx_ControlVoltageScaling (PWR_REGULATOR_VOLTAGE_SCALE1_BOOST );
148
+
172
149
RCC_OscInitStruct .OscillatorType = RCC_OSCILLATORTYPE_HSI ;
173
150
RCC_OscInitStruct .HSIState = RCC_HSI_ON ;
174
151
RCC_OscInitStruct .HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT ;
175
152
RCC_OscInitStruct .PLL .PLLState = RCC_PLL_ON ;
176
153
RCC_OscInitStruct .PLL .PLLSource = RCC_PLLSOURCE_HSI ;
177
154
RCC_OscInitStruct .PLL .PLLM = RCC_PLLM_DIV4 ;
155
+ //! 170MHz as a core frequency for FDCAN is not suitable for many frequencies,
156
+ //! as it provides low accuracy. When no FDCAN is used, the full capacity of 170 MHz
157
+ //! should be standard.
158
+ #if DEVICE_CAN
159
+ RCC_OscInitStruct .PLL .PLLN = 80 ;
160
+ #else
178
161
RCC_OscInitStruct .PLL .PLLN = 85 ;
162
+ #endif
179
163
RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;
180
164
RCC_OscInitStruct .PLL .PLLQ = RCC_PLLQ_DIV2 ;
181
165
RCC_OscInitStruct .PLL .PLLR = RCC_PLLR_DIV2 ;
182
- RCC_OscInitStruct .OscillatorType |= RCC_OSCILLATORTYPE_HSI48 ; // Enable HSI48 and feed it to USB/RNG.
183
- RCC_OscInitStruct .HSI48State = RCC_HSI48_ON ; // USB needs - and RNG is verified with - the 48Mhz HSI48.
166
+ #if defined(DEVICE_TRNG )
167
+ RCC_OscInitStruct .OscillatorType |= RCC_OSCILLATORTYPE_HSI48 ;
168
+ RCC_OscInitStruct .HSI48State = RCC_HSI48_ON ;
169
+ #endif
184
170
if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK ) {
185
171
return 0 ; // FAIL
186
172
}
187
- RCC_PeriphCLKInitStruct .PeriphClockSelection = RCC_PERIPHCLK_USB ; // Connect HSI48 clock to USB (and RNG)
188
- RCC_PeriphCLKInitStruct .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
189
- if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphCLKInitStruct ) != HAL_OK ) {
190
- return 0 ; // FAIL
191
- }
192
-
193
- /** Initializes the CPU, AHB and APB busses clocks
194
- */
173
+
195
174
RCC_ClkInitStruct .ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
196
175
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 ;
197
176
RCC_ClkInitStruct .SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ;
198
177
RCC_ClkInitStruct .AHBCLKDivider = RCC_SYSCLK_DIV1 ;
199
178
RCC_ClkInitStruct .APB1CLKDivider = RCC_HCLK_DIV1 ;
200
179
RCC_ClkInitStruct .APB2CLKDivider = RCC_HCLK_DIV1 ;
201
-
202
180
if (HAL_RCC_ClockConfig (& RCC_ClkInitStruct , FLASH_LATENCY_8 ) != HAL_OK ) {
203
181
return 0 ; // FAIL
204
182
}
0 commit comments