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

F0 family.

Made family code more common.
Konstantin Oblaukhov 5 лет назад
Родитель
Сommit
7c6055cfef
6 измененных файлов с 130 добавлено и 105 удалено
  1. 10 8
      cmake/FindCMSIS.cmake
  2. 59 21
      cmake/stm32/common.cmake
  3. 25 0
      cmake/stm32/f0.cmake
  4. 6 75
      cmake/stm32/f4.cmake
  5. 29 0
      cmake/stm32/utilities.cmake
  6. 1 1
      tests/cmsis/CMakeLists.txt

+ 10 - 8
cmake/FindCMSIS.cmake

@@ -1,16 +1,14 @@
 if(NOT CMSIS_FIND_COMPONENTS)
 if(NOT CMSIS_FIND_COMPONENTS)
-    set(CMSIS_FIND_COMPONENTS STM32F4)
+    set(CMSIS_FIND_COMPONENTS STM32F0 STM32F4)
 endif()
 endif()
 
 
 include(stm32/devices)
 include(stm32/devices)
     
     
-function(cmsis_generate_default_linker_script FAMILY DEVICE)    
-    if(${FAMILY} STREQUAL "F4")
-        stm32f4_memory_info(${DEVICE} 
-            FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE 
-            FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
-        )
-    endif()
+function(cmsis_generate_default_linker_script FAMILY DEVICE)
+    stm32_get_memory_info(${FAMILY} ${DEVICE} 
+        FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE 
+        FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
+    )
     add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
     add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
         COMMAND ${CMAKE_COMMAND} 
         COMMAND ${CMAKE_COMMAND} 
             -DFLASH_ORIGIN="${FLASH_ORIGIN}" 
             -DFLASH_ORIGIN="${FLASH_ORIGIN}" 
@@ -59,6 +57,10 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         NO_DEFAULT_PATH
         NO_DEFAULT_PATH
     )  
     )  
     
     
+    if (NOT CMSIS_${FAMILY}_PATH)
+        continue()
+    endif()
+    
     if(NOT CMSIS_${FAMILY}_VERSION)
     if(NOT CMSIS_${FAMILY}_VERSION)
         file(STRINGS "${CMSIS_${FAMILY}_PATH}/ARM.CMSIS.pdsc" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
         file(STRINGS "${CMSIS_${FAMILY}_PATH}/ARM.CMSIS.pdsc" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
         list(GET VERSION_STRINGS 0 STR)
         list(GET VERSION_STRINGS 0 STR)

+ 59 - 21
cmake/stm32/common.cmake

@@ -27,10 +27,18 @@ find_program(CMAKE_DEBUGGER NAMES ${STM32_TARGET_TRIPLET}-gdb PATHS ${TOOLCHAIN_
 find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH})
 find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH})
 
 
 function(stm32_get_chip_type FAMILY DEVICE TYPE)
 function(stm32_get_chip_type FAMILY DEVICE TYPE)
-    if(${FAMILY} STREQUAL "F4")
-        stm32f4_get_type(${DEVICE} T)
+    set(INDEX 0)
+    foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
+        list(GET STM32_${FAMILY}_TYPE_MATCH ${INDEX} REGEXP)
+        if(${DEVICE} MATCHES ${REGEXP})
+            set(RESULT_TYPE ${C_TYPE})
+        endif()
+        math(EXPR INDEX "${INDEX}+1")
+    endforeach()
+    if(NOT RESULT_TYPE)
+        message(FATAL_ERROR "Invalid/unsupported device: ${DEVICE}")
     endif()
     endif()
-    set(${TYPE} ${T} PARENT_SCOPE)
+    set(${TYPE} ${RESULT_TYPE} PARENT_SCOPE)
 endfunction()
 endfunction()
 
 
 function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
 function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
@@ -57,34 +65,64 @@ function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
     set(${TYPE} ${STM32_TYPE} PARENT_SCOPE)
     set(${TYPE} ${STM32_TYPE} PARENT_SCOPE)
 endfunction()
 endfunction()
 
 
+function(stm32_get_memory_info FAMILY DEVICE 
+    FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE 
+    FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
+)
+    string(REGEX REPLACE "^[FHL][0-9][0-9][0-9].([468BCDEGHI])$" "\\1" SIZE_CODE ${DEVICE})
+    
+    if(SIZE_CODE STREQUAL "4")
+        set(FLASH "16K")
+    elseif(SIZE_CODE STREQUAL "6")
+        set(FLASH "32K")
+    elseif(SIZE_CODE STREQUAL "8")
+        set(FLASH "64K")
+    elseif(SIZE_CODE STREQUAL "B")
+        set(FLASH "128K")
+    elseif(SIZE_CODE STREQUAL "C")
+        set(FLASH "256K")
+    elseif(SIZE_CODE STREQUAL "D")
+        set(FLASH "384K")
+    elseif(SIZE_CODE STREQUAL "E")
+        set(FLASH "512K")
+    elseif(SIZE_CODE STREQUAL "G")
+        set(FLASH "1024K")
+    elseif(SIZE_CODE STREQUAL "H")
+        set(FLASH "1536K")
+    elseif(SIZE_CODE STREQUAL "I")
+        set(FLASH "2048K")
+    else()
+        set(FLASH "16K")
+        message(WARNING "Unknow flash size for device ${DEVICE}")
+    endif()
+    
+    stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
+    list(FIND STM32_${FAMILY}_TYPES ${TYPE} TYPE_INDEX)
+    list(GET STM32_${FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
+    list(GET STM32_${FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
+
+    set(${FLASH_SIZE} ${FLASH} PARENT_SCOPE)
+    set(${RAM_SIZE} ${RAM} PARENT_SCOPE)
+    set(${CCRAM_SIZE} ${CCRAM} PARENT_SCOPE)
+    set(${STACK_SIZE} 0x400 PARENT_SCOPE)
+    set(${HEAP_SIZE} 0x200 PARENT_SCOPE)
+    set(${FLASH_ORIGIN} 0x8000000 PARENT_SCOPE)
+    set(${RAM_ORIGIN} 0x20000000 PARENT_SCOPE)
+    set(${CCRAM_ORIGIN} 0x10000000 PARENT_SCOPE)
+endfunction()
+
 function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
 function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
     get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
     get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
     target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
     target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
 endfunction()
 endfunction()
 
 
-foreach(FAMILY ${STM32_SUPPORTED_FAMILIES})
-    if(NOT (TARGET STM32::${FAMILY}))
-        add_library(STM32::${FAMILY} INTERFACE IMPORTED)
-        target_compile_options(STM32::${FAMILY} INTERFACE 
-            --sysroot="${TOOLCHAIN_SYSROOT}"
-            -mthumb -mabi=aapcs -Wall -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -ffast-math
-            $<$<CONFIG:Debug>:-Og>
-            $<$<CONFIG:Release>:-Os>
-        )
-        target_link_options(STM32::${FAMILY} INTERFACE 
-            --sysroot="${TOOLCHAIN_SYSROOT}"
-            -mthumb -mabi=aapcs -Wl,--gc-sections
-            $<$<CONFIG:Debug>:-Og>
-            $<$<CONFIG:Release>:-Os -s>
-        )
-    endif()
-endforeach()
-
 if(NOT (TARGET STM32::NoSys))
 if(NOT (TARGET STM32::NoSys))
     add_library(STM32::NoSys INTERFACE IMPORTED)
     add_library(STM32::NoSys INTERFACE IMPORTED)
     target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
     target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
     target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
     target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
 endif()
 endif()
 
 
+include(stm32/utilities)
+include(stm32/f0)
 include(stm32/f4)
 include(stm32/f4)
 
 

+ 25 - 0
cmake/stm32/f0.cmake

@@ -0,0 +1,25 @@
+set(STM32_F0_TYPES 
+    030x6 030x8 031x6 038xx 042x6 048xx 051x8 058xx 
+    070x6 070xB 071xB 072xB 078xx 091xC 098xx 030xC
+)
+set(STM32_F0_TYPE_MATCH 
+    "F030.[46]" "F030.8" "F031.[46]" "F038.." "F042.[46]" "F048.." "F051.[468]" "F058.."
+    "F070.6" "F070.B" "F071.[8B]" "F072.[8B]" "F078.." "F091.[BC]" "F098.." "F030.C"
+)
+set(STM32_F0_RAM_SIZES 
+     4K  8K  4K  4K  6K  6K  8K  8K
+     6K 16K 16K 16K 16K 32K 32K 32K
+)
+set(STM32_F0_CCRAM_SIZES 
+     0K  0K  0K  0K  0K  0K  0K  0K
+     0K  0K  0K  0K  0K  0K  0K  0K
+)
+
+stm32_util_create_family_targets(F0)
+
+target_compile_options(STM32::F0 INTERFACE 
+    -mcpu=cortex-m0
+)
+target_link_options(STM32::F0 INTERFACE 
+    -mcpu=cortex-m0
+)

+ 6 - 75
cmake/stm32/f4.cmake

@@ -1,98 +1,29 @@
-set(STM32F4_TYPES 
+set(STM32_F4_TYPES 
     401xC 401xE 405xx 407xx 410Cx 410Rx 410Tx 411xE 
     401xC 401xE 405xx 407xx 410Cx 410Rx 410Tx 411xE 
     412Cx 412Rx 412Vx 412Zx 413xx 415xx 417xx 423xx
     412Cx 412Rx 412Vx 412Zx 413xx 415xx 417xx 423xx
     427xx 429xx 437xx 439xx 446xx 469xx 479xx
     427xx 429xx 437xx 439xx 446xx 469xx 479xx
 )
 )
-set(STM32F4_TYPE_MATCH 
+set(STM32_F4_TYPE_MATCH 
     "F401.[CB]" "F401.[ED]" "F405.." "F407.." "F410C." "F410R." "F410T." "F411.[CE]"
     "F401.[CB]" "F401.[ED]" "F405.." "F407.." "F410C." "F410R." "F410T." "F411.[CE]"
     "F412C." "F412R." "F412V." "F412Z." "F413.." "F415.." "F417.." "F423.."
     "F412C." "F412R." "F412V." "F412Z." "F413.." "F415.." "F417.." "F423.."
     "F427.." "F429.." "F437.." "F439.." "F446.." "F469.." "F479.."
     "F427.." "F429.." "F437.." "F439.." "F446.." "F469.." "F479.."
 )
 )
-set(STM32F4_RAM_SIZES 
+set(STM32_F4_RAM_SIZES 
      64K  96K 128K 128K  32K  32K  32K 128K
      64K  96K 128K 128K  32K  32K  32K 128K
     256K 256K 256K 256K 256K 128K 128K 320K
     256K 256K 256K 256K 256K 128K 128K 320K
     192K 192K 192K 192K 128K 320K 320K
     192K 192K 192K 192K 128K 320K 320K
 )
 )
-
-set(STM32F4_CCRAM_SIZES 
+set(STM32_F4_CCRAM_SIZES 
      0K  0K 64K 64K  0K  0K  0K  0K
      0K  0K 64K 64K  0K  0K  0K  0K
      0K  0K  0K  0K 64K 64K 64K  0K
      0K  0K  0K  0K 64K 64K 64K  0K
     64K 64K 64K 64K  0K 64K 64K
     64K 64K 64K 64K  0K 64K 64K
 )
 )
 
 
+stm32_util_create_family_targets(F4)
+
 target_compile_options(STM32::F4 INTERFACE 
 target_compile_options(STM32::F4 INTERFACE 
     -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
     -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
 )
 )
 target_link_options(STM32::F4 INTERFACE 
 target_link_options(STM32::F4 INTERFACE 
     -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
     -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
 )
 )
-target_compile_definitions(STM32::F4 INTERFACE 
-    STM32F4
-)
-
-foreach(TYPE ${STM32F4_TYPES})
-    if(NOT (TARGET STM32::F4::${TYPE}))
-        add_library(STM32::F4::${TYPE} INTERFACE IMPORTED)
-        target_link_libraries(STM32::F4::${TYPE} INTERFACE STM32::F4)
-        target_compile_definitions(STM32::F4::${TYPE} INTERFACE 
-            STM32F${TYPE}
-        )
-    endif()
-endforeach()
-
-function(stm32f4_get_type DEVICE TYPE)
-    set(INDEX 0)
-    foreach(C_TYPE ${STM32F4_TYPES})
-        list(GET STM32F4_TYPE_MATCH ${INDEX} REGEXP)
-        if(DEVICE MATCHES ${REGEXP})
-            set(RESULT_TYPE ${C_TYPE})
-        endif()
-        math(EXPR INDEX "${INDEX}+1")
-    endforeach()
-    if(NOT RESULT_TYPE)
-        message(FATAL_ERROR "Invalid/unsupported STM32F4 device: ${DEVICE}")
-    endif()
-    set(${TYPE} ${RESULT_TYPE} PARENT_SCOPE)
-endfunction()
-
-function(stm32f4_memory_info DEVICE 
-        FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE 
-        FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
-)
-    string(REGEX REPLACE "^F4[0-9][0-9].([8BCDEGHI])$" "\\1" SIZE_CODE ${DEVICE})
-    
-    if(SIZE_CODE STREQUAL "8")
-        set(FLASH "64K")
-    elseif(SIZE_CODE STREQUAL "B")
-        set(FLASH "128K")
-    elseif(SIZE_CODE STREQUAL "C")
-        set(FLASH "256K")
-    elseif(SIZE_CODE STREQUAL "D")
-        set(FLASH "384K")
-    elseif(SIZE_CODE STREQUAL "E")
-        set(FLASH "512K")
-    elseif(SIZE_CODE STREQUAL "G")
-        set(FLASH "1024K")
-    elseif(SIZE_CODE STREQUAL "H")
-        set(FLASH "1536K")
-    elseif(SIZE_CODE STREQUAL "I")
-        set(FLASH "2048K")
-    else()
-        set(FLASH "64K")
-        message(WARNING "Unknow flash size for device ${DEVICE}")
-    endif()
-        
-    stm32f4_get_type(${DEVICE} TYPE)
-    list(FIND STM32F4_TYPES ${TYPE} TYPE_INDEX)
-    list(GET STM32F4_RAM_SIZES ${TYPE_INDEX} RAM)
-    list(GET STM32F4_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
-    
-    set(${FLASH_SIZE} ${FLASH} PARENT_SCOPE)
-    set(${RAM_SIZE} ${RAM} PARENT_SCOPE)
-    set(${CCRAM_SIZE} ${CCRAM} PARENT_SCOPE)
-    set(${STACK_SIZE} 0x400 PARENT_SCOPE)
-    set(${HEAP_SIZE} 0x200 PARENT_SCOPE)
-    set(${FLASH_ORIGIN} 0x8000000 PARENT_SCOPE)
-    set(${RAM_ORIGIN} 0x20000000 PARENT_SCOPE)
-    set(${CCRAM_ORIGIN} 0x10000000 PARENT_SCOPE)
-endfunction()

+ 29 - 0
cmake/stm32/utilities.cmake

@@ -0,0 +1,29 @@
+function(stm32_util_create_family_targets FAMILY)
+    if(NOT (TARGET STM32::${FAMILY}))
+        add_library(STM32::${FAMILY} INTERFACE IMPORTED)
+        target_compile_options(STM32::${FAMILY} INTERFACE 
+            --sysroot="${TOOLCHAIN_SYSROOT}"
+            -mthumb -mabi=aapcs -Wall -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -ffast-math
+            $<$<CONFIG:Debug>:-Og>
+            $<$<CONFIG:Release>:-Os>
+        )
+        target_link_options(STM32::${FAMILY} INTERFACE 
+            --sysroot="${TOOLCHAIN_SYSROOT}"
+            -mthumb -mabi=aapcs -Wl,--gc-sections
+            $<$<CONFIG:Debug>:-Og>
+            $<$<CONFIG:Release>:-Os -s>
+        )
+        target_compile_definitions(STM32::${FAMILY} INTERFACE 
+            STM32${FAMILY}
+        )
+    endif()
+    foreach(TYPE ${STM32_${FAMILY}_TYPES})
+        if(NOT (TARGET STM32::${FAMILY}::${TYPE}))
+            add_library(STM32::${FAMILY}::${TYPE} INTERFACE IMPORTED)
+            target_link_libraries(STM32::${FAMILY}::${TYPE} INTERFACE STM32::${FAMILY})
+            target_compile_definitions(STM32::${FAMILY}::${TYPE} INTERFACE 
+                STM32F${TYPE}
+            )
+        endif()
+    endforeach()
+endfunction()

+ 1 - 1
tests/cmsis/CMakeLists.txt

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.8)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 
 if(NOT TEST_FAMILIES)
 if(NOT TEST_FAMILIES)
-    set(TEST_FAMILIES F4)
+    set(TEST_FAMILIES F0 F4)
 endif()
 endif()
 
 
 project(cmsis-test C ASM)
 project(cmsis-test C ASM)