21
21
* | 3- USE_PLL_HSI (internal 16 MHz)
22
22
*-----------------------------------------------------------------
23
23
* SYSCLK(MHz) | 160 (default configuration) / 170 (CAN disabled)
24
- * USB capable | NO
24
+ * USB capable | YES (Add "device_has_add": ["USBDEVICE"], to the NUCLEO_G431KB entry in targets.json to enable USB)
25
25
*-----------------------------------------------------------------
26
26
*/
27
27
@@ -86,6 +86,7 @@ MBED_WEAK uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
86
86
{
87
87
RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
88
88
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
89
+ RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = { 0 };
89
90
90
91
#if HSE_VALUE != 24000000
91
92
#error Unsupported externall clock value, check HSE_VALUE define
@@ -111,14 +112,24 @@ MBED_WEAK uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
111
112
RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;
112
113
RCC_OscInitStruct .PLL .PLLQ = RCC_PLLQ_DIV2 ;
113
114
RCC_OscInitStruct .PLL .PLLR = RCC_PLLR_DIV2 ;
114
- #if defined(DEVICE_TRNG )
115
+ #if defined(DEVICE_TRNG ) || defined(DEVICE_USBDEVICE )
116
+ // Enable the HSI48 Clock (Can be used as a clocksource by CRS, RNG and USB)
115
117
RCC_OscInitStruct .OscillatorType |= RCC_OSCILLATORTYPE_HSI48 ;
116
118
RCC_OscInitStruct .HSI48State = RCC_HSI48_ON ;
117
119
#endif
118
120
if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK ) {
119
121
return 0 ; // FAIL
120
122
}
121
123
124
+ #if defined(DEVICE_TRNG ) || defined(DEVICE_USBDEVICE )
125
+ // Connect the HSI48 Clock to drive the USB & RNG Clocks @ 48 MHz (CK48 Clock Mux)
126
+ RCC_PeriphCLKInitStruct .PeriphClockSelection = RCC_PERIPHCLK_USB ;
127
+ RCC_PeriphCLKInitStruct .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
128
+ if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphCLKInitStruct ) != HAL_OK ) {
129
+ return 0 ; // FAIL
130
+ }
131
+ #endif
132
+
122
133
RCC_ClkInitStruct .ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
123
134
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 ;
124
135
RCC_ClkInitStruct .SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ;
@@ -141,6 +152,7 @@ uint8_t SetSysClock_PLL_HSI(void)
141
152
{
142
153
RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
143
154
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
155
+ RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = { 0 };
144
156
145
157
/* Configure the main internal regulator output voltage */
146
158
__HAL_RCC_PWR_CLK_ENABLE ();
@@ -163,14 +175,24 @@ uint8_t SetSysClock_PLL_HSI(void)
163
175
RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;
164
176
RCC_OscInitStruct .PLL .PLLQ = RCC_PLLQ_DIV2 ;
165
177
RCC_OscInitStruct .PLL .PLLR = RCC_PLLR_DIV2 ;
166
- #if defined(DEVICE_TRNG )
178
+ #if defined(DEVICE_TRNG ) || defined(DEVICE_USBDEVICE )
179
+ // Enable the HSI48 Clock (Can be used as a clocksource by CRS, RNG and USB)
167
180
RCC_OscInitStruct .OscillatorType |= RCC_OSCILLATORTYPE_HSI48 ;
168
181
RCC_OscInitStruct .HSI48State = RCC_HSI48_ON ;
169
182
#endif
170
183
if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK ) {
171
184
return 0 ; // FAIL
172
185
}
173
186
187
+ #if defined(DEVICE_TRNG ) || defined(DEVICE_USBDEVICE )
188
+ // Connect the HSI48 Clock to drive the USB & RNG Clocks @ 48 MHz (CK48 Clock Mux)
189
+ RCC_PeriphCLKInitStruct .PeriphClockSelection = RCC_PERIPHCLK_USB ;
190
+ RCC_PeriphCLKInitStruct .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
191
+ if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphCLKInitStruct ) != HAL_OK ) {
192
+ return 0 ; // FAIL
193
+ }
194
+ #endif
195
+
174
196
RCC_ClkInitStruct .ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
175
197
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 ;
176
198
RCC_ClkInitStruct .SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ;
0 commit comments