STM32 USB clock configuration with STM32F3 support

Fork of STM32_USB48MHz by Norimasa Okamoto

Revision:
1:c97a4f5cb6cf
Parent:
0:0c251314fe4b
--- a/STM32_USB48MHz.cpp	Sat Jun 20 00:43:28 2015 +0000
+++ b/STM32_USB48MHz.cpp	Wed Sep 21 20:49:31 2016 +0100
@@ -97,6 +97,107 @@
     return src;
 }
 
+#elif defined(TARGET_STM32F3)
+bool HSE_SystemClock_Config(void) {
+    RCC_OscInitTypeDef RCC_OscInitStruct;
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+    RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
+    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
+    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
+    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
+        return false;
+    }
+    RCC_ClkInitTypeDef RCC_ClkInitStruct;
+    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
+    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
+        return false;
+    }
+    RCC_PeriphCLKInitTypeDef PeriphClkInit;
+    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
+    PeriphClkInit.USBClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
+    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
+        return false;
+    }
+    return true;
+}
+
+bool HSI_SystemClock_Config(void) {
+    RCC_OscInitTypeDef RCC_OscInitStruct;
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+    RCC_OscInitStruct.HSICalibrationValue = 8;
+    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; // HSI will be predivided by 2
+    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
+    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
+        return false;
+    }
+    RCC_ClkInitTypeDef RCC_ClkInitStruct;
+    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
+    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
+        return false;
+    }
+    RCC_PeriphCLKInitTypeDef PeriphClkInit;
+    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
+    PeriphClkInit.USBClockSelection = RCC_USBCLKSOURCE_PLL;
+    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
+        return false;
+    }
+    return true;
+}
+
+uint32_t STM32_getUSBclock() {
+    RCC_OscInitTypeDef RCC_OscInitStruct;
+    HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
+    uint32_t src = 0;
+    switch(RCC_OscInitStruct.PLL.PLLSource) {
+        case RCC_PLLSOURCE_HSI:
+            src = HSI_VALUE;
+            break;
+        case RCC_PLLSOURCE_HSE:
+            src = HSE_VALUE;
+            switch(RCC_OscInitStruct.HSEPredivValue) {
+                case RCC_HSE_PREDIV_DIV1: src /= 1; break;
+                case RCC_HSE_PREDIV_DIV2: src /= 2; break;
+            }
+            break;
+    }
+    switch(RCC_OscInitStruct.PLL.PLLMUL) {
+        case RCC_PLL_MUL2: src *= 2; break;
+        case RCC_PLL_MUL3: src *= 3; break;
+        case RCC_PLL_MUL4: src *= 4; break;
+        case RCC_PLL_MUL5: src *= 5; break;
+        case RCC_PLL_MUL6: src *= 6; break;
+        case RCC_PLL_MUL7: src *= 7; break;
+        case RCC_PLL_MUL8: src *= 8; break;
+        case RCC_PLL_MUL9: src *= 9; break;
+        case RCC_PLL_MUL10: src *= 10; break;
+        case RCC_PLL_MUL11: src *= 11; break;
+        case RCC_PLL_MUL12: src *= 12; break;
+        case RCC_PLL_MUL13: src *= 13; break;
+        case RCC_PLL_MUL14: src *= 14; break;
+        case RCC_PLL_MUL15: src *= 15; break;
+        case RCC_PLL_MUL16: src *= 16; break;
+    }
+    RCC_PeriphCLKInitTypeDef  PeriphClkInit;
+    HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInit);
+    switch(PeriphClkInit.USBClockSelection) {
+        case RCC_USBCLKSOURCE_PLL: src /= 1; break;
+        case RCC_USBCLKSOURCE_PLL_DIV1_5: src = src * 2 / 3; break;
+    }
+    return src;
+}
+
 #elif defined(TARGET_STM32L1)
 bool HSE_SystemClock_Config(void) { // STM32L152RE
     __PWR_CLK_ENABLE();