Просмотр исходного кода

CMSIS and StdPeriphLib can be used as list of sources now.
See new stm32-blinky-sources example for use-case.
Fix #8

Konstantin Oblaukhov 11 лет назад
Родитель
Сommit
1b98a38c82

+ 2 - 0
README.mediawiki

@@ -45,6 +45,7 @@ In stdperiph folder
 == Usage ==
 After building you need to copy cmake modules in cmake's modules path, or just set CMAKE_MODULE_PATH in project. 
 Template project can be found in stm32-template folder.
+You can use StdPeriphLib and CMSIS both as static libraries or list of source files (see stm32-blinky and stm32-blinky-sources example). 
 
 === Configure === 
 Common usage:
@@ -86,3 +87,4 @@ Next cmake variables are useful for linker tuning:
 * STM32_SET_FLASH_PARAMS(TARGET ...) - sets chip flash/ram parameters for targer.
 * STM32_SET_TARGET_PROPERTIES(TARGET) - sets all needed parameters and compiler flags for target. 
 * STM32_GENERATE_LIBRARIES(NAME SOURCES LIBRARIES) - generates libraries for all chip types in family. Resulting libraries stored in LIBRARIES and have names in ${NAME}_${FAMILY}_${CHIP_TYPE} format.
+* STM32_SET_HSE_VALUE - change HSE frequency definitions (in Hz). You have to use CMSIS and stdperiph sources directly to use this macro (see stm32-blinky-sources example). 

+ 11 - 3
cmake/Modules/FindCMSIS.cmake

@@ -4,10 +4,12 @@ IF(STM32_FAMILY STREQUAL "F1")
     SET(CMSIS_STARTUP_PREFIX startup_stm32f10x_)
     SET(CMSIS_HEADERS system_stm32f10x.h core_cm3.h stm32f10x.h)
     SET(CMSIS_LINKER_SCRIPT_NAME stm32f1_flash.ld.in)
+    SET(CMSIS_SRCS system_stm32f10x.c)
 ELSEIF(STM32_FAMILY STREQUAL "F4")
     SET(CMSIS_STARTUP_PREFIX startup_stm32f)
     SET(CMSIS_HEADERS system_stm32f4xx.h core_cm4.h stm32f4xx.h)
     SET(CMSIS_LINKER_SCRIPT_NAME stm32f4_flash.ld.in)
+    SET(CMSIS_SRCS system_stm32f4xx.c)
 ENDIF()
 
 IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
@@ -44,17 +46,23 @@ FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS})
     LIST(APPEND CMSIS_LIBRARIES ${CMSIS_LIBRARY})
 ENDFOREACH()
 
-FIND_PATH(CMSIS_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT_NAME} 
+FIND_FILE(CMSIS_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT_NAME} 
+    PATHS ${CMAKE_FIND_ROOT_PATH}
     PATH_SUFFIXES share/cmsis cmsis
 )
 
+FOREACH(CMSIS_SRC ${CMSIS_SRCS})
+    FIND_FILE(CMSIS_SRC_FILE NAMES ${CMSIS_SRC} PATHS ${CMAKE_FIND_ROOT_PATH} PATH_SUFFIXES share/cmsis cmsis)
+    LIST(APPEND CMSIS_SOURCES ${CMSIS_SRC_FILE})
+ENDFOREACH()
+
 INCLUDE(FindPackageHandleStandardArgs)
 IF(NOT STM32_CHIP_TYPE)
-    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT) 
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT CMSIS_SOURCES) 
 ELSE()
     FIND_FILE(CMSIS_STARTUP_SOURCE
         ${CMSIS_STARTUP_NAME}
         PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/
     )
-    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT) 
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT CMSIS_SOURCES) 
 ENDIF()

+ 111 - 1
cmake/Modules/FindStdPeriphLib.cmake

@@ -24,6 +24,31 @@ IF(STM32_FAMILY STREQUAL "F1")
         stm32f10x_wwdg.h
         stm32f10x_misc.h
     )
+    SET(STDPERIPH_SRCS
+        misc.c
+        stm32f10x_adc.c
+        stm32f10x_bkp.c
+        stm32f10x_can.c
+        stm32f10x_cec.c
+        stm32f10x_crc.c
+        stm32f10x_dac.c
+        stm32f10x_dbgmcu.c
+        stm32f10x_dma.c
+        stm32f10x_exti.c
+        stm32f10x_flash.c
+        stm32f10x_fsmc.c
+        stm32f10x_gpio.c
+        stm32f10x_i2c.c
+        stm32f10x_iwdg.c
+        stm32f10x_pwr.c
+        stm32f10x_rcc.c
+        stm32f10x_rtc.c
+        stm32f10x_sdio.c
+        stm32f10x_spi.c
+        stm32f10x_tim.c
+        stm32f10x_usart.c
+        stm32f10x_wwdg.c
+    )
 ELSEIF(STM32_FAMILY STREQUAL "F4")
     SET(STDPERIPH_HEADERS
         stm32f4xx_adc.h
@@ -56,6 +81,52 @@ ELSEIF(STM32_FAMILY STREQUAL "F4")
         stm32f4xx_usart.h
         stm32f4xx_wwdg.h
     )
+    
+    SET(STDPERIPH_SRCS
+        misc.c
+        stm32f4xx_adc.c
+        stm32f4xx_can.c
+        stm32f4xx_crc.c
+        stm32f4xx_cryp.c
+        stm32f4xx_cryp_aes.c
+        stm32f4xx_cryp_des.c
+        stm32f4xx_cryp_tdes.c
+        stm32f4xx_dac.c
+        stm32f4xx_dbgmcu.c
+        stm32f4xx_dcmi.c
+        stm32f4xx_dma.c
+        stm32f4xx_dma2d.c
+        stm32f4xx_exti.c
+        stm32f4xx_flash.c
+        stm32f4xx_gpio.c
+        stm32f4xx_hash.c
+        stm32f4xx_hash_md5.c
+        stm32f4xx_hash_sha1.c
+        stm32f4xx_i2c.c
+        stm32f4xx_iwdg.c
+        stm32f4xx_ltdc.c
+        stm32f4xx_pwr.c
+        stm32f4xx_rcc.c
+        stm32f4xx_rng.c
+        stm32f4xx_rtc.c
+        stm32f4xx_sai.c
+        stm32f4xx_sdio.c
+        stm32f4xx_spi.c
+        stm32f4xx_syscfg.c
+        stm32f4xx_tim.c
+        stm32f4xx_usart.c
+        stm32f4xx_wwdg.c
+    )
+    
+    SET(STDPERIPH_SRCS_40_41xxx
+        stm32f4xx_fsmc.c
+    )
+    SET(STDPERIPH_SRCS_427_437xx
+        stm32f4xx_fmc.c
+    )
+    SET(STDPERIPH_SRCS_429_439xx
+        stm32f4xx_fmc.c
+    )
 ENDIF()
 
 STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
@@ -82,9 +153,48 @@ FOREACH(STDPERIPH_LIB_NAME ${STDPERIPH_FIND_LIBS})
     LIST(APPEND StdPeriphLib_LIBRARIES ${StdPeriphLib_LIBRARY})
 ENDFOREACH()
 
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
+
+FOREACH(STDPERIPH_SRC ${STDPERIPH_SRCS})
+    SET(STDPERIPH_SRC_FILE STDPERIPH_SRC_FILE-NOTFOUND)
+    FIND_FILE(STDPERIPH_SRC_FILE NAMES ${STDPERIPH_SRC} PATHS ${CMAKE_FIND_ROOT_PATH} PATH_SUFFIXES share/stdperiph/stm32${STM32_FAMILY_LOWER} stdperiph/stm32${STM32_FAMILY_LOWER})
+    LIST(APPEND StdPeriphLib_SOURCES ${STDPERIPH_SRC_FILE})
+ENDFOREACH()
+
+IF(NOT STM32_CHIP_TYPE)
+    FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+        IF(STDPERIPH_SRCS_${CHIP_TYPE})
+            FOREACH(STDPERIPH_SRC ${STDPERIPH_SRCS_${CHIP_TYPE}})
+                SET(STDPERIPH_SRC_FILE STDPERIPH_SRC_FILE-NOTFOUND)
+                FIND_FILE(STDPERIPH_SRC_FILE NAMES ${STDPERIPH_SRC} PATHS ${CMAKE_FIND_ROOT_PATH} PATH_SUFFIXES share/stdperiph/stm32${STM32_FAMILY_LOWER} stdperiph/stm32${STM32_FAMILY_LOWER})
+                LIST(APPEND StdPeriphLib_SOURCES_${CHIP_TYPE} ${STDPERIPH_SRC_FILE})
+                LIST(APPEND STDPERIPH_SRCSRC StdPeriphLib_SOURCES_${CHIP_TYPE})
+            ENDFOREACH()
+        ENDIF()
+    ENDFOREACH()    
+ELSE()
+    IF(STDPERIPH_SRCS_${STM32_CHIP_TYPE})
+        FOREACH(STDPERIPH_SRC ${STDPERIPH_SRCS_${STM32_CHIP_TYPE}})
+            SET(STDPERIPH_SRC_FILE STDPERIPH_SRC_FILE-NOTFOUND)
+            FIND_FILE(STDPERIPH_SRC_FILE NAMES ${STDPERIPH_SRC} PATHS ${CMAKE_FIND_ROOT_PATH} PATH_SUFFIXES share/stdperiph/stm32${STM32_FAMILY_LOWER} stdperiph/stm32${STM32_FAMILY_LOWER})
+            LIST(APPEND StdPeriphLib_SOURCES ${STDPERIPH_SRC_FILE})
+        ENDFOREACH()
+    ENDIF()
+ENDIF()
+
+IF(STDPERIPH_USE_ASSERT)
+    ADD_DEFINITIONS("-D\"assert_param(expr)\"=\"((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))\"")
+ELSE()
+    ADD_DEFINITIONS("-D\"assert_param(expr)\"=\"((void)0)\"")
+ENDIF()
+
 INCLUDE(FindPackageHandleStandardArgs)
 
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR) 
+IF(NOT STM32_CHIP_TYPE)
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR StdPeriphLib_SOURCES ${STDPERIPH_SRCSRC}) 
+ELSE()
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR StdPeriphLib_SOURCES) 
+ENDIF()
 
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER")
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_STDPERIPH_DRIVER")

+ 2 - 1
cmsis-3.0/CMakeLists.txt

@@ -77,4 +77,5 @@ ENDFOREACH()
 
 INSTALL(TARGETS ${CMSIS_LIBRARIES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
 INSTALL(FILES ${CMSIS_HEADERS} DESTINATION include/stm32${STM32_FAMILY_LOWER})
-INSTALL(FILES ${CMSIS_STARTUP_FILES} ${CMSIS_LINKER_SCRIPT} DESTINATION share/cmsis/)
+INSTALL(FILES ${CMSIS_STARTUP_FILES} ${CMSIS_LINKER_SCRIPT} DESTINATION share/cmsis/)
+INSTALL(FILES ${CMSIS_SOURCES} DESTINATION share/cmsis/)

+ 1 - 0
cmsis/CMakeLists.txt

@@ -75,3 +75,4 @@ ENDFOREACH()
 INSTALL(TARGETS ${CMSIS_LIBRARIES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
 INSTALL(FILES ${CMSIS_HEADERS} DESTINATION include/stm32${STM32_FAMILY_LOWER})
 INSTALL(FILES ${CMSIS_STARTUP_FILES} ${CMSIS_LINKER_SCRIPT} DESTINATION share/cmsis/)
+INSTALL(FILES ${CMSIS_SOURCES} DESTINATION share/cmsis/)

+ 10 - 0
gcc_stm32.cmake

@@ -160,6 +160,16 @@ FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
     MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
 ENDFUNCTION()
 
+FUNCTION(STM32_SET_HSE_VALUE TARGET STM32_HSE_VALUE)   
+    GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
+    IF(TARGET_DEFS)
+        SET(TARGET_DEFS "HSE_VALUE=${STM32_HSE_VALUE};${TARGET_DEFS}")
+    ELSE()
+        SET(TARGET_DEFS "HSE_VALUE=${STM32_HSE_VALUE}")
+    ENDIF()
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
+ENDFUNCTION()
+
 MACRO(STM32_GENERATE_LIBRARIES NAME SOURCES LIBRARIES)
     STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
     FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})

+ 7 - 1
gcc_stm32f1.cmake

@@ -105,5 +105,11 @@ FUNCTION(STM32_SET_CHIP_DEFINITIONS TARGET CHIP_TYPE)
     IF(TYPE_INDEX EQUAL -1)
         MESSAGE(FATAL_ERROR "Invalid/unsupported STM32F1 chip type: ${CHIP_TYPE}")
     ENDIF()
-    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "STM32F1;STM32F10X_${CHIP_TYPE}")
+    GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
+    IF(TARGET_DEFS)
+        SET(TARGET_DEFS "STM32F1;STM32F10X_${CHIP_TYPE};${TARGET_DEFS}")
+    ELSE()
+        SET(TARGET_DEFS "STM32F1;STM32F10X_${CHIP_TYPE}")
+    ENDIF()
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
 ENDFUNCTION()

+ 7 - 1
gcc_stm32f4.cmake

@@ -59,5 +59,11 @@ FUNCTION(STM32_SET_CHIP_DEFINITIONS TARGET CHIP_TYPE)
     IF(TYPE_INDEX EQUAL -1)
         MESSAGE(FATAL_ERROR "Invalid/unsupported STM32F4 chip type: ${CHIP_TYPE}")
     ENDIF()
-    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "STM32F4;STM32F${CHIP_TYPE};")
+    GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
+    IF(TARGET_DEFS)
+        SET(TARGET_DEFS "STM32F4;STM32F${CHIP_TYPE};${TARGET_DEFS}")
+    ELSE()
+        SET(TARGET_DEFS "STM32F4;STM32F${CHIP_TYPE}")
+    ENDIF()
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
 ENDFUNCTION()

+ 6 - 2
stdperiph/CMakeLists.txt

@@ -43,6 +43,7 @@ IF(${STM32_FAMILY} STREQUAL "F1")
         ${STDPERIPH_HEADER_DIR}/stm32f10x_tim.h
         ${STDPERIPH_HEADER_DIR}/stm32f10x_usart.h
         ${STDPERIPH_HEADER_DIR}/stm32f10x_wwdg.h
+        ${STDPERIPH_HEADER_DIR}/misc.h
     )
     
     SET(STDPERIPH_SOURCES
@@ -72,6 +73,7 @@ IF(${STM32_FAMILY} STREQUAL "F1")
     )
     
     INSTALL(FILES ${STDPERIPH_HEADER_DIR}/misc.h RENAME stm32f10x_misc.h DESTINATION include/stm32f1)
+    INSTALL(FILES ${STDPERIPH_SOURCES} DESTINATION share/stdperiph/stm32f1)
 ELSEIF(${STM32_FAMILY} STREQUAL "F4")
     IF(NOT STM32F4_StdPeriphLib_DIR)
         SET(STM32F4_StdPeriphLib_DIR "/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.3.0")
@@ -115,7 +117,7 @@ ELSEIF(${STM32_FAMILY} STREQUAL "F4")
         ${STDPERIPH_HEADER_DIR}/stm32f4xx_tim.h
         ${STDPERIPH_HEADER_DIR}/stm32f4xx_usart.h
         ${STDPERIPH_HEADER_DIR}/stm32f4xx_wwdg.h
-
+        ${STDPERIPH_HEADER_DIR}/misc.h
     )
     
     SET(STDPERIPH_SOURCES
@@ -165,6 +167,8 @@ ELSEIF(${STM32_FAMILY} STREQUAL "F4")
     )
         
     INSTALL(FILES ${STDPERIPH_HEADER_DIR}/misc.h RENAME stm32f4xx_misc.h DESTINATION include/stm32f4)
+    INSTALL(FILES ${STDPERIPH_SOURCES} ${STDPERIPH_SOURCES_40_41xxx} ${STDPERIPH_SOURCES_427_437xx}
+            DESTINATION share/stdperiph/stm32f4)
 ENDIF()
 
 INCLUDE_DIRECTORIES(
@@ -172,7 +176,7 @@ INCLUDE_DIRECTORIES(
     ${CMSIS_INCLUDE_DIR}
 )
 
-IF(USE_ASSERT)
+IF(STDPERIPH_USE_ASSERT)
     ADD_DEFINITIONS("-D\"assert_param(expr)\"=\"((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))\"")
 ELSE()
     ADD_DEFINITIONS("-D\"assert_param(expr)\"=\"((void)0)\"")

+ 25 - 0
stm32-blinky-sources/CMakeLists.txt

@@ -0,0 +1,25 @@
+PROJECT(stm32-blinky)
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+ENABLE_LANGUAGE(ASM)
+
+FIND_PACKAGE(CMSIS REQUIRED)
+FIND_PACKAGE(StdPeriphLib REQUIRED)
+
+INCLUDE_DIRECTORIES(
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMSIS_INCLUDE_DIR}
+    ${StdPeriphLib_INCLUDE_DIR}
+)
+
+SET(PROJECT_SOURCES
+    main.c
+)
+
+SET(STM32_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT})
+
+ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE} ${CMSIS_SOURCES} ${StdPeriphLib_SOURCES})
+
+STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
+STM32_SET_HSE_VALUE(${CMAKE_PROJECT_NAME} 12000000)
+STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})

+ 80 - 0
stm32-blinky-sources/main.c

@@ -0,0 +1,80 @@
+#if defined STM32F1
+# include <stm32f10x.h>
+#elif defined STM32F4
+# include <stm32f4xx.h>
+#endif
+
+void initGPIO()
+{
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
+
+    GPIO_InitTypeDef GPIO_Config;
+#if defined STM32F1
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
+
+    GPIO_Config.GPIO_Pin =  GPIO_Pin_8;
+    GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
+
+    GPIO_Init(GPIOC, &GPIO_Config);
+    GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );
+#elif defined STM32F4
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
+
+    GPIO_Config.GPIO_Mode = GPIO_Mode_AF;
+    GPIO_Config.GPIO_OType = GPIO_OType_PP;
+    GPIO_Config.GPIO_Pin = GPIO_Pin_6;
+    GPIO_Config.GPIO_PuPd = GPIO_PuPd_NOPULL;
+    GPIO_Config.GPIO_Speed = GPIO_Speed_2MHz;
+
+    GPIO_Init(GPIOA, &GPIO_Config);
+    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);
+#endif
+}
+
+void initTimers()
+{
+	SystemCoreClockUpdate();
+
+    TIM_TimeBaseInitTypeDef TIM_BaseConfig;
+    TIM_OCInitTypeDef TIM_OCConfig;
+
+    // 10 kHz timer.
+    TIM_BaseConfig.TIM_Prescaler = (uint16_t)(SystemCoreClock / 10000) - 1;
+    // 10000 / 5000 = 1 Hz blinking.
+    TIM_BaseConfig.TIM_Period = 5000;
+    TIM_BaseConfig.TIM_ClockDivision = 0;
+    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
+
+    TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
+    TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
+    // 2500 / 5000 = 50% duty cycle.
+    TIM_OCConfig.TIM_Pulse = 2499;
+    TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
+
+#if defined STM32F1
+    TIM_OC3Init(TIM3, &TIM_OCConfig);
+#elif defined STM32F4
+    // For STM32F4 timer clock = SystemCoreClock / 2 by default.
+    TIM_BaseConfig.TIM_Prescaler = (uint16_t)(SystemCoreClock / 2 / 10000) - 1;
+    TIM_OC1Init(TIM3, &TIM_OCConfig);
+#endif
+
+    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
+    TIM_TimeBaseInit(TIM3, &TIM_BaseConfig);
+    TIM_ARRPreloadConfig(TIM3, ENABLE);
+    TIM_Cmd(TIM3, ENABLE);
+}
+
+void initAll(void)
+{
+    initGPIO();
+    initTimers();
+}
+
+int main(void)
+{
+    initAll();
+    for (;;);
+    return 0;
+}

+ 30 - 0
stm32-blinky-sources/stm32f10x_conf.h

@@ -0,0 +1,30 @@
+#ifndef __STM32F10x_CONF_H
+#define __STM32F10x_CONF_H
+
+/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
+
+// #include "stm32f10x_adc.h"
+// #include "stm32f10x_bkp.h"
+// #include "stm32f10x_can.h"
+// #include "stm32f10x_cec.h"
+// #include "stm32f10x_crc.h"
+// #include "stm32f10x_dac.h"
+// #include "stm32f10x_dbgmcu.h"
+// #include "stm32f10x_dma.h"
+// #include "stm32f10x_exti.h"
+// #include "stm32f10x_flash.h"
+// #include "stm32f10x_fsmc.h"
+ #include "stm32f10x_gpio.h"
+// #include "stm32f10x_i2c.h"
+// #include "stm32f10x_iwdg.h"
+// #include "stm32f10x_pwr.h"
+ #include "stm32f10x_rcc.h"
+// #include "stm32f10x_rtc.h"
+// #include "stm32f10x_sdio.h"
+// #include "stm32f10x_spi.h"
+ #include "stm32f10x_tim.h"
+// #include "stm32f10x_usart.h"
+// #include "stm32f10x_wwdg.h"
+ #include "stm32f10x_misc.h"
+ 
+#endif

+ 59 - 0
stm32-blinky-sources/stm32f4xx_conf.h

@@ -0,0 +1,59 @@
+#ifndef __STM32F4xx_CONF_H
+#define __STM32F4xx_CONF_H
+
+//#include "stm32f4xx_adc.h"
+//#include "stm32f4xx_crc.h"
+//#include "stm32f4xx_dbgmcu.h"
+//#include "stm32f4xx_dma.h"
+//#include "stm32f4xx_exti.h"
+//#include "stm32f4xx_flash.h"
+#include "stm32f4xx_gpio.h"
+//#include "stm32f4xx_i2c.h"
+//#include "stm32f4xx_iwdg.h"
+//#include "stm32f4xx_pwr.h"
+#include "stm32f4xx_rcc.h"
+//#include "stm32f4xx_rtc.h"
+//#include "stm32f4xx_sdio.h"
+//#include "stm32f4xx_spi.h"
+//#include "stm32f4xx_syscfg.h"
+#include "stm32f4xx_tim.h"
+//#include "stm32f4xx_usart.h"
+//#include "stm32f4xx_wwdg.h"
+#include "stm32f4xx_misc.h"
+
+#if defined (STM32F429_439xx)
+//#include "stm32f4xx_cryp.h"
+//#include "stm32f4xx_hash.h"
+//#include "stm32f4xx_rng.h"
+//#include "stm32f4xx_can.h"
+//#include "stm32f4xx_dac.h"
+//#include "stm32f4xx_dcmi.h"
+//#include "stm32f4xx_dma2d.h"
+//#include "stm32f4xx_fmc.h"
+//#include "stm32f4xx_ltdc.h"
+//#include "stm32f4xx_sai.h"
+#endif
+
+#if defined (STM32F427_437xx)
+//#include "stm32f4xx_cryp.h"
+//#include "stm32f4xx_hash.h"
+//#include "stm32f4xx_rng.h"
+//#include "stm32f4xx_can.h"
+//#include "stm32f4xx_dac.h"
+//#include "stm32f4xx_dcmi.h"
+//#include "stm32f4xx_dma2d.h"
+//#include "stm32f4xx_fmc.h"
+//#include "stm32f4xx_sai.h"
+#endif
+
+#if defined (STM32F40_41xxx)
+//#include "stm32f4xx_cryp.h"
+//#include "stm32f4xx_hash.h"
+//#include "stm32f4xx_rng.h"
+//#include "stm32f4xx_can.h"
+//#include "stm32f4xx_dac.h"
+//#include "stm32f4xx_dcmi.h"
+//#include "stm32f4xx_fsmc.h"
+#endif
+ 
+#endif