@@ -142,77 +142,85 @@ const uint32_t analogInputPin[] = {
142142 36 , // A14, PC4
143143 37 // A15, PC5
144144};
145-
145+
146146 // ----------------------------------------------------------------------------
147147 #ifdef __cplusplus
148148 extern " C" {
149149 #endif
150-
150+
151151 /* *
152152 * @brief System Clock Configuration
153153 * @param None
154154 * @retval None
155155 */
156156 WEAK void SystemClock_Config (void )
157157 {
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 = {};
160161
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+ }
167167
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+ }
172194
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;
195198
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+ }
204207
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
209214
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 ();
213221 }
214-
222+
215223 #ifdef __cplusplus
216224 }
217225 #endif
218- #endif /* ARDUINO_STM32L562E_DK */
226+ #endif /* ARDUINO_STM32L562E_DK */
0 commit comments