@@ -142,77 +142,85 @@ const uint32_t analogInputPin[] = {
142
142
36 , // A14, PC4
143
143
37 // A15, PC5
144
144
};
145
-
145
+
146
146
// ----------------------------------------------------------------------------
147
147
#ifdef __cplusplus
148
148
extern " C" {
149
149
#endif
150
-
150
+
151
151
/* *
152
152
* @brief System Clock Configuration
153
153
* @param None
154
154
* @retval None
155
155
*/
156
156
WEAK void SystemClock_Config (void )
157
157
{
158
- RCC_OscInitTypeDef RCC_OscInitStruct = {0 };
159
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0 };
158
+ RCC_OscInitTypeDef RCC_OscInitStruct = {};
159
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
160
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {};
160
161
161
- /* * Configure the main internal regulator output voltage
162
- */
163
- if (HAL_PWREx_ControlVoltageScaling (PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)
164
- {
165
- Error_Handler ();
166
- }
162
+ // Configure the main internal regulator output voltage
163
+ if (HAL_PWREx_ControlVoltageScaling (PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)
164
+ {
165
+ Error_Handler ();
166
+ }
167
167
168
- /* * Configure LSE Drive Capability
169
- */
170
- HAL_PWR_EnableBkUpAccess ();
171
- __HAL_RCC_LSEDRIVE_CONFIG (RCC_LSEDRIVE_LOW);
168
+ // on board LSE 32.768 kHz
169
+ // internal HSI 16 MHz
170
+ // SDMMC = 48 MHz
171
+ // note: the HSE is not mounted by default on the DK
172
+ // PLLCLK=( PLLM Input Clock×PLLN÷PLLR
173
+ // 96 = 48 * 4 / 2
174
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE
175
+ | RCC_OSCILLATORTYPE_HSI48;
176
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
177
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
178
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
179
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
180
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
181
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
182
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; // 48 MHz
183
+ RCC_OscInitStruct.PLL .PLLState = RCC_PLL_ON;
184
+ RCC_OscInitStruct.PLL .PLLSource = RCC_PLLSOURCE_MSI; // 48 MHz
185
+ RCC_OscInitStruct.PLL .PLLM = 1 ;
186
+ RCC_OscInitStruct.PLL .PLLN = 4 ; // 48 * 4 = 192 Mhz
187
+ RCC_OscInitStruct.PLL .PLLP = RCC_PLLP_DIV8; // 24 Mhz
188
+ RCC_OscInitStruct.PLL .PLLQ = RCC_PLLQ_DIV4; // 48 Mhz
189
+ RCC_OscInitStruct.PLL .PLLR = RCC_PLLR_DIV2; // 96 Mhz
190
+ if (HAL_RCC_OscConfig (&RCC_OscInitStruct) != HAL_OK)
191
+ {
192
+ Error_Handler ();
193
+ }
172
194
173
- /* * Initializes the RCC Oscillators according to the specified parameters
174
- * in the RCC_OscInitTypeDef structure.
175
- */
176
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE
177
- |RCC_OSCILLATORTYPE_MSI;
178
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
179
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
180
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
181
- RCC_OscInitStruct.MSIState = RCC_MSI_ON;
182
- RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
183
- RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
184
- RCC_OscInitStruct.PLL .PLLState = RCC_PLL_ON;
185
- RCC_OscInitStruct.PLL .PLLSource = RCC_PLLSOURCE_MSI;
186
- RCC_OscInitStruct.PLL .PLLM = 12 ;
187
- RCC_OscInitStruct.PLL .PLLN = 55 ;
188
- RCC_OscInitStruct.PLL .PLLP = RCC_PLLP_DIV7;
189
- RCC_OscInitStruct.PLL .PLLQ = RCC_PLLQ_DIV2;
190
- RCC_OscInitStruct.PLL .PLLR = RCC_PLLR_DIV2;
191
- if (HAL_RCC_OscConfig (&RCC_OscInitStruct) != HAL_OK)
192
- {
193
- Error_Handler ();
194
- }
195
+ /* * Initializes the CPU, AHB and APB buses clocks */
196
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
197
+ | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
195
198
196
- /* * Initializes the CPU, AHB and APB buses clocks
197
- */
198
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
199
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
200
- RCC_ClkInitStruct. SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
201
- RCC_ClkInitStruct. AHBCLKDivider = RCC_SYSCLK_DIV1;
202
- RCC_ClkInitStruct. APB1CLKDivider = RCC_HCLK_DIV1 ;
203
- RCC_ClkInitStruct. APB2CLKDivider = RCC_HCLK_DIV1;
199
+ RCC_ClkInitStruct. SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 96 Mhz
200
+ RCC_ClkInitStruct. AHBCLKDivider = RCC_SYSCLK_DIV1; // Advanced High-performance Bus 96 Mhz
201
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // Advanced Peripheral Bus 1 96 Mhz
202
+ RCC_ClkInitStruct. APB2CLKDivider = RCC_HCLK_DIV1; // Advanced Peripheral Bus 2 96 Mhz
203
+ if ( HAL_RCC_ClockConfig (& RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
204
+ {
205
+ Error_Handler () ;
206
+ }
204
207
205
- if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
206
- {
207
- Error_Handler ();
208
- }
208
+ // Configure the other peripheral clocks
209
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB
210
+ | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_SDMMC1;
211
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
212
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
213
+ PeriphClkInitStruct.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLP; // 24 for conservatism
209
214
210
- /* * Enable MSI Auto calibration
211
- */
212
- HAL_RCCEx_EnableMSIPLLMode ();
215
+ if (HAL_RCCEx_PeriphCLKConfig (&PeriphClkInitStruct) != HAL_OK) {
216
+ Error_Handler ();
217
+ }
218
+
219
+ /* * Enable MSI Auto calibration */
220
+ HAL_RCCEx_EnableMSIPLLMode ();
213
221
}
214
-
222
+
215
223
#ifdef __cplusplus
216
224
}
217
225
#endif
218
- #endif /* ARDUINO_STM32L562E_DK */
226
+ #endif /* ARDUINO_STM32L562E_DK */
0 commit comments