Skip to content

Commit 65af55f

Browse files
committed
Change clock setup
Now the main clock is running at 180 MHz. The USB peripheral is also ready to be used since a 48 MHz clock is set up too. This clock config will expect an 8 MHz external clock or crystal (HSE). If not present, it will automatically switch to its internal clock (HSI).
1 parent 14477db commit 65af55f

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

variants/Generic_F446Rx/variant.cpp

+48-19
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,13 @@ static uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
126126
{
127127
RCC_OscInitTypeDef RCC_OscInitStruct;
128128
RCC_ClkInitTypeDef RCC_ClkInitStruct;
129+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
129130

130131
/* The voltage scaling allows optimizing the power consumption when the device is
131132
clocked below the maximum system frequency, to update the voltage scaling value
132133
regarding system frequency refer to product datasheet. */
133134
__HAL_RCC_PWR_CLK_ENABLE();
134-
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
135+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
135136

136137
// Enable HSE oscillator and activate PLL with HSE as source
137138
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
@@ -143,21 +144,35 @@ static uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
143144

144145
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
145146
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
146-
RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 1 MHz (8 MHz / 8)
147-
RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336)
148-
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4)
149-
RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> OK for USB
147+
RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000L; // Expects an 8 MHz external clock by default. Redefine HSE_VALUE if not
148+
RCC_OscInitStruct.PLL.PLLN = 360; // VCO output clock = 360 MHz (1 MHz * 360)
149+
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 180 MHz (360 MHz / 2)
150+
RCC_OscInitStruct.PLL.PLLQ = 7;
151+
RCC_OscInitStruct.PLL.PLLR = 2;
150152
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
151153
return 0; // FAIL
152154
}
153155

156+
// Activate the OverDrive to reach the 180 MHz Frequency
157+
if (HAL_PWREx_EnableOverDrive() != HAL_OK) {
158+
return 0; // FAIL
159+
}
160+
161+
// Select PLLSAI output as USB clock source
162+
PeriphClkInitStruct.PLLSAI.PLLSAIM = 8;
163+
PeriphClkInitStruct.PLLSAI.PLLSAIN = 384;
164+
PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8;
165+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;
166+
PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;
167+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
168+
154169
// Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers
155170
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
156-
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz
157-
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz
158-
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz
159-
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz
160-
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
171+
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
172+
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 MHz
173+
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 45 MHz
174+
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 90 MHz
175+
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
161176
return 0; // FAIL
162177
}
163178

@@ -179,12 +194,13 @@ uint8_t SetSysClock_PLL_HSI(void)
179194
{
180195
RCC_OscInitTypeDef RCC_OscInitStruct;
181196
RCC_ClkInitTypeDef RCC_ClkInitStruct;
197+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
182198

183199
/* The voltage scaling allows optimizing the power consumption when the device is
184200
clocked below the maximum system frequency, to update the voltage scaling value
185201
regarding system frequency refer to product datasheet. */
186202
__HAL_RCC_PWR_CLK_ENABLE();
187-
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
203+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
188204

189205
// Enable HSI oscillator and activate PLL with HSI as source
190206
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;
@@ -194,20 +210,33 @@ uint8_t SetSysClock_PLL_HSI(void)
194210
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
195211
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
196212
RCC_OscInitStruct.PLL.PLLM = 16; // VCO input clock = 1 MHz (16 MHz / 16)
197-
RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336)
198-
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4)
199-
RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> freq is ok but not precise enough
213+
RCC_OscInitStruct.PLL.PLLN = 360; // VCO output clock = 360 MHz (1 MHz * 360)
214+
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 180 MHz (360 MHz / 2)
215+
RCC_OscInitStruct.PLL.PLLQ = 7;
200216
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
201217
return 0; // FAIL
202218
}
203219

220+
// Activate the OverDrive to reach the 180 MHz Frequency
221+
if (HAL_PWREx_EnableOverDrive() != HAL_OK) {
222+
return 0; // FAIL
223+
}
224+
225+
// Select PLLSAI output as USB clock source
226+
PeriphClkInitStruct.PLLSAI.PLLSAIM = 8;
227+
PeriphClkInitStruct.PLLSAI.PLLSAIN = 192;
228+
PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8;
229+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;
230+
PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;
231+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
232+
204233
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
205234
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
206-
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz
207-
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz
208-
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz
209-
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz
210-
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
235+
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
236+
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 MHz
237+
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 45 MHz
238+
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 90 MHz
239+
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
211240
return 0; // FAIL
212241
}
213242

0 commit comments

Comments
 (0)