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

Merge pull request #2 from ObKo/rework

New, more flexible, scripts.
ObKo 12 лет назад
Родитель
Сommit
31c00e978c

+ 47 - 29
README.mediawiki

@@ -2,11 +2,12 @@
 This project is used to develop applications for stm32 - ST's ARM Cortex-M3 MCUs, using cmake, GCC, newlib (libc) and STM32F10x Standard Peripherals Library.
 
 Requirements:
-* cmake >= 2.6
+* cmake >= 2.8
 * GCC toolchain with newlib.
-* STM32F10x Standard Peripherals Library
+* STM32F10x Standard Peripherals Library for STM32F1 family
 Project contains:
-* CMake toolchain file, that configures cmake to use arm toolchain.
+* CMake common toolchain file, that configures cmake to use arm toolchain.
+* CMake family-specific toolchain file, that configures family-specific parameters.
 * CMake projects that builds CMSIS and STM32F10x Standard Peripherals Library into static libraries.
 * CMake modules to find and configure CMSIS ans StdPeriphLib libraries.
 * CMake project template.
@@ -15,20 +16,23 @@ Project contains:
 ** newlib - show date from RTC using uart and libc functions from newlib
 
 == Building & Installing ==
-First of all you need to configure toolchain and libraries, you can do this by editing gcc_stm32.cmake or pass it throught command line.
+First of all you need to configure toolchain and libraries, you can do this by editing gcc_stm32.cmake or (better way) pass it throught command line.
 Variables for toolchain:
 * TOOLCHAIN_PREFIX - where toolchain is located, '''default''': /usr
 * TARGET_TRIPLET - toolchain target triplet, '''default''': arm-none-eabi
+* STM32_FAMILY - STM32 family (F0, F1, F4, etc.) currently only F1 family supported.
+'''Note:''' If STM32_CHIP variable is set, STM32_FAMILY is optional.
+
 Variables for CMSIS and StdPeriphLib:
 * STM32_StdPeriphLib_DIR - path to STM32F10x Standard Peripherals Library '''default''': /opt/STM32F10x_StdPeriph_Lib_V3.5.0
 * USE_ASSERT - Use internal asserts in Standard Peripherals Library.
 
 === Build CMSIS and Standard Peripherals Library ===
 In cmsis folder:
- cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DCMAKE_INSTALL_PREFIX=<path_to_toolchain>/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
+ cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DSTM32_FAMILY=F1 -DCMAKE_INSTALL_PREFIX=<path_to_toolchain>/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
  make && make install
 In stdperiph folder
- cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DCMAKE_INSTALL_PREFIX=<path_to_toolchain>/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
+ cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DCMAKE_MODULE_PATH=<path_to_cmake_folder_of_this_project>/Modules -DSTM32_FAMILY=F1 -DCMAKE_INSTALL_PREFIX=<path_to_toolchain>/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
  make && make install
 '''Note:''' You can use different CMAKE_INSTALL_PREFIX, but than you'll have to configure cmake search paths when using cmake modules.
 
@@ -36,32 +40,46 @@ 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. 
-Than you need to adjust some variables in CMakeLists.txt (example for stm32f103ve):
-* PROJECT(stm32-template) - Set the project name.
-* FIND_PACKAGE(StdPeriphLib REQUIRED) - comment/remove this if you don't need StdPeriphLib. CMSIS package are always required.
-* STM32_SET_PARAMS("512K" "64K" "0x20010000") - Set chip's flash size, ram size, and stack bottom address. Also, you can change min heap size, stack size, etc. - look into FindCMSIS.cmake
-* All projects sources should be listed in PROJECT_SOURCES variable.
-Also, if you using StdPeriphLib you need to adjust modules in stm32f10x_conf.h.
+Template project can be found in stm32-template folder.
+
+=== Configure === 
+Common usage:
+ cmake -DSTM32_CHIP=<chip> -DCMAKE_TOOLCHAIN_FILE=<path_to_gcc_stm32.cmake> -DCMAKE_BUILD_TYPE=Debug <path_to_source_dir>
+Where <nowiki><chip></nowiki> - stm32 chip name (e.g. STM32F100C8). 
+This command will generate Makefile for project.
+Scripts will try to detected chip parameters (type, flash/ram size) from chip name. 
+You can set this parameters directly using following cmake variables:
+* STM32_CHIP_TYPE - family-depended chip type. Global variable STM32_CHIP_TYPES contains list of valid types for current family (e.g. for F1 family: HD, HD_VL, MD, MD_VL, LD, LD_VL, CL, XL)
+* STM32_FLASH_SIZE - chip flash size (e.g. 64K)
+* STM32_RAM_SIZE - chip RAM size (e.g. 4K)
+
+For using with Eclipse CDT:
+ cmake -DSTM32_CHIP=<chip> -DCMAKE_TOOLCHAIN_FILE=<path_to_gcc_stm32.cmake> -DCMAKE_BUILD_TYPE=Debug -G "Eclipse CDT4 - Unix Makefiles" <path_to_source_dir>
+For release build:
+ cmake -DSTM32_CHIP=<chip> -DCMAKE_TOOLCHAIN_FILE=<path_to_gcc_stm32.cmake> -DCMAKE_BUILD_TYPE=Release <path_to_source_dir>
 
 === Build ===
-Generate Makefile:
- cmake -DSTM32_CHIP_TYPE=<chip type> -DCMAKE_TOOLCHAIN_FILE=<path_to_gcc_stm32.cmake> -DCMAKE_BUILD_TYPE=Debug <path_to_source_dir>
-Where <chip type>:
-* HD - High Density MCUs
-* HD_VL - High Density Value Line MCUs
-* MD - Medium Density MCUs
-* MD_VL - Medium Density Value Line MCUs
-* LD - Low Density MCUs
-* LD_VL - Low Density Value Line MCUs
-* CL - Connectivity Line MCUs
-* XL - XL Density MCUs
-Build:
  make
-The result is a .elf file, to build .hex:
+To build .hex:
  make <project name>.hex
 or .bin:
  make <project name>.bin
-For using with Eclipse CDT:
- cmake -DSTM32_CHIP_TYPE=<chip type> -DCMAKE_TOOLCHAIN_FILE=<path_to_stm32.cmake> -DCMAKE_BUILD_TYPE=Debug -G "Eclipse CDT4 - Unix Makefiles" <path_to_source_dir>
-For release build:
- cmake -DSTM32_CHIP_TYPE=<chip type> -DCMAKE_TOOLCHAIN_FILE=<path_to_stm32.cmake> -DCMAKE_BUILD_TYPE=Release <path_to_source_dir>
+
+=== Linker script variables ===
+Next cmake variables are useful for linker tuning:
+* STM32_FLASH_ORIGIN - Start address of flash (default: 0x08000000)
+* STM32_RAM_ORIGIN - Start address of RAM (default: 0x20000000)
+* STM32_EXT_RAM_ORIGIN - Start address of external RAM (default: 0x60000000)
+* STM32_STACK_ADDRESS - Address of stack bottom (default: RAM_ORIGIN + RAM_SIZE)
+* STM32_FLASH_SIZE - Flash size (default: from chip name)
+* STM32_RAM_SIZE - RAM size (default: from chip name)
+* STM32_EXT_RAM_SIZE - External RAM size (default: 0 bytes)
+* STM32_MIN_STACK_SIZE - Minimum stack size for error detection at link-time (default: 512 bytes)
+* STM32_MIN_HEAP_SIZE - Minimum heap size for error detection at link-time (default: 0 bytes)
+
+=== Useful cmake macros ===
+* STM32_GET_CHIP_TYPE(CHIP CHIP_TYPE) - gets chip type (HD, MD, etc.) from chip name.
+* STM32_GET_CHIP_PARAMETERS(CHIP FLASH_SIZE RAM_SIZE) - gets chip ram/flash size from chip name.
+* STM32_SET_CHIP_DEFINITIONS(TARGET CHIP_TYPE) - sets chip family and type-specific compiler flags for target.
+* 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. 

+ 97 - 89
cmake/Modules/FindCMSIS.cmake

@@ -1,76 +1,34 @@
-SET(STM32_CHIP_DEF_HD "STM32F10X_HD")
-SET(STM32_CHIP_DEF_HD_VL "STM32F10X_HD_VL")
-SET(STM32_CHIP_DEF_MD "STM32F10X_MD")
-SET(STM32_CHIP_DEF_MD_VL "STM32F10X_MD_VL")
-SET(STM32_CHIP_DEF_LD "STM32F10X_LD")
-SET(STM32_CHIP_DEF_LD_VL "STM32F10X_LD_VL")
-SET(STM32_CHIP_DEF_CL "STM32F10X_CL")
-SET(STM32_CHIP_DEF_XL "STM32F10X_XL")
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 
-SET(CMSIS_LIB_NAME_HD "cmsis_hd")
-SET(CMSIS_LIB_NAME_HD_VL "cmsis_hd_vl")
-SET(CMSIS_LIB_NAME_MD "cmsis_md")
-SET(CMSIS_LIB_NAME_MD_VL "cmsis_md_vl")
-SET(CMSIS_LIB_NAME_LD "cmsis_ld")
-SET(CMSIS_LIB_NAME_LD_VL "cmsis_ld_vl")
-SET(CMSIS_LIB_NAME_CL "cmsis_cl")
-SET(CMSIS_LIB_NAME_XL "cmsis_xl")
-
-SET(CMSIS_STARTUP_SOURCE_HD "startup_stm32f10x_hd.s")
-SET(CMSIS_STARTUP_SOURCE_HD_VL "startup_stm32f10x_hd_vl.s")
-SET(CMSIS_STARTUP_SOURCE_MD "startup_stm32f10x_md.s")
-SET(CMSIS_STARTUP_SOURCE_MD_VL "startup_stm32f10x_md_vl.s")
-SET(CMSIS_STARTUP_SOURCE_LD "startup_stm32f10x_ld.s")
-SET(CMSIS_STARTUP_SOURCE_LD_VL "startup_stm32f10x_ld_vl.s")
-SET(CMSIS_STARTUP_SOURCE_CL "startup_stm32f10x_cl.s")
-SET(CMSIS_STARTUP_SOURCE_XL "startup_stm32f10x_xl.s")
+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)
+ENDIF()
 
-IF(NOT STM32_CHIP_TYPE)
-    MESSAGE(STATUS "No stm32 chip selected. You will have to use chip specific variables, i.e. STM32_CHIP_DEF_HD. You can select stm32 chip using STM32_CHIP_TYPE variable. (HD, HD_VL, MD, MD_VL, LD, LD_VL, XL, CL)")
+IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
     UNSET(CMSIS_STARTUP_NAME)
     UNSET(CMSIS_STARTUP_SOURCE)
-    UNSET(STM32_CHIP_DEF)
-    SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_HD} ${CMSIS_LIB_NAME_HD_VL} ${CMSIS_LIB_NAME_MD} ${CMSIS_LIB_NAME_MD_VL} ${CMSIS_LIB_NAME_LD} ${CMSIS_LIB_NAME_LD_VL} ${CMSIS_LIB_NAME_CL} ${CMSIS_LIB_NAME_XL})
+    FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+        STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+        LIST(APPEND CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ENDFOREACH()    
 ELSE()
-    IF(STM32_CHIP_TYPE STREQUAL "HD")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_HD})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_HD})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_HD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "HD_VL")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_HD_VL})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_HD_VL})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_HD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "MD")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_MD})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_MD})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_MD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "MD_VL")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_MD_VL})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_MD_VL})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_MD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "LD")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_LD})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_LD})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_LD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "LD_VL")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_LD_VL})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_LD_VL})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_LD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "XL")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_XL})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_XL})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_XL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "CL")
-        SET(CMSIS_FIND_LIBS ${CMSIS_LIB_NAME_CL})
-        SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_SOURCE_CL})
-        SET(STM32_CHIP_DEF ${STM32_CHIP_DEF_CL})
-    ELSE()
-        MESSAGE(FATAL_ERROR "Invalid stm32 chip type.")
+    IF(NOT STM32_CHIP_TYPE)
+        STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE)
+        IF(NOT STM32_CHIP_TYPE)
+            MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_CHIP_TYPE directly.")
+        ENDIF()
+        MESSAGE(STATUS "${STM32_CHIP} is ${STM32_CHIP_TYPE} device")
     ENDIF()
+    STRING(TOLOWER ${STM32_CHIP_TYPE} STM32_CHIP_TYPE_LOWER)
+    
+    SET(CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${STM32_CHIP_TYPE_LOWER})
+    SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_PREFIX}${STM32_CHIP_TYPE_LOWER}.s)
 ENDIF()
 
-FIND_PATH(CMSIS_INCLUDE_DIR system_stm32f10x.h core_cm3.h stm32f10x.h 
-    PATH_SUFFIXES include stm32
+FIND_PATH(CMSIS_INCLUDE_DIR ${CMSIS_HEADERS}
+    PATH_SUFFIXES include stm32${STM32_FAMILY_LOWER}
 )
 
 FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS})
@@ -79,40 +37,90 @@ FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS})
         NAMES ${CMSIS_LIB_NAME}
         PATH_SUFFIXES lib
     )
-    SET(CMSIS_LIBRARIES ${CMSIS_LIBRARIES} ${CMSIS_LIBRARY})
+    LIST(APPEND CMSIS_LIBRARIES ${CMSIS_LIBRARY})
 ENDFOREACH()
 
-FIND_FILE(CMSIS_LINKER_SCRIPT
-    stm32_flash.ld.in
-    PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/
-)
+FIND_FILE(CMSIS_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT_NAME} PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/)
 
 INCLUDE(FindPackageHandleStandardArgs)
 IF(NOT STM32_CHIP_TYPE)
-    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT STM32_CHIP_DEF_HD STM32_CHIP_DEF_HD_VL STM32_CHIP_DEF_MD STM32_CHIP_DEF_MD_VL STM32_CHIP_DEF_LD STM32_CHIP_DEF_LD_VL STM32_CHIP_DEF_XL STM32_CHIP_DEF_CL) 
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT) 
 ELSE()
     FIND_FILE(CMSIS_STARTUP_SOURCE
         ${CMSIS_STARTUP_NAME}
         PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/
     )
-    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${STM32_CHIP_DEF}")
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${STM32_CHIP_DEF}")
-    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT STM32_CHIP_DEF) 
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT) 
 ENDIF()
 
-FUNCTION(STM32_SET_PARAMS FLASH_SIZE RAM_SIZE STACK_ADDRESS MIN_STACK_SIZE MIN_HEAP_SIZE EXT_RAM_SIZE FLASH_ORIGIN RAM_ORIGIN EXT_RAM_ORIGIN)
-    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld)
-ENDFUNCTION(STM32_SET_PARAMS)
+MACRO(STM32_KB_TO_BYTES KB BYTES)
+    STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB})
+    IF(KILOBYTES)
+        MATH(EXPR ${BYTES} "${KILOBYTES} * 1024")
+    ELSE()
+        SET(${BYTES} ${KB})
+    ENDIF()
+ENDMACRO()
+
+FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_EXT_RAM_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN STM32_EXT_RAM_ORIGIN)
+    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
+ENDFUNCTION()
 
-FUNCTION(STM32_SET_PARAMS FLASH_SIZE RAM_SIZE STACK_ADDRESS)
-    SET(STACK_ADDRESS ${STACK_ADDRESS})
-    SET(FLASH_SIZE ${FLASH_SIZE})
-    SET(RAM_SIZE ${RAM_SIZE})
-    SET(MIN_STACK_SIZE "0x200")
-    SET(MIN_HEAP_SIZE "0")
-    SET(EXT_RAM_SIZE "0K")
-    SET(FLASH_ORIGIN "0x08000000")
-    SET(RAM_ORIGIN "0x20000000")
-    SET(EXT_RAM_ORIGIN "0x60000000")
-    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld)
-ENDFUNCTION(STM32_SET_PARAMS)
+FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
+    STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE)
+    STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE)
+    
+    IF(NOT STM32_FLASH_ORIGIN)
+        SET(STM32_FLASH_ORIGIN "0x08000000")
+    ENDIF() 
+    
+    IF(NOT STM32_RAM_ORIGIN)
+        SET(STM32_RAM_ORIGIN "536870912")
+    ENDIF() 
+    
+    IF(NOT STM32_EXT_RAM_ORIGIN)
+        SET(STM32_EXT_RAM_ORIGIN "0x60000000")
+    ENDIF() 
+    
+    IF(NOT STM32_STACK_ADDRESS)
+        MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}")
+    ENDIF()
+        
+    SET(STM32_FLASH_SIZE ${FLASH_SIZE})
+    SET(STM32_RAM_SIZE ${RAM_SIZE})
+    
+    IF(NOT STM32_MIN_STACK_SIZE)
+        SET(STM32_MIN_STACK_SIZE "0x200")
+    ENDIF()
+    
+    IF(NOT STM32_MIN_HEAP_SIZE)
+        SET(STM32_MIN_HEAP_SIZE "0")
+    ENDIF()
+    
+    IF(NOT STM32_EXT_RAM_SIZE)
+        SET(STM32_EXT_RAM_SIZE "0K")
+    ENDIF()
+    
+    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
+ENDFUNCTION()
+
+FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
+    IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
+        MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
+    ELSE()
+        STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
+        IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
+            MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
+        ENDIF()
+        IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
+            STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
+            IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
+                MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
+            ENDIF()
+            MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
+        ENDIF()
+    ENDIF()
+    STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
+ENDFUNCTION()

+ 43 - 58
cmake/Modules/FindStdPeriphLib.cmake

@@ -1,73 +1,58 @@
-SET(StdPeriphLib_LIB_NAME_HD "stdperiph_hd")
-SET(StdPeriphLib_LIB_NAME_HD_VL "stdperiph_hd_vl")
-SET(StdPeriphLib_LIB_NAME_MD "stdperiph_md")
-SET(StdPeriphLib_LIB_NAME_MD_VL "stdperiph_md_vl")
-SET(StdPeriphLib_LIB_NAME_LD "stdperiph_ld")
-SET(StdPeriphLib_LIB_NAME_LD_VL "stdperiph_ld_vl")
-SET(StdPeriphLib_LIB_NAME_CL "stdperiph_cl")
-SET(StdPeriphLib_LIB_NAME_XL "stdperiph_xl")
+IF(STM32_FAMILY STREQUAL "F1")
+    SET(STDPERIPH_HEADERS
+        stm32f10x_adc.h
+        stm32f10x_bkp.h
+        stm32f10x_can.h
+        stm32f10x_cec.h
+        stm32f10x_crc.h
+        stm32f10x_dac.h
+        stm32f10x_dbgmcu.h
+        stm32f10x_dma.h
+        stm32f10x_exti.h
+        stm32f10x_flash.h
+        stm32f10x_fsmc.h
+        stm32f10x_gpio.h
+        stm32f10x_i2c.h
+        stm32f10x_iwdg.h
+        stm32f10x_pwr.h
+        stm32f10x_rcc.h
+        stm32f10x_rtc.h
+        stm32f10x_sdio.h
+        stm32f10x_spi.h
+        stm32f10x_tim.h
+        stm32f10x_usart.h
+        stm32f10x_wwdg.h
+        stm32f10x_misc.h
+    )
+ENDIF()
 
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 IF(NOT STM32_CHIP_TYPE)
-    SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_HD} ${StdPeriphLib_LIB_NAME_HD_VL} ${StdPeriphLib_LIB_NAME_MD} ${StdPeriphLib_LIB_NAME_MD_VL} ${StdPeriphLib_LIB_NAME_LD} ${StdPeriphLib_LIB_NAME_LD_VL} ${StdPeriphLib_LIB_NAME_CL} ${StdPeriphLib_LIB_NAME_XL})
+    FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+        STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+        LIST(APPEND STDPERIPH_FIND_LIBS stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ENDFOREACH()    
 ELSE()
-    IF(STM32_CHIP_TYPE STREQUAL "HD")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_HD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "HD_VL")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_HD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "MD")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_MD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "MD_VL")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_MD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "LD")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_LD})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "LD_VL")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_LD_VL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "XL")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_XL})
-    ELSEIF(STM32_CHIP_TYPE STREQUAL "CL")
-        SET(StdPeriphLib_FIND_LIBS ${StdPeriphLib_LIB_NAME_CL})
-    ELSE()
-        MESSAGE(FATAL_ERROR "Invalid stm32 chip type.")
-    ENDIF()
+    STRING(TOLOWER ${STM32_CHIP_TYPE} STM32_CHIP_TYPE_LOWER)
+    SET(STDPERIPH_FIND_LIBS stdperiph_${STM32_FAMILY_LOWER}_${STM32_CHIP_TYPE_LOWER})
 ENDIF()
 
-FIND_PATH(StdPeriphLib_INCLUDE_DIR 
-    stm32f10x_adc.h
-    stm32f10x_bkp.h
-    stm32f10x_can.h
-    stm32f10x_cec.h
-    stm32f10x_crc.h
-    stm32f10x_dac.h
-    stm32f10x_dbgmcu.h
-    stm32f10x_dma.h
-    stm32f10x_exti.h
-    stm32f10x_flash.h
-    stm32f10x_fsmc.h
-    stm32f10x_gpio.h
-    stm32f10x_i2c.h
-    stm32f10x_iwdg.h
-    stm32f10x_pwr.h
-    stm32f10x_rcc.h
-    stm32f10x_rtc.h
-    stm32f10x_sdio.h
-    stm32f10x_spi.h
-    stm32f10x_tim.h
-    stm32f10x_usart.h
-    stm32f10x_wwdg.h
-    stm32f10x_misc.h
-    PATH_SUFFIXES include stm32
+FIND_PATH(StdPeriphLib_INCLUDE_DIR ${STDPERIPH_HEADERS}
+    PATH_SUFFIXES include stm32${STM32_FAMILY_LOWER}
 )
 
-FOREACH(StdPeriphLib_LIB_NAME ${StdPeriphLib_FIND_LIBS})
-    SET(StdPeriphLib_LIBRARY StdPeriphLib_LIBRARY-NOTFOUND)
+FOREACH(STDPERIPH_LIB_NAME ${STDPERIPH_FIND_LIBS})
+    SET(StdPeriphLib_LIBRARY STDPERIPH_LIBRARY-NOTFOUND)
     FIND_LIBRARY(StdPeriphLib_LIBRARY
-        NAMES ${StdPeriphLib_LIB_NAME}
+        NAMES ${STDPERIPH_LIB_NAME}
         PATH_SUFFIXES lib
     )
-    SET(StdPeriphLib_LIBRARIES ${StdPeriphLib_LIBRARIES} ${StdPeriphLib_LIBRARY})
+    LIST(APPEND StdPeriphLib_LIBRARIES ${StdPeriphLib_LIBRARY})
 ENDFOREACH()
 
 INCLUDE(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR) 
+
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER")
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_STDPERIPH_DRIVER")
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR) 

+ 39 - 71
cmsis-3.0/CMakeLists.txt

@@ -1,87 +1,55 @@
 PROJECT(stm32cmsis)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ENABLE_LANGUAGE(ASM)
 
-IF(NOT STM32_StdPeriphLib_DIR)
-    SET(STM32_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
-    MESSAGE(STATUS "No STM32_StdPeriphLib_DIR specified, using default: " ${STM32_StdPeriphLib_DIR})
-ENDIF()
-
 IF(NOT CMSIS3_DIR)
     SET(CMSIS3_DIR "/opt/CMSIS")
     MESSAGE(STATUS "No CMSIS3_DIR specified, using default: " ${CMSIS3_DIR})
 ENDIF()
 
+IF(${STM32_FAMILY} STREQUAL "F1")
+    IF(NOT STM32F1_StdPeriphLib_DIR)
+        SET(STM32F1_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
+        MESSAGE(STATUS "No STM32F1_StdPeriphLib_DIR specified, using default: " ${STM32F1_StdPeriphLib_DIR})
+    ENDIF()
+
+    INCLUDE_DIRECTORIES(
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
+    )
+    
+    SET(CMSIS_HEADERS 
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h
+        ${CMSIS3_DIR}/CMSIS/Include/core_cm3.h 
+        ${CMSIS3_DIR}/CMSIS/Include/core_cmFunc.h
+        ${CMSIS3_DIR}/CMSIS/Include/core_cmInstr.h
+    )
+    
+    SET(CMSIS_SOURCES 
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
+    )
+    
+    SET(CMSIS_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/stm32f1_flash.ld.in)
+    SET(STARTUP_PREFIX ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_)
+ENDIF()
+
 INCLUDE_DIRECTORIES(
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
     ${CMSIS3_DIR}/CMSIS/Include/
     ${CMAKE_CURRENT_SOURCE_DIR}
 )
 
-SET(CMSIS_SOURCES
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
-)
-
-SET(STM32_STARTUP_CL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s)
-SET(STM32_STARTUP_HD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s)
-SET(STM32_STARTUP_HD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd_vl.s)
-SET(STM32_STARTUP_LD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s)
-SET(STM32_STARTUP_LD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s)
-SET(STM32_STARTUP_MD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s)
-SET(STM32_STARTUP_MD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s)
-SET(STM32_STARTUP_XL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_xl.s)
-
-ADD_LIBRARY(cmsis_cl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_cl PROPERTIES COMPILE_FLAGS "-DSTM32F10X_CL")
-
-ADD_LIBRARY(cmsis_hd ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_hd PROPERTIES COMPILE_DEFINITIONS "STM32F10X_HD")
-
-ADD_LIBRARY(cmsis_hd_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_hd_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_HD_VL")
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 
-ADD_LIBRARY(cmsis_ld ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_ld PROPERTIES COMPILE_DEFINITIONS "STM32F10X_LD")
-
-ADD_LIBRARY(cmsis_ld_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_ld_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_LD_VL")
-
-ADD_LIBRARY(cmsis_md ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_md PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD")
-
-ADD_LIBRARY(cmsis_md_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_md_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD_VL")
-
-ADD_LIBRARY(cmsis_xl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_xl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_XL")
-
-INSTALL(TARGETS cmsis_cl cmsis_hd cmsis_hd_vl cmsis_ld cmsis_ld_vl cmsis_md cmsis_md_vl cmsis_xl
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib
-)
-
-INSTALL(FILES 
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h
-    ${CMSIS3_DIR}/CMSIS/Include/core_cm3.h 
-    ${CMSIS3_DIR}/CMSIS/Include/core_cmFunc.h
-    ${CMSIS3_DIR}/CMSIS/Include/core_cmInstr.h
-    DESTINATION
-    include
-)
+FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+    STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+    
+    LIST(APPEND CMSIS_STARTUP_FILES ${STARTUP_PREFIX}${CHIP_TYPE_LOWER}.s)
+    LIST(APPEND CMSIS_LIBRARIES cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ADD_LIBRARY(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CMSIS_SOURCES})
+    STM32_SET_CHIP_DEFINITIONS(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+ENDFOREACH()
 
-INSTALL(FILES 
-    ${STM32_STARTUP_CL}
-    ${STM32_STARTUP_HD}
-    ${STM32_STARTUP_HD_VL}
-    ${STM32_STARTUP_MD}
-    ${STM32_STARTUP_MD_VL}
-    ${STM32_STARTUP_LD}
-    ${STM32_STARTUP_LD_VL}
-    ${STM32_STARTUP_XL}
-    ${CMAKE_CURRENT_SOURCE_DIR}/stm32_flash.ld.in
-    DESTINATION
-    share/cmsis/
-)
+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/)

+ 6 - 6
cmsis/stm32_flash.ld.in → cmsis-3.0/stm32f1_flash.ld.in

@@ -15,18 +15,18 @@
 ENTRY(Reset_Handler)
 
 /* Highest address of the user mode stack */
-_estack = ${STACK_ADDRESS};    /* end of RAM */
+_estack = ${STM32_STACK_ADDRESS};    /* end of RAM */
 
 /* Generate a link error if heap and stack don't fit into RAM */
-_Min_Heap_Size = ${MIN_HEAP_SIZE};      /* required amount of heap  */
-_Min_Stack_Size = ${MIN_STACK_SIZE}; /* required amount of stack */
+_Min_Heap_Size = ${STM32_MIN_HEAP_SIZE};      /* required amount of heap  */
+_Min_Stack_Size = ${STM32_MIN_STACK_SIZE}; /* required amount of stack */
 
 /* Specify the memory areas */
 MEMORY
 {
-  FLASH (rx)      : ORIGIN = ${FLASH_ORIGIN}, LENGTH = ${FLASH_SIZE}
-  RAM (xrw)       : ORIGIN = ${RAM_ORIGIN}, LENGTH = ${RAM_SIZE}
-  MEMORY_B1 (rx)  : ORIGIN = ${EXT_RAM_ORIGIN}, LENGTH = ${EXT_RAM_SIZE}
+  FLASH (rx)      : ORIGIN = ${STM32_FLASH_ORIGIN}, LENGTH = ${STM32_FLASH_SIZE}
+  RAM (xrw)       : ORIGIN = ${STM32_RAM_ORIGIN}, LENGTH = ${STM32_RAM_SIZE}
+  MEMORY_B1 (rx)  : ORIGIN = ${STM32_EXT_RAM_ORIGIN}, LENGTH = ${STM32_EXT_RAM_SIZE}
 }
 
 /* Define output sections */

+ 35 - 69
cmsis/CMakeLists.txt

@@ -1,81 +1,47 @@
 PROJECT(stm32cmsis)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ENABLE_LANGUAGE(ASM)
 
-IF(NOT STM32_StdPeriphLib_DIR)
-    SET(STM32_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
-    MESSAGE(STATUS "No STM32_StdPeriphLib_DIR specified, using default: " ${STM32_StdPeriphLib_DIR})
+IF(${STM32_FAMILY} STREQUAL "F1")
+    IF(NOT STM32F1_StdPeriphLib_DIR)
+        SET(STM32F1_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
+        MESSAGE(STATUS "No STM32F1_StdPeriphLib_DIR specified, using default: " ${STM32F1_StdPeriphLib_DIR})
+    ENDIF()
+
+    INCLUDE_DIRECTORIES(
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
+    )
+    
+    SET(CMSIS_HEADERS 
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h
+    )
+    
+    SET(CMSIS_SOURCES 
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
+    )
+    
+    SET(CMSIS_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/stm32f1_flash.ld.in)
+    SET(STARTUP_PREFIX ${STM32F1_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_)
 ENDIF()
 
 INCLUDE_DIRECTORIES(
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/CoreSupport/
     ${CMAKE_CURRENT_SOURCE_DIR}
 )
 
-SET(CMSIS_SOURCES
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c
-)
-
-SET(STM32_STARTUP_CL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s)
-SET(STM32_STARTUP_HD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s)
-SET(STM32_STARTUP_HD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd_vl.s)
-SET(STM32_STARTUP_LD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s)
-SET(STM32_STARTUP_LD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s)
-SET(STM32_STARTUP_MD ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s)
-SET(STM32_STARTUP_MD_VL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s)
-SET(STM32_STARTUP_XL ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_xl.s)
-
-ADD_LIBRARY(cmsis_cl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_cl PROPERTIES COMPILE_FLAGS "-DSTM32F10X_CL")
-
-ADD_LIBRARY(cmsis_hd ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_hd PROPERTIES COMPILE_DEFINITIONS "STM32F10X_HD")
-
-ADD_LIBRARY(cmsis_hd_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_hd_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_HD_VL")
-
-ADD_LIBRARY(cmsis_ld ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_ld PROPERTIES COMPILE_DEFINITIONS "STM32F10X_LD")
-
-ADD_LIBRARY(cmsis_ld_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_ld_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_LD_VL")
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 
-ADD_LIBRARY(cmsis_md ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_md PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD")
-
-ADD_LIBRARY(cmsis_md_vl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_md_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD_VL")
-
-ADD_LIBRARY(cmsis_xl ${CMSIS_SOURCES})
-SET_TARGET_PROPERTIES(cmsis_xl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_XL")
-
-INSTALL(TARGETS cmsis_cl cmsis_hd cmsis_hd_vl cmsis_ld cmsis_ld_vl cmsis_md cmsis_md_vl cmsis_xl
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib
-)
-
-INSTALL(FILES 
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h
-    DESTINATION
-    include
-)
+FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+    STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+    
+    LIST(APPEND CMSIS_STARTUP_FILES ${STARTUP_PREFIX}${CHIP_TYPE_LOWER}.s)
+    LIST(APPEND CMSIS_LIBRARIES cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ADD_LIBRARY(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CMSIS_SOURCES})
+    STM32_SET_CHIP_DEFINITIONS(cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+ENDFOREACH()
 
-INSTALL(FILES 
-    ${STM32_STARTUP_CL}
-    ${STM32_STARTUP_HD}
-    ${STM32_STARTUP_HD_VL}
-    ${STM32_STARTUP_MD}
-    ${STM32_STARTUP_MD_VL}
-    ${STM32_STARTUP_LD}
-    ${STM32_STARTUP_LD_VL}
-    ${STM32_STARTUP_XL}
-    ${CMAKE_CURRENT_SOURCE_DIR}/stm32_flash.ld.in
-    DESTINATION
-    share/cmsis/
-)
+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/)

+ 0 - 0
cmsis-3.0/stm32_flash.ld.in → cmsis/stm32f1_flash.ld.in


+ 66 - 0
gcc_stm32.cmake

@@ -0,0 +1,66 @@
+INCLUDE(CMakeForceCompiler)
+
+SET(STM32_SUPPORTED_FAMILIES "F1" CACHE INTERNAL "stm32 supported families")
+
+IF(NOT TOOLCHAIN_PREFIX)
+     SET(TOOLCHAIN_PREFIX "/usr")
+     MESSAGE(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX})
+ENDIF()
+
+IF(NOT TARGET_TRIPLET)
+    SET(TARGET_TRIPLET "arm-none-eabi")
+    MESSAGE(STATUS "No TARGET_TRIPLET specified, using default: " ${TARGET_TRIPLET})
+ENDIF()
+
+IF(NOT STM32_FAMILY)
+    MESSAGE(STATUS "No STM32_FAMILY specified, trying to get it from STM32_CHIP")
+    IF(NOT STM32_CHIP)
+        SET(STM32_FAMILY "F1" CACHE INTERNAL "stm32 family")
+        MESSAGE(STATUS "Neither STM32_FAMILY nor STM32_CHIP specified, using default STM32_FAMILY: ${STM32_FAMILY}")
+    ELSE()
+        STRING(REGEX REPLACE "^[sS][tT][mM]32(([fF][1-4])|([lL][0-1])|([tT])|([wW])).+$" "\\1" STM32_FAMILY ${STM32_CHIP})
+        STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
+        MESSAGE(STATUS "Selected STM32 family: ${STM32_FAMILY}")
+    ENDIF()
+ENDIF()
+
+STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
+LIST(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} FAMILY_INDEX)
+IF(FAMILY_INDEX EQUAL -1)
+    MESSAGE(FATAL_ERROR "Invalid/unsupported STM32 family: ${STM32_FAMILY}")
+ENDIF()
+
+SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin)
+SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/include)
+SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/lib)
+
+SET(CMAKE_SYSTEM_NAME Generic)
+SET(CMAKE_SYSTEM_PROCESSOR arm)
+
+CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc GNU)
+CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++ GNU)
+SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc)
+
+SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool")
+SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool")
+
+SET(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "c compiler flags debug")
+SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "cxx compiler flags debug")
+SET(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "asm compiler flags debug")
+
+SET(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c compiler flags release")
+SET(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx compiler flags release")
+SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm compiler flags release")
+
+SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET})
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+FUNCTION(STM32_ADD_HEX_BIN_TARGETS TARGET)
+    ADD_CUSTOM_TARGET(${TARGET}.hex DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET} ${TARGET}.hex)
+    ADD_CUSTOM_TARGET(${TARGET}.bin DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET} ${TARGET}.bin)
+ENDFUNCTION()
+
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
+INCLUDE(${CMAKE_CURRENT_LIST_DIR}/gcc_stm32${STM32_FAMILY_LOWER}.cmake)

+ 103 - 40
gcc_stm32f1.cmake

@@ -1,46 +1,109 @@
-# GCC toolchain prefix
-IF(NOT TOOLCHAIN_PREFIX)
-     SET(TOOLCHAIN_PREFIX "/opt/arm-2011.09")
-     MESSAGE(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX})
-ENDIF()
-
-IF(NOT TARGET_TRIPLET)
-    SET(TARGET_TRIPLET "arm-none-eabi")
-    MESSAGE(STATUS "No TARGET_TRIPLET specified, using default: " ${TARGET_TRIPLET})
-ENDIF()
-
-SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin)
-SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/include)
-SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/lib)
-
-SET(CMAKE_SYSTEM_NAME Generic CACHE INTERNAL "system name")
-SET(CMAKE_SYSTEM_PROCESSOR arm CACHE INTERNAL "processor")
-
-SET(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc CACHE INTERNAL "c compiler")
-SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++ CACHE INTERNAL "cxx compiler")
-SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-as CACHE INTERNAL "asm compiler")
-
-SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy")
-SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump")
-
-SET(CMAKE_C_FLAGS "-isystem ${TOOLCHAIN_INC_DIR} -mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
-SET(CMAKE_CXX_FLAGS "-isystem ${TOOLCHAIN_INC_DIR} -mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
+SET(CMAKE_C_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
+SET(CMAKE_CXX_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
 SET(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m3" CACHE INTERNAL "asm compiler flags")
 
+SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "executable linker flags")
+SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "module linker flags")
+SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "shared linker flags")
 
-SET(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "c debug compiler flags")
-SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "cxx debug compiler flags")
-SET(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "asm debug compiler flags")
+SET(STM32_CHIP_TYPES CL HD HD_VL MD MD_VL LD LD_VL XL CACHE INTERNAL "stm32f1 chip types")
+SET(STM32_CODES "10[57]" "10[13].[CDE]" "100.[CDE]" "10[123].[8B]" "100.[8B]" "10[123].[46]" "100.[46]" "10[13].[FG]")
 
-SET(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c release compiler flags")
-SET(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx release compiler flags")
-SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release compiler flags")
+MACRO(STM32_GET_CHIP_TYPE CHIP CHIP_TYPE)
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF](10[012357].[468BCDE]).+$" "\\1" STM32_CODE ${CHIP})
+    SET(INDEX 0)
+    FOREACH(C_TYPE ${STM32_CHIP_TYPES})
+        LIST(GET STM32_CODES ${INDEX} CHIP_TYPE_REGEXP)
+        IF(STM32_CODE MATCHES ${CHIP_TYPE_REGEXP})
+            SET(RESULT_TYPE ${C_TYPE})
+        ENDIF()
+        MATH(EXPR INDEX "${INDEX}+1")
+    ENDFOREACH()
+    SET(${CHIP_TYPE} ${RESULT_TYPE})
+ENDMACRO()
 
-SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "exe link flags")
-SET(CMAKE_MODULE_LINKER_FLAGS "-L${TOOLCHAIN_LIB_DIR} -mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "module link flags")
-SET(CMAKE_SHARED_LINKER_FLAGS "-L${TOOLCHAIN_LIB_DIR} -mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "shared link flags")
+MACRO(STM32_GET_CHIP_PARAMETERS CHIP FLASH_SIZE RAM_SIZE)
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF](10[012357]).[468BCDE]" "\\1" STM32_CODE ${CHIP})
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF]10[012357].([468BCDE])" "\\1" STM32_SIZE_CODE ${CHIP})
+    
+    IF(STM32_SIZE_CODE STREQUAL "4")
+        SET(FLASH "16K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "6")
+        SET(FLASH "32K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "8")
+        SET(FLASH "64K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "B")
+        SET(FLASH "128K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "C")
+        SET(FLASH "256K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "D")
+        SET(FLASH "384K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "E")
+        SET(FLASH "512K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "F")
+        SET(FLASH "768K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "G")
+        SET(FLASH "1024K")
+    ENDIF()
+    
+    STM32_GET_CHIP_TYPE(${CHIP} TYPE)
+    
+    IF(${TYPE} STREQUAL "XL")
+        SET(RAM "80K")
+    ELSEIF(${TYPE} STREQUAL "CL")
+        SET(RAM "64K")
+    ELSEIF((${TYPE} STREQUAL "LD") AND ((STM32_CODE STREQUAL "102") OR (STM32_CODE STREQUAL "101")))
+        IF(STM32_SIZE_CODE STREQUAL "4")
+            SET(RAM "4K")
+        ELSE()
+            SET(RAM "6K")
+        ENDIF()
+    ELSEIF(${TYPE} STREQUAL "LD")
+        IF(STM32_SIZE_CODE STREQUAL "4")
+            SET(RAM "6K")
+        ELSE()
+            SET(RAM "10K")
+        ENDIF()
+    ELSEIF(${TYPE} STREQUAL "LD_VL")
+        SET(RAM "4K")
+    ELSEIF((${TYPE} STREQUAL "MD") AND ((STM32_CODE STREQUAL "102") OR (STM32_CODE STREQUAL "101")))
+        IF(STM32_SIZE_CODE STREQUAL "8")
+            SET(RAM "10K")
+        ELSE()
+            SET(RAM "16K")
+        ENDIF()
+    ELSEIF(${TYPE} STREQUAL "MD")
+        SET(RAM "20K")
+    ELSEIF(${TYPE} STREQUAL "MD_VL")
+        SET(RAM "8K")
+    ELSEIF((${TYPE} STREQUAL "HD") AND (STM32_CODE STREQUAL "101"))
+        IF(STM32_SIZE_CODE STREQUAL "C")
+            SET(RAM "32K")
+        ELSE()
+            SET(RAM "48K")
+        ENDIF()
+    ELSEIF(${TYPE} STREQUAL "HD")
+        IF(STM32_SIZE_CODE STREQUAL "C")
+            SET(RAM "48K")
+        ELSE()
+            SET(RAM "64K")
+        ENDIF()
+    ELSEIF(${TYPE} STREQUAL "HD_VL")
+        IF(STM32_SIZE_CODE STREQUAL "C")
+            SET(RAM "24K")
+        ELSE()
+            SET(RAM "32K")
+        ENDIF()
+    ENDIF()
+    
+    SET(${FLASH_SIZE} ${FLASH})
+    SET(${RAM_SIZE} ${RAM})
+ENDMACRO()
 
-SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET} CACHE INTERNAL "cross root directory")
-SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE INTERNAL "")
-SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY CACHE INTERNAL "")
-SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY CACHE INTERNAL "")
+FUNCTION(STM32_SET_CHIP_DEFINITIONS TARGET CHIP_TYPE)
+    LIST(FIND STM32_CHIP_TYPES ${CHIP_TYPE} TYPE_INDEX)
+    IF(TYPE_INDEX EQUAL -1)
+        MESSAGE(FATAL_ERROR "Invalid/unsupported STM32F1 chip type: ${CHIP_TYPE}")
+    ENDIF()
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "STM32F10X_${CHIP_TYPE}")
+ENDFUNCTION()

+ 75 - 91
stdperiph/CMakeLists.txt

@@ -5,110 +5,94 @@ ENABLE_LANGUAGE(ASM)
 
 FIND_PACKAGE(CMSIS REQUIRED)
 
-IF(NOT STM32_StdPeriphLib_DIR)
-    SET(STM32_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
-    MESSAGE(STATUS "No STM32_StdPeriphLib_DIR specified, using default: " ${STM32_StdPeriphLib_DIR})
+IF(${STM32_FAMILY} STREQUAL "F1")
+    IF(NOT STM32F1_StdPeriphLib_DIR)
+        SET(STM32F1_StdPeriphLib_DIR "/opt/STM32F10x_StdPeriph_Lib_V3.5.0")
+        MESSAGE(STATUS "No STM32F1_StdPeriphLib_DIR specified, using default: " ${STM32F1_StdPeriphLib_DIR})
+    ENDIF()
+
+    INCLUDE_DIRECTORIES(
+        ${STM32F1_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/
+    )
+    
+    SET(STDPERIPH_SOURCE_DIR ${STM32F1_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src)
+    SET(STDPERIPH_HEADER_DIR ${STM32F1_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc)
+    
+    SET(STDPERIPH_HEADERS 
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_adc.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_bkp.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_can.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_cec.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_crc.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_dac.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_dbgmcu.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_dma.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_exti.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_flash.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_fsmc.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_gpio.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_i2c.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_iwdg.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_pwr.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_rcc.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_rtc.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_sdio.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_spi.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_tim.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_usart.h
+        ${STDPERIPH_HEADER_DIR}/stm32f10x_wwdg.h
+    )
+    
+    SET(STDPERIPH_SOURCES
+        ${STDPERIPH_SOURCE_DIR}/misc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_adc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_bkp.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_can.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_cec.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_crc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_dac.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_dbgmcu.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_dma.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_exti.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_flash.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_fsmc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_gpio.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_i2c.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_iwdg.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_pwr.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_rcc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_rtc.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_sdio.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_spi.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_tim.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_usart.c
+        ${STDPERIPH_SOURCE_DIR}/stm32f10x_wwdg.c
+    )
+    
+    INSTALL(FILES ${STDPERIPH_HEADER_DIR}/misc.h RENAME stm32f10x_misc.h DESTINATION include/stm32f1)
 ENDIF()
 
 INCLUDE_DIRECTORIES(
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMSIS_INCLUDE_DIR}
 )
 
-SET(LIB_SOURCES
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c
-)
-
 IF(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()
 
-ADD_LIBRARY(stdperiph_cl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_cl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_CL})
-
-ADD_LIBRARY(stdperiph_hd ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_hd PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_HD})
-
-ADD_LIBRARY(stdperiph_hd_vl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_hd_vl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_HD_VL})
-
-ADD_LIBRARY(stdperiph_ld ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_ld PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_LD})
-
-ADD_LIBRARY(stdperiph_ld_vl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_ld_vl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_LD_VL})
+STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 
-ADD_LIBRARY(stdperiph_md ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_md PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_MD})
+FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+    STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+    
+    LIST(APPEND STDPERIPH_LIBRARIES stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+    ADD_LIBRARY(stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${STDPERIPH_SOURCES})
+    STM32_SET_CHIP_DEFINITIONS(stdperiph_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+ENDFOREACH()
 
-ADD_LIBRARY(stdperiph_md_vl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_md_vl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_MD_VL})
-
-ADD_LIBRARY(stdperiph_xl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_xl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_XL})
-
-INSTALL(TARGETS stdperiph_cl stdperiph_hd stdperiph_hd_vl stdperiph_ld stdperiph_ld_vl stdperiph_md stdperiph_md_vl stdperiph_xl
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib
-)
-
-INSTALL(FILES 
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h
-    DESTINATION
-    include
-)
+INSTALL(TARGETS ${STDPERIPH_LIBRARIES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
 
-INSTALL(FILES 
-    ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h
-    RENAME
-    stm32f10x_misc.h
-    DESTINATION
-    include
-)
+INSTALL(FILES ${STDPERIPH_HEADERS} DESTINATION include/stm32${STM32_FAMILY_LOWER})

+ 5 - 8
stm32-blinky/CMakeLists.txt

@@ -1,14 +1,11 @@
 PROJECT(stm32-blinky)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ENABLE_LANGUAGE(ASM)
 
 FIND_PACKAGE(CMSIS REQUIRED)
 FIND_PACKAGE(StdPeriphLib REQUIRED)
 
-STM32_SET_PARAMS("512K" "64K" "0x20010000")
-SET(CMAKE_EXE_LINKER_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
-
 INCLUDE_DIRECTORIES(
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMSIS_INCLUDE_DIR}
@@ -19,8 +16,8 @@ SET(PROJECT_SOURCES
     main.c
 )
 
-ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
-TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}.elf ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
+ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
+TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
 
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.hex DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.bin DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin)
+STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
+STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})

+ 5 - 8
stm32-newlib/CMakeLists.txt

@@ -1,14 +1,11 @@
 PROJECT(stm32-newlib)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ENABLE_LANGUAGE(ASM)
 
 FIND_PACKAGE(CMSIS REQUIRED)
 FIND_PACKAGE(StdPeriphLib REQUIRED)
 
-STM32_SET_PARAMS("512K" "64K" "0x20010000")
-SET(CMAKE_EXE_LINKER_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
-
 INCLUDE_DIRECTORIES(
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMSIS_INCLUDE_DIR}
@@ -20,8 +17,8 @@ SET(PROJECT_SOURCES
     newlib.c
 )
 
-ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
-TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}.elf ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
+ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
+TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
 
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.hex DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.bin DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin)
+STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
+STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})

+ 5 - 8
stm32-template/CMakeLists.txt

@@ -1,13 +1,10 @@
 PROJECT(stm32-template)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ENABLE_LANGUAGE(ASM)
 
 FIND_PACKAGE(CMSIS REQUIRED)
 
-STM32_SET_PARAMS("512K" "64K" "0x20010000")
-SET(CMAKE_EXE_LINKER_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
-
 INCLUDE_DIRECTORIES(
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMSIS_INCLUDE_DIR}
@@ -18,8 +15,8 @@ SET(PROJECT_SOURCES
     main.c
 )
 
-ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
-TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}.elf ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
+ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
+TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
 
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.hex DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)
-ADD_CUSTOM_TARGET(${CMAKE_PROJECT_NAME}.bin DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin)
+STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
+STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})