1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2018-11-06 RiceChen first version
9 */
10
11 #include <board.h>
12 #include <drv_common.h>
13
SystemClock_Config(void)14 void SystemClock_Config(void)
15 {
16 RCC_OscInitTypeDef RCC_OscInitStruct;
17 RCC_ClkInitTypeDef RCC_ClkInitStruct;
18 RCC_PeriphCLKInitTypeDef PeriphClkInit;
19
20 /**Configure LSE Drive Capability
21 */
22 HAL_PWR_EnableBkUpAccess();
23
24 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
25
26 /**Initializes the CPU, AHB and APB busses clocks
27 */
28 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_LSE
29 |RCC_OSCILLATORTYPE_MSI;
30 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
31 RCC_OscInitStruct.LSIState = RCC_LSI_ON;
32 RCC_OscInitStruct.MSIState = RCC_MSI_ON;
33 RCC_OscInitStruct.MSICalibrationValue = 0;
34 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
35 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
36 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
37 RCC_OscInitStruct.PLL.PLLM = 1;
38 RCC_OscInitStruct.PLL.PLLN = 16;
39 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
40 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
41 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
42 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
43 {
44 _Error_Handler(__FILE__, __LINE__);
45 }
46
47 /**Initializes the CPU, AHB and APB busses clocks
48 */
49 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
50 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
51 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
52 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
53 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
54 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
55
56 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
57 {
58 _Error_Handler(__FILE__, __LINE__);
59 }
60
61 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART2;
62 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
63 PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
64 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
65 {
66 _Error_Handler(__FILE__, __LINE__);
67 }
68
69 /**Configure the main internal regulator output voltage
70 */
71 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
72 {
73 _Error_Handler(__FILE__, __LINE__);
74 }
75
76 /**Configure the Systick interrupt time
77 */
78 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
79
80 /**Configure the Systick
81 */
82 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
83
84 /**Enable MSI Auto calibration
85 */
86 HAL_RCCEx_EnableMSIPLLMode();
87
88 /* SysTick_IRQn interrupt configuration */
89 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
90 }
91