41
41
#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default)
42
42
#define USE_PLL_HSI 0x2 // Use HSI internal clock
43
43
44
+ // Uncomment to output the MCO on PA8 for debugging
45
+ //#define DEBUG_MCO
46
+
44
47
#if ( ((CLOCK_SOURCE ) & USE_PLL_HSE_XTAL ) || ((CLOCK_SOURCE ) & USE_PLL_HSE_EXTC ) )
45
48
uint8_t SetSysClock_PLL_HSE (uint8_t bypass );
46
49
#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */
@@ -118,10 +121,6 @@ void SetSysClock(void)
118
121
}
119
122
}
120
123
}
121
-
122
- /* Output clock on MCO1 pin(PA8) for debugging purpose */
123
- //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);
124
- //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI48, RCC_MCODIV_1);
125
124
}
126
125
127
126
#if ( ((CLOCK_SOURCE ) & USE_PLL_HSE_XTAL ) || ((CLOCK_SOURCE ) & USE_PLL_HSE_EXTC ) )
@@ -130,9 +129,10 @@ void SetSysClock(void)
130
129
/******************************************************************************/
131
130
uint8_t SetSysClock_PLL_HSE (uint8_t bypass )
132
131
{
133
- RCC_ClkInitTypeDef RCC_ClkInitStruct ;
134
- RCC_OscInitTypeDef RCC_OscInitStruct ;
135
- RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit ;
132
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
133
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
134
+ RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit = {0 };
135
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = {0 };
136
136
137
137
/* Used to gain time after DeepSleep in case HSI is used */
138
138
if (__HAL_RCC_GET_FLAG (RCC_FLAG_HSIRDY ) != RESET ) {
@@ -144,11 +144,12 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
144
144
regarding system frequency refer to product datasheet. */
145
145
__PWR_CLK_ENABLE ();
146
146
__HAL_PWR_VOLTAGESCALING_CONFIG (PWR_REGULATOR_VOLTAGE_SCALE1 );
147
+ __HAL_RCC_PWR_CLK_DISABLE ();
147
148
148
149
/* Enable HSE and HSI48 oscillators and activate PLL with HSE as source */
149
- RCC_OscInitStruct .OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI48 ;
150
+ RCC_OscInitStruct .OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 ;
150
151
if (bypass == 0 ) {
151
- RCC_OscInitStruct .HSEState = RCC_HSE_ON ; /* External 8 MHz xtal on OSC_IN/OSC_OUT */
152
+ RCC_OscInitStruct .HSEState = RCC_HSE_ON ; /* 8 MHz xtal on OSC_IN/OSC_OUT */
152
153
} else {
153
154
RCC_OscInitStruct .HSEState = RCC_HSE_BYPASS ; /* External 8 MHz clock on OSC_IN */
154
155
}
@@ -163,6 +164,13 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
163
164
return 0 ; // FAIL
164
165
}
165
166
167
+ /* Select HSI48 as USB clock source */
168
+ RCC_PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_USB ;
169
+ RCC_PeriphClkInit .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
170
+ if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphClkInit ) != HAL_OK ) {
171
+ return 0 ; // FAIL
172
+ }
173
+
166
174
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
167
175
RCC_ClkInitStruct .ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 );
168
176
RCC_ClkInitStruct .SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ; // 32 MHz
@@ -173,17 +181,30 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
173
181
return 0 ; // FAIL
174
182
}
175
183
176
- RCC_PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_USB ;
177
- RCC_PeriphClkInit .UsbClockSelection = RCC_USBCLKSOURCE_HSI48 ;
178
- if (HAL_RCCEx_PeriphCLKConfig (& RCC_PeriphClkInit ) != HAL_OK ) {
179
- return 0 ; // FAIL
180
- }
184
+ /* Configure the clock recovery system (CRS) ********************************/
185
+ /* Enable CRS Clock */
186
+ __HAL_RCC_CRS_CLK_ENABLE ();
187
+ /* Default Synchro Signal division factor (not divided) */
188
+ RCC_CRSInitStruct .Prescaler = RCC_CRS_SYNC_DIV1 ;
189
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
190
+ RCC_CRSInitStruct .Source = RCC_CRS_SYNC_SOURCE_USB ;
191
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
192
+ RCC_CRSInitStruct .ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE (48000000 , 1000 );
193
+ RCC_CRSInitStruct .ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT ;
194
+ /* Set the TRIM[5:0] to the default value */
195
+ RCC_CRSInitStruct .HSI48CalibrationValue = 0x20 ;
196
+ /* Start automatic synchronization */
197
+ HAL_RCCEx_CRSConfig (& RCC_CRSInitStruct );
181
198
182
- /* Output clock on MCO1 pin(PA8) for debugging purpose */
183
- //if (bypass == 0)
184
- // HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz
185
- //else
186
- // HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz
199
+ #ifdef DEBUG_MCO
200
+ // Output clock on MCO1 pin(PA8) for debugging purpose
201
+ if (bypass == 0 ) { // Xtal used
202
+ HAL_RCC_MCOConfig (RCC_MCO1 , RCC_MCO1SOURCE_SYSCLK , RCC_MCODIV_2 ); // 16 MHz
203
+ }
204
+ else { // External clock used
205
+ HAL_RCC_MCOConfig (RCC_MCO1 , RCC_MCO1SOURCE_SYSCLK , RCC_MCODIV_4 ); // 8 MHz
206
+ }
207
+ #endif
187
208
188
209
return 1 ; // OK
189
210
}
@@ -252,8 +273,10 @@ uint8_t SetSysClock_PLL_HSI(void)
252
273
/* Start automatic synchronization */
253
274
HAL_RCCEx_CRSConfig (& RCC_CRSInitStruct );
254
275
255
- /* Output clock on MCO1 pin(PA8) for debugging purpose */
256
- //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz
276
+ #ifdef DEBUG_MCO
277
+ // Output clock on MCO1 pin(PA8) for debugging purpose
278
+ HAL_RCC_MCOConfig (RCC_MCO1 , RCC_MCO1SOURCE_SYSCLK , RCC_MCODIV_1 ); // 32 MHz (not precise due to HSI not calibrated)
279
+ #endif
257
280
258
281
return 1 ; // OK
259
282
}
0 commit comments