Guest User

Untitled

a guest
Apr 21st, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include "main.h"
  2. #include "stm32f1xx_hal.h"
  3. #include "i2c.h"
  4. #include "gpio.h"
  5.  
  6. #include "oled.h"
  7.  
  8. void SystemClock_Config(void);
  9. void TM_SystemClock_Config(uint32_t PLLMUL);
  10. void TM_UpdateStatus(void);
  11.  
  12. void TM_UpdateStatus(void) {
  13. OLED_FillScreen(Black);
  14. OLED_SetCursor(0, 0);
  15. OLED_Printf("~~TechMaker~~\n");
  16. OLED_Printf("Overclocking...\n");
  17. OLED_Printf("CLK: %i MHz\n", HAL_RCC_GetHCLKFreq() / 1000000);
  18. OLED_UpdateScreen();
  19. }
  20.  
  21. int main(void) {
  22. HAL_Init();
  23.  
  24. uint32_t mults[] = {
  25. RCC_PLL_MUL2,
  26. RCC_PLL_MUL3,
  27. RCC_PLL_MUL4,
  28. RCC_PLL_MUL5,
  29. RCC_PLL_MUL6,
  30. RCC_PLL_MUL7,
  31. RCC_PLL_MUL8,
  32. RCC_PLL_MUL9,
  33. RCC_PLL_MUL10,
  34. RCC_PLL_MUL11,
  35. RCC_PLL_MUL12,
  36. RCC_PLL_MUL13,
  37. RCC_PLL_MUL14,
  38. RCC_PLL_MUL15,
  39. RCC_PLL_MUL16 };
  40.  
  41. SystemClock_Config();
  42.  
  43. MX_GPIO_Init();
  44. MX_I2C2_Init();
  45.  
  46. OLED_Init(&hi2c2);
  47. OLED_DisplayOn();
  48.  
  49. TM_UpdateStatus();
  50.  
  51. while (1) {
  52. for (int i = 0; i < sizeof(mults)/sizeof(mults[0]); i++) {
  53. // set new clock
  54. TM_SystemClock_Config(mults[i]);
  55. // update i2c speed
  56. MX_I2C2_Init();
  57. // Update OLED with new values
  58. TM_UpdateStatus();
  59.  
  60. // Do some tests and hard work ;)
  61. for (int count = 0; count < 5; ++count) {
  62. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  63. HAL_Delay(100);
  64. }
  65. }
  66. }
  67. }
  68.  
  69. /**
  70. * @brief System Clock Configuration
  71. * @retval None
  72. */
  73. void SystemClock_Config(void) {
  74.  
  75. RCC_OscInitTypeDef RCC_OscInitStruct;
  76. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  77.  
  78. /**Initializes the CPU, AHB and APB busses clocks
  79. */
  80. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  81. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  82. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  83. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  84. _Error_Handler(__FILE__, __LINE__);
  85. }
  86.  
  87. /**Initializes the CPU, AHB and APB busses clocks
  88. */
  89. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  90. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  91. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  92. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  93. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  94. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  95.  
  96. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
  97. _Error_Handler(__FILE__, __LINE__);
  98. }
  99.  
  100. HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
  101.  
  102. /**Configure the Systick interrupt time
  103. */
  104. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
  105.  
  106. /**Configure the Systick
  107. */
  108. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  109.  
  110. /* SysTick_IRQn interrupt configuration */
  111. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  112. }
  113.  
  114.  
  115. void TM_SystemClock_Config(uint32_t PLLMUL) {
  116.  
  117. RCC_OscInitTypeDef RCC_OscInitStruct;
  118. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  119.  
  120. // revert to HSE source
  121. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  122. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  123. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; // <- HSE
  124. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  125. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  126. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  127.  
  128. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
  129. _Error_Handler(__FILE__, __LINE__);
  130. }
  131.  
  132. // Setup PLL with new multiplier
  133. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  134. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  135. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  136. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  137. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  138. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  139. RCC_OscInitStruct.PLL.PLLMUL = PLLMUL; // <- multiplier is here :)
  140. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  141. _Error_Handler(__FILE__, __LINE__);
  142. }
  143.  
  144. // Go back to PLL source
  145. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  146. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  147. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // <- PLL welcome back
  148. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  149. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  150. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  151.  
  152. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
  153. _Error_Handler(__FILE__, __LINE__);
  154. }
  155.  
  156. /**Configure the Systick interrupt time
  157. */
  158. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
  159.  
  160. /**Configure the Systick
  161. */
  162. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  163.  
  164. /* SysTick_IRQn interrupt configuration */
  165. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  166.  
  167. }
Add Comment
Please, Sign In to add comment