Jelajahi Sumber

F0 family.

Made family code more common.
Konstantin Oblaukhov 5 tahun lalu
induk
melakukan
7c6055cfef

+ 10 - 8
cmake/FindCMSIS.cmake

@@ -1,16 +1,14 @@
 if(NOT CMSIS_FIND_COMPONENTS)
-    set(CMSIS_FIND_COMPONENTS STM32F4)
+    set(CMSIS_FIND_COMPONENTS STM32F0 STM32F4)
 endif()
 
 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"
         COMMAND ${CMAKE_COMMAND} 
             -DFLASH_ORIGIN="${FLASH_ORIGIN}" 
@@ -59,6 +57,10 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         NO_DEFAULT_PATH
     )  
     
+    if (NOT CMSIS_${FAMILY}_PATH)
+        continue()
+    endif()
+    
     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]+\">")
         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})
 
 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()
-    set(${TYPE} ${T} PARENT_SCOPE)
+    set(${TYPE} ${RESULT_TYPE} PARENT_SCOPE)
 endfunction()
 
 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)
 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)
     get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
     target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
 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))
     add_library(STM32::NoSys INTERFACE IMPORTED)
     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>)
 endif()
 
+include(stm32/utilities)
+include(stm32/f0)
 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 
     412Cx 412Rx 412Vx 412Zx 413xx 415xx 417xx 423xx
     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]"
     "F412C." "F412R." "F412V." "F412Z." "F413.." "F415.." "F417.." "F423.."
     "F427.." "F429.." "F437.." "F439.." "F446.." "F469.." "F479.."
 )
-set(STM32F4_RAM_SIZES 
+set(STM32_F4_RAM_SIZES 
      64K  96K 128K 128K  32K  32K  32K 128K
     256K 256K 256K 256K 256K 128K 128K 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  0K  0K 64K 64K 64K  0K
     64K 64K 64K 64K  0K 64K 64K
 )
 
+stm32_util_create_family_targets(F4)
+
 target_compile_options(STM32::F4 INTERFACE 
     -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
 )
 target_link_options(STM32::F4 INTERFACE 
     -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)
 
 if(NOT TEST_FAMILIES)
-    set(TEST_FAMILIES F4)
+    set(TEST_FAMILIES F0 F4)
 endif()
 
 project(cmsis-test C ASM)