1 | static void SystemClock_Config(void)
|
2 | {
|
3 | RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
4 | RCC_OscInitTypeDef RCC_OscInitStruct;
|
5 | RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; //i2c, uart etc.
|
6 |
|
7 | HAL_PWR_EnableBkUpAccess(); //EDT
|
8 | /* Enable Power Control clock */
|
9 | __HAL_RCC_PWR_CLK_ENABLE();
|
10 |
|
11 | /* The voltage scaling allows optimizing the power consumption when the device is
|
12 | clocked below the maximum system frequency, to update the voltage scaling value
|
13 | regarding system frequency refer to product datasheet. */
|
14 | __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
|
15 |
|
16 | /*##-1- System Clock Configuration #########################################*/
|
17 | /* Enable HSE Oscillator and activate PLL with HSE as source */
|
18 |
|
19 | /*
|
20 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
21 | RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
22 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
23 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
24 | RCC_OscInitStruct.PLL.PLLM = 25;
|
25 | RCC_OscInitStruct.PLL.PLLN = 400;
|
26 | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
|
27 | RCC_OscInitStruct.PLL.PLLQ = 8;
|
28 | */
|
29 |
|
30 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
|
31 | RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
32 | RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
33 | RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
|
34 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
35 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
36 | RCC_OscInitStruct.PLL.PLLM = 25;
|
37 | RCC_OscInitStruct.PLL.PLLN = 432;
|
38 | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
|
39 | RCC_OscInitStruct.PLL.PLLQ = 9; //USB PLLQ 432 / 9 = 48
|
40 |
|
41 | HAL_RCC_OscConfig(&RCC_OscInitStruct);
|
42 |
|
43 |
|
44 | /* Activate the Over-Drive mode */
|
45 | HAL_PWREx_EnableOverDrive();
|
46 |
|
47 | /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
|
48 | clocks dividers */
|
49 | RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
|
50 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
51 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
52 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
|
53 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
|
54 | HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_6);
|
55 |
|
56 |
|
57 | PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_USART6;
|
58 | PeriphClkInitStruct.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;
|
59 | PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
|
60 | PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
|
61 | PeriphClkInitStruct.Usart6ClockSelection = RCC_USART6CLKSOURCE_PCLK2;
|
62 |
|
63 |
|
64 | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
|
65 | {
|
66 | Error_Handler();
|
67 | }
|
68 | }
|