Based on the libraries by Zoltan Hudak Added #ifdefs to avoid compile errors, so it is easy to select target board: Bluepill, Maple Mini, Nucleo F103, Nucleo F103 with external 8MHz crystal

Dependents:   STM32F103variants_example

Revision:
4:6568c3b20d29
Parent:
3:e149147d7c13
--- a/stm32f103variants.h	Thu Mar 16 12:36:39 2017 +0000
+++ b/stm32f103variants.h	Mon Mar 20 13:22:25 2017 +0000
@@ -33,19 +33,49 @@
  * Added #ifdefs to avoid compile errors, so it is easy to select target board: Bluepill, Maple Mini, Nucleo F103, Nucleo F103 with external 8MHz crystal
  *
  */
+ /**
+ * Example:
+ * @code
+ #define USE_BOARD USE_MAPLE_MINI
+
+#include "stm32f103variants.h"
+#include "mbed.h"
+
+DigitalOut led1(LED1);
+Serial serialPc(PA_9, PA_10);  //Tx, Rx
+
+int main()
+{
+    led1 = 0;
+    confSysClock();
+    serialPc.baud(460800);
+    serialPc.printf("This is a STM32F103 test.\r\n");
+    serialPc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
+    serialPc.printf("LED=%d\r\n", led1.read());
+
+    while (true)
+    {
+        led1 = !led1;
+        serialPc.printf("LED=%d\r\n", led1.read());
+        wait(1.0);
+    }
+}
+ *
+ */
 
 #ifndef STM32F103variants_H_INCLUDED
 #define STM32F103variants_H_INCLUDED
 
-#include "mbed.h"
-
-bool confSysClock(void);
+#define USE_OTHER 0
+#define USE_BLUEPILL 1
+#define USE_MAPLE_MINI 2
+#define USE_NUCLEO_EXTOSC 3
 
-#define USE_BLUEPILL
-//#define USE_MAPLE_MINI
-//#define USE_NUCLEO_EXTOSC
+#ifndef USE_BOARD
+#define USE_BOARD USE_OTHER
+#endif
 
-#ifdef USE_BLUEPILL
+#if (USE_BOARD == USE_BLUEPILL)
 
 #ifndef MBED_PINNAMES_H
 #define MBED_PINNAMES_H
@@ -221,7 +251,7 @@
 *********************************************************************************************************************
 */
 
-#ifdef USE_MAPLE_MINI
+#if (USE_BOARD == USE_MAPLE_MINI)
 
 #ifndef MBED_PINNAMES_H
 #define MBED_PINNAMES_H
@@ -390,4 +420,63 @@
 
 #endif //USE_MAPLE_MINI
 
+#if (USE_BOARD > USE_OTHER)
+
+bool HSE_SystemClock_Config(void) {
+    RCC_OscInitTypeDef RCC_OscInitStruct;
+
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+    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_HCLK|RCC_CLOCKTYPE_SYSCLK
+                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+    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_ADC|RCC_PERIPHCLK_USB;
+    PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
+    PeriphClkInit.UsbClockSelection = RCC_USBPLLCLK_DIV1_5;
+    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
+        return false;
+    }
+    return true;
+}
+
+bool doConfSysClock()
+{
+    HAL_RCC_DeInit();
+    if (!HSE_SystemClock_Config()) {
+        return false;
+    }
+    SystemCoreClockUpdate();
+    return true;
+}
+
+#endif //(USE_BOARD > USE_OTHER)
+
+bool confSysClock(void) {
+#if (USE_BOARD > USE_OTHER)
+    return doConfSysClock();
+#else
+    return false;
+#endif
+}
+
 #endif /* STM32F103variants_H_INCLUDED */