1
0

board.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. * 2019-02-05 gw first version
  9. * 2019-05-05 Zero-Free Adding multiple configurations for system clock frequency
  10. */
  11. #include <board.h>
  12. void SystemClock_Config(void)
  13. {
  14. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  15. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  16. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  17. #ifdef BSP_USING_ONCHIP_RTC
  18. /**Configure LSE Drive Capability
  19. */
  20. HAL_PWR_EnableBkUpAccess();
  21. __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
  22. #endif
  23. /**Initializes the CPU, AHB and APB busses clocks
  24. */
  25. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  26. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  27. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  28. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  29. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  30. RCC_OscInitStruct.PLL.PLLM = 1;
  31. RCC_OscInitStruct.PLL.PLLN = 10;
  32. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  33. RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  34. RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  35. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  36. {
  37. Error_Handler();
  38. }
  39. /**Initializes the CPU, AHB and APB busses clocks
  40. */
  41. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  42. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  43. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  44. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  45. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  46. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  47. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  48. {
  49. Error_Handler();
  50. }
  51. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  52. PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  53. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  54. {
  55. Error_Handler();
  56. }
  57. /**Configure the main internal regulator output voltage
  58. */
  59. if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  60. {
  61. Error_Handler();
  62. }
  63. }
  64. #ifdef RT_USING_PM
  65. void SystemClock_MSI_ON(void)
  66. {
  67. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  68. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  69. /* Initializes the CPU, AHB and APB busses clocks */
  70. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  71. RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  72. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  73. {
  74. RT_ASSERT(0);
  75. }
  76. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  77. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  78. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  79. {
  80. Error_Handler();
  81. }
  82. }
  83. void SystemClock_MSI_OFF(void)
  84. {
  85. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  86. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  87. RCC_OscInitStruct.HSIState = RCC_MSI_OFF;
  88. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
  89. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  90. {
  91. Error_Handler();
  92. }
  93. }
  94. void SystemClock_80M(void)
  95. {
  96. RCC_OscInitTypeDef RCC_OscInitStruct;
  97. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  98. /**Initializes the CPU, AHB and APB busses clocks */
  99. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  100. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  101. RCC_OscInitStruct.HSICalibrationValue = 16;
  102. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  103. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  104. RCC_OscInitStruct.PLL.PLLM = 1;
  105. RCC_OscInitStruct.PLL.PLLN = 10;
  106. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  107. RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  108. RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  109. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  110. {
  111. Error_Handler();
  112. }
  113. /**Initializes the CPU, AHB and APB busses clocks
  114. */
  115. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  116. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  117. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  118. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  119. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  120. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  121. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  122. {
  123. Error_Handler();
  124. }
  125. }
  126. void SystemClock_24M(void)
  127. {
  128. RCC_OscInitTypeDef RCC_OscInitStruct;
  129. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  130. RCC_PeriphCLKInitTypeDef PeriphClkInit;
  131. /** Initializes the CPU, AHB and APB busses clocks */
  132. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  133. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  134. RCC_OscInitStruct.HSICalibrationValue = 16;
  135. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  136. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  137. RCC_OscInitStruct.PLL.PLLM = 1;
  138. RCC_OscInitStruct.PLL.PLLN = 12;
  139. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  140. RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  141. RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV8;
  142. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  143. {
  144. Error_Handler();
  145. }
  146. /** Initializes the CPU, AHB and APB busses clocks */
  147. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  148. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  149. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  150. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  151. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  152. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  153. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  154. {
  155. Error_Handler();
  156. }
  157. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  158. PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  159. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  160. {
  161. Error_Handler();
  162. }
  163. }
  164. void SystemClock_2M(void)
  165. {
  166. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  167. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  168. /* MSI is enabled after System reset, update MSI to 2Mhz (RCC_MSIRANGE_5) */
  169. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  170. RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  171. RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  172. RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  173. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  174. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  175. {
  176. /* Initialization Error */
  177. Error_Handler();
  178. }
  179. /* Select MSI as system clock source and configure the HCLK, PCLK1 and PCLK2
  180. clocks dividers */
  181. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  182. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  183. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  184. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  185. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  186. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  187. {
  188. /* Initialization Error */
  189. Error_Handler();
  190. }
  191. }
  192. /**
  193. * @brief Configures system clock after wake-up from STOP: enable HSI, PLL
  194. * and select PLL as system clock source.
  195. * @param None
  196. * @retval None
  197. */
  198. void SystemClock_ReConfig(uint8_t mode)
  199. {
  200. SystemClock_MSI_ON();
  201. switch (mode)
  202. {
  203. case PM_RUN_MODE_HIGH_SPEED:
  204. case PM_RUN_MODE_NORMAL_SPEED:
  205. SystemClock_80M();
  206. break;
  207. case PM_RUN_MODE_MEDIUM_SPEED:
  208. SystemClock_24M();
  209. break;
  210. case PM_RUN_MODE_LOW_SPEED:
  211. SystemClock_2M();
  212. break;
  213. default:
  214. break;
  215. }
  216. // SystemClock_MSI_OFF();
  217. }
  218. #endif