board.c 7.8 KB

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