Przeglądaj źródła

Support for multiple chip types building.

Konstantin Oblaukhov 13 lat temu
rodzic
commit
09ac86bb62

+ 86 - 49
cmake/Modules/FindCMSIS.cmake

@@ -1,56 +1,86 @@
-IF(NOT STM32_CHIP_TYPE)
-    MESSAGE(FATAL_ERROR "Select your stm32 chip using STM32_CHIP_TYPE variable. (HD, HD_VL, MD, MD_VL, LD, LD_VL, XD, CL)")
-ENDIF()
+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")
+
+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_CHIP_TYPE STREQUAL "HD")
-    SET(CMSIS_LIB_NAME cmsis_hd)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_hd.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_HD")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "HD_VL")
-    SET(CMSIS_LIB_NAME cmsis_hd_vl)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_hd_vl.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_HD_VL")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "MD")
-    SET(CMSIS_LIB_NAME cmsis_md)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_md.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_MD")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "MD_VL")
-    SET(CMSIS_LIB_NAME cmsis_md_vl)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_md_vl.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_MD_VL")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "LD")
-    SET(CMSIS_LIB_NAME cmsis_ld)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_ld.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_LD")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "LD_VL")
-    SET(CMSIS_LIB_NAME cmsis_ld_vl)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_ld_vl.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_LD_VL")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "XD")
-    SET(CMSIS_LIB_NAME cmsis_xd)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_xd.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_XD")
-ELSEIF(STM32_CHIP_TYPE STREQUAL "CL")
-    SET(CMSIS_LIB_NAME cmsis_cl)
-    SET(CMSIS_STARTUP_NAME startup_stm32f10x_cl.s)
-    SET(STM32_CHIP_DEF "-DSTM32F10X_CL")
+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)")
+    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})
 ELSE()
-    MESSAGE(FATAL_ERROR "Invalid stm32 chip type.")
+    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.")
+    ENDIF()
 ENDIF()
 
 FIND_PATH(CMSIS_INCLUDE_DIR system_stm32f10x.h core_cm3.h stm32f10x.h 
     PATH_SUFFIXES include stm32
 )
 
-FIND_LIBRARY(CMSIS_LIBRARIES
-    NAMES ${CMSIS_LIB_NAME}
-    PATH_SUFFIXES lib
-)
-
-FIND_FILE(CMSIS_STARTUP_SOURCE
-    ${CMSIS_STARTUP_NAME}
-    PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/
-)
+FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS})
+    SET(CMSIS_LIBRARY CMSIS_LIBRARY-NOTFOUND)
+    FIND_LIBRARY(CMSIS_LIBRARY
+        NAMES ${CMSIS_LIB_NAME}
+        PATH_SUFFIXES lib
+    )
+    SET(CMSIS_LIBRARIES ${CMSIS_LIBRARIES} ${CMSIS_LIBRARY})
+ENDFOREACH()
 
 FIND_FILE(CMSIS_LINKER_SCRIPT
     stm32_flash.ld.in
@@ -58,10 +88,17 @@ FIND_FILE(CMSIS_LINKER_SCRIPT
 )
 
 INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT) 
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STM32_CHIP_DEF}")
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STM32_CHIP_DEF}")
+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) 
+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) 
+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)

+ 38 - 26
cmake/Modules/FindStdPeriphLib.cmake

@@ -1,25 +1,34 @@
-IF(NOT STM32_CHIP_TYPE)
-    MESSAGE(FATAL_ERROR "Select your stm32 chip using STM32_CHIP_TYPE variable. (HD, HD_VL, MD, MD_VL, LD, LD_VL, XD, CL)")
-ENDIF()
+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_CHIP_TYPE STREQUAL "HD")
-    SET(StdPeriphLib_LIB_NAME stdperiph_hd)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "HD_VL")
-    SET(StdPeriphLib_LIB_NAME stdperiph_hd_vl)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "MD")
-    SET(StdPeriphLib_LIB_NAME stdperiph_md)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "MD_VL")
-    SET(StdPeriphLib_LIB_NAME stdperiph_md_vl)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "LD")
-    SET(StdPeriphLib_LIB_NAME stdperiph_ld)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "LD_VL")
-    SET(StdPeriphLib_LIB_NAME stdperiph_ld_vl)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "XD")
-    SET(StdPeriphLib_LIB_NAME stdperiph_xd)
-ELSEIF(STM32_CHIP_TYPE STREQUAL "CL")
-    SET(StdPeriphLib_LIB_NAME stdperiph_cl)
+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})
 ELSE()
-    MESSAGE(FATAL_ERROR "Invalid stm32 chip type.")
+    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()
 ENDIF()
 
 FIND_PATH(StdPeriphLib_INCLUDE_DIR 
@@ -49,13 +58,16 @@ FIND_PATH(StdPeriphLib_INCLUDE_DIR
     PATH_SUFFIXES include stm32
 )
 
-FIND_LIBRARY(StdPeriphLib_LIBRARIES
-    NAMES ${StdPeriphLib_LIB_NAME}
-    PATH_SUFFIXES lib
-)
+FOREACH(StdPeriphLib_LIB_NAME ${StdPeriphLib_FIND_LIBS})
+    SET(StdPeriphLib_LIBRARY StdPeriphLib_LIBRARY-NOTFOUND)
+    FIND_LIBRARY(StdPeriphLib_LIBRARY
+        NAMES ${StdPeriphLib_LIB_NAME}
+        PATH_SUFFIXES lib
+    )
+    SET(StdPeriphLib_LIBRARIES ${StdPeriphLib_LIBRARIES} ${StdPeriphLib_LIBRARY})
+ENDFOREACH()
 
+INCLUDE(FindPackageHandleStandardArgs)
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER")
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_STDPERIPH_DRIVER")
-
-INCLUDE(FindPackageHandleStandardArgs)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(StdPeriphLib DEFAULT_MSG StdPeriphLib_LIBRARIES StdPeriphLib_INCLUDE_DIR) 

+ 11 - 8
stdperiph/CMakeLists.txt

@@ -3,6 +3,8 @@ PROJECT(stm32stdperiph)
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 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})
@@ -11,6 +13,7 @@ ENDIF()
 INCLUDE_DIRECTORIES(
     ${STM32_StdPeriphLib_DIR}/Libraries/STM32F10x_StdPeriph_Driver/inc/
     ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMSIS_INCLUDE_DIR}
 )
 
 SET(LIB_SOURCES
@@ -46,28 +49,28 @@ ELSE()
 ENDIF()
 
 ADD_LIBRARY(stdperiph_cl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_cl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_CL")
+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 "STM32F10X_HD")
+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 "STM32F10X_HD_VL")
+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 "STM32F10X_LD")
+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 "STM32F10X_LD_VL")
+SET_TARGET_PROPERTIES(stdperiph_ld_vl PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_LD_VL})
 
 ADD_LIBRARY(stdperiph_md ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_md PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD")
+SET_TARGET_PROPERTIES(stdperiph_md PROPERTIES COMPILE_DEFINITIONS ${STM32_CHIP_DEF_MD})
 
 ADD_LIBRARY(stdperiph_md_vl ${LIB_SOURCES})
-SET_TARGET_PROPERTIES(stdperiph_md_vl PROPERTIES COMPILE_DEFINITIONS "STM32F10X_MD_VL")
+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 "STM32F10X_XL")
+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