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

Merge remote-tracking branch 'upstream/master' into JST/familyWB

Julien Staub 4 лет назад
Родитель
Сommit
e9710a7479

+ 2 - 0
.github/ISSUE_TEMPLATE/bug-report.md

@@ -32,6 +32,8 @@ If applicable, add screenshots to help explain your problem.
  - OS: [e.g. iOS]
  - Compiler: [e.g. arm-none-eabi-gcc +version]
  - stm32-cmake: [v2.0 or 86d1dd2 or ...]
+ - cmake: [e.g 3.21.0]
+ - HAL/cube/CMSIS: [stm32cubeL4 v1.2.3] 
 
 **Additional context**
 Add any other context about the problem here.

+ 7 - 1
README.md

@@ -185,11 +185,17 @@ CMSIS package will generate linker script for your device automatically (target
 
 * `stm32_get_chip_info(<chip> [FAMILY <family>] [TYPE <type>] [DEVICE <device>])` - classify device using name, will return device family (into `<family>` variable), type (`<type>`) and canonical name (`<device>`, uppercase without any package codes)
 * `stm32_get_memory_info((CHIP <chip>)|(DEVICE <device> TYPE <type>) [FLASH|RAM|CCRAM|STACK|HEAP] [SIZE <size>] [ORIGIN <origin>])` - get information about device memories (into `<size>` and `<origin>`). Linker script generator uses values from this function
-* `stm32_get_devices_by_family(DEVICES [FAMILY <family>])` - return into `DEVICES` all supported devices by family (or all devices if `<family>` is empty)
 * `stm32_print_size_of_target(<target>)` - Print the application sizes for all formats
 * `stm32_generate_binary_file(<target>)` - Generate the binary file for the given target
 * `stm32_generate_hex_file(<target>)` - Generate the hex file for the given target
 
+In the following functions, you can also specify mutiple families.
+
+* `stm32_get_devices_by_family(STM_DEVICES [FAMILY families...])` - return into `STM_DEVICES` all
+  supported devices by family (or all devices if `FAMILY` is omitted)
+* `stm32_print_devices_by_family([FAMILY families...])` - Print all supported devices by family
+  (or all devices if `FAMILY` is omitted)
+
 # Additional CMake modules
 
 stm32-cmake contains additional CMake modules for finding and configuring various libraries and RTOSes used in the embedded world.

+ 2 - 1
cmake/FindBSP.cmake

@@ -306,8 +306,9 @@ foreach(COMP ${BSP_FIND_COMPONENTS})
     set(FAMILY ${CMAKE_MATCH_1})
     string(TOLOWER ${FAMILY} FAMILY_L)
     
-    if(NOT STM32_CUBE_${FAMILY}_PATH)
+    if((NOT STM32_CUBE_${FAMILY}_PATH) AND (DEFINED ENV{STM32_CUBE_${FAMILY}_PATH))
         set(STM32_CUBE_${FAMILY}_PATH $ENV{STM32_CUBE_${FAMILY}_PATH} CACHE PATH "Path to STM32Cube${FAMILY}")
+        message(STATUS "ENV STM32_CUBE_${FAMILY}_PATH specified, using STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}")
     endif()
 
     if(NOT STM32_CUBE_${FAMILY}_PATH)

+ 11 - 10
cmake/FindCMSIS.cmake

@@ -72,12 +72,12 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
     
     if(CMAKE_MATCH_2)
         set(FAMILY ${CMAKE_MATCH_1})
-        set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
-        message(TRACE "FindCMSIS: full device name match for COMP ${COMP}, DEVICES is ${DEVICES}")
+        set(STM_DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
+        message(TRACE "FindCMSIS: full device name match for COMP ${COMP}, STM_DEVICES is ${STM_DEVICES}")
     else()
         set(FAMILY ${CMAKE_MATCH_1})
-        stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY})
-        message(TRACE "FindCMSIS: family only match for COMP ${COMP}, DEVICES is ${DEVICES}")
+        stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY})
+        message(TRACE "FindCMSIS: family only match for COMP ${COMP}, STM_DEVICES is ${STM_DEVICES}")
     endif()
     
     if(CMAKE_MATCH_3)
@@ -96,14 +96,15 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
     
     string(TOLOWER ${FAMILY} FAMILY_L)
     
-    if((NOT STM32_CMSIS_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH))
+    if((NOT STM32_CMSIS_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH) AND (DEFINED ENV{STM32_CUBE_${FAMILY}_PATH}))
         # try to set path from environment variable. Note it could be ...-NOT-FOUND and it's fine
         set(STM32_CUBE_${FAMILY}_PATH $ENV{STM32_CUBE_${FAMILY}_PATH} CACHE PATH "Path to STM32Cube${FAMILY}")
+        message(STATUS "ENV STM32_CUBE_${FAMILY}_PATH specified, using STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}")
     endif()
 
     if((NOT STM32_CMSIS_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH))
         set(STM32_CUBE_${FAMILY}_PATH /opt/STM32Cube${FAMILY} CACHE PATH "Path to STM32Cube${FAMILY}")
-        message(STATUS "Neither STM32_CUBE_${FAMILY}_PATH nor STM32_CMSIS_${FAMILY}_PATH specified using default  STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}")
+        message(STATUS "Neither STM32_CUBE_${FAMILY}_PATH nor STM32_CMSIS_${FAMILY}_PATH specified using default STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}")
     endif()
      
     # search for Include/cmsis_gcc.h
@@ -170,8 +171,8 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         target_sources(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE "${CMSIS_${FAMILY}${CORE_U}_SOURCE}")
     endif()
 
-    set(DEVICES_FOUND TRUE)
-    foreach(DEVICE ${DEVICES})
+    set(STM_DEVICES_FOUND TRUE)
+    foreach(DEVICE ${STM_DEVICES})
         message(TRACE "FindCMSIS: Iterating DEVICE ${DEVICE}")
         
         stm32_get_cores(DEV_CORES FAMILY ${FAMILY} DEVICE ${DEVICE})
@@ -191,7 +192,7 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         )
         list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}${CORE_U}_${TYPE}_STARTUP}")
         if(NOT CMSIS_${FAMILY}${CORE_U}_${TYPE}_STARTUP)
-            set(DEVICES_FOUND FALSE)
+            set(STM_DEVICES_FOUND FALSE)
             message(VERBOSE "FindCMSIS: did not find file: startup_stm32${TYPE_L}.s or startup_stm32${TYPE_L}${CORE_Ucm}.s")
             break()
         endif()
@@ -208,7 +209,7 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS})
         cmsis_generate_default_linker_script(${FAMILY} ${DEVICE} "${CORE}")
     endforeach()
 
-    if(DEVICES_FOUND)
+    if(STM_DEVICES_FOUND)
        set(CMSIS_${COMP}_FOUND TRUE)
        message(DEBUG "CMSIS_${COMP}_FOUND TRUE")
     else()

+ 2 - 1
cmake/FindFreeRTOS.cmake

@@ -9,8 +9,9 @@ list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS)
 
 set(FreeRTOS_HEAPS 1 2 3 4 5)
 
-if(NOT FREERTOS_PATH)
+if((NOT FREERTOS_PATH) AND (DEFINED ENV{FREERTOS_PATH}))
     set(FREERTOS_PATH $ENV{FREERTOS_PATH} CACHE PATH "Path to FreeRTOS")
+    message(STATUS "ENV FREERTOS_PATH specified, using FREERTOS_PATH: ${FREERTOS_PATH}")
 endif()
 
 if(NOT FREERTOS_PATH)

+ 2 - 1
cmake/FindHAL.cmake

@@ -283,8 +283,9 @@ foreach(COMP ${HAL_FIND_COMPONENTS_FAMILIES})
     set(FAMILY ${CMAKE_MATCH_1})
     string(TOLOWER ${FAMILY} FAMILY_L)
     
-    if((NOT STM32_HAL_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH))
+    if((NOT STM32_HAL_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH) AND (DEFINED ENV{STM32_CUBE_${FAMILY}_PATH}))
         set(STM32_CUBE_${FAMILY}_PATH $ENV{STM32_CUBE_${FAMILY}_PATH} CACHE PATH "Path to STM32Cube${FAMILY}")
+        message(STATUS "ENV STM32_CUBE_${FAMILY}_PATH specified, using STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}")
     endif()
 
     if((NOT STM32_HAL_${FAMILY}_PATH) AND (NOT STM32_CUBE_${FAMILY}_PATH))

+ 88 - 6
cmake/stm32/devices.cmake

@@ -1136,14 +1136,96 @@ set(STM32_ALL_DEVICES
     WLE4CC
 )
 
-function(stm32_get_devices_by_family DEVICES)
+# Store a list of devices into a given STM_DEVICES list.
+# You can also specify multiple device families. Examples:
+# Get list of all devices for H7 family: stm32_get_devices_by_family(STM_DEVICES FAMILY H7)
+# Get list of all devices: stm32_get_devices_by_family(STM_DEVICES)
+function(stm32_get_devices_by_family STM_DEVICES)
+    # Specify keywords for argument parsing here
     set(ARG_OPTIONS "")
-    set(ARG_SINGLE FAMILY)
-    set(ARG_MULTIPLE "")
+    set(ARG_SINGLE "")
+    set(ARG_MULTIPLE FAMILY)
+
+    # Parse arguments. Multiple families can be specified and will be stored in ARG_<KeywordName>
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
-    set(LIST ${STM32_ALL_DEVICES})
+    stm32_dev_parser_check()
+
+    # Build a list of families by filtering the whole list with the specified families
     if(ARG_FAMILY)
-        list(FILTER LIST INCLUDE REGEX "^${ARG_FAMILY}")
+        set(RESULTING_DEV_LIST "")
+        foreach(FAMILY ${ARG_FAMILY})
+            set(STM_DEVICE_LIST ${STM32_ALL_DEVICES})
+            list(FILTER STM_DEVICE_LIST INCLUDE REGEX "^${FAMILY}")
+            list(APPEND RESULTING_DEV_LIST ${STM_DEVICE_LIST})
+            if(NOT STM_DEVICE_LIST)
+                message(WARNING "No devices found for given family ${FAMILY}")
+            endif()
+        endforeach()
+    else()
+        # No family argument, so get list of all devices
+        set(RESULTING_DEV_LIST ${STM32_ALL_DEVICES})
     endif()
-    set(${DEVICES} ${LIST} PARENT_SCOPE)
+    
+    set(${STM_DEVICES} ${RESULTING_DEV_LIST} PARENT_SCOPE)
 endfunction()
+
+# Print the devices for a given family. You can also specify multiple device families.
+# Example usage:
+# Print devices for H7 family: stm32_print_devices_by_family(FAMILY H7)
+# Print all devices: stm32_print_devices_by_family()
+function(stm32_print_devices_by_family)
+    # Specify keywords for argument parsing here
+    set(ARG_OPTIONS "")
+    set(ARG_SINGLE "")
+    set(ARG_MULTIPLE FAMILY)
+
+    # Parse arguments. Multiple families can be specified and will be stored in ARG_<KeywordName>
+    cmake_parse_arguments(PARSE_ARGV 0 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
+    stm32_dev_parser_check()
+
+    if(ARG_FAMILY)
+        # print devices one family per line
+        foreach(FAMILY ${ARG_FAMILY})
+            stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY})
+            stm32_pretty_print_dev_list(${FAMILY} "${STM_DEVICES}")
+        endforeach()
+    else()
+        # print all devices
+        stm32_get_devices_by_family(STM_DEVICES)
+        stm32_pretty_print_dev_list("all" "${STM_DEVICES}")
+    endif()
+
+endfunction()
+
+# The arguments checked in this macro are filled by cmake_parse_argument
+macro(stm32_dev_parser_check)
+    # contains unexpected arguments (unknown keywords beofre ARG_MULTIPLE)
+    if(ARG_UNPARSED_ARGUMENTS)
+        message(WARNING "Unknown keyword(s) ${ARG_UNPARSED_ARGUMENTS} will be ignored")
+    endif()
+    # is populated if ARG_SINGLE or ARG_MULTIPLE is used without values
+    if(ARG_KEYWORDS_MISSING_VALUES)
+        message(FATAL_ERROR "Keyword ${ARG_KEYWORDS_MISSING_VALUES} expects values")
+    endif()
+endmacro()
+
+# Pretty printer to limit amount of list entries printed per line
+macro(stm32_pretty_print_dev_list FAMILIES STM_DEVICES)
+    if(${FAMILIES} STREQUAL "all")
+        message(STATUS  "Devices for all families")
+    else()
+        message(STATUS "Devices for ${FAMILIES} family")
+    endif()
+    set(TMP_LIST "")
+    foreach(STM_DEVICE ${STM_DEVICES})
+        list(APPEND TMP_LIST ${STM_DEVICE})
+        list(LENGTH TMP_LIST CURR_LEN)
+        if(CURR_LEN EQUAL 10)
+            message(STATUS "${TMP_LIST}")
+            set(TMP_LIST "")
+        endif()
+    endforeach()
+    if(TMP_LIST)
+        message(STATUS "${TMP_LIST}")
+   endif()
+endmacro()

+ 1 - 0
cmake/stm32_gcc.cmake

@@ -2,6 +2,7 @@ get_filename_component(STM32_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
 list(APPEND CMAKE_MODULE_PATH ${STM32_CMAKE_DIR})
 
 include(stm32/common)
+include(stm32/devices)
 
 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
 find_program(CMAKE_C_COMPILER NAMES ${STM32_TARGET_TRIPLET}-gcc PATHS ${TOOLCHAIN_BIN_PATH})

+ 1 - 1
examples/blinky-ll/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-blinky-ll C ASM)

+ 1 - 1
examples/blinky/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-blinky C ASM)

+ 1 - 1
examples/custom-linker-script/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-custom-linker-script C ASM)

+ 1 - 1
examples/fetch-cmsis-hal/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-fetch-cmsis-hal C ASM)

+ 1 - 1
examples/fetch-cube/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-fetch-cube C ASM)

+ 1 - 1
examples/freertos/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-freertos C ASM)

+ 1 - 1
examples/multi-core/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-template C ASM)

+ 1 - 1
examples/template/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 project(stm32-template C ASM)

+ 1 - 1
tests/bsp/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 if(NOT TEST_FAMILIES)

+ 3 - 3
tests/cmsis/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 if(NOT TEST_FAMILIES)
@@ -18,9 +18,9 @@ set(SOURCES main.c)
 include(stm32/devices)
 
 foreach(FAMILY ${TEST_FAMILIES})
-    stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY})
+    stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY})
     stm32_get_cores(CORES FAMILY ${FAMILY})
-    foreach(DEVICE ${DEVICES})
+    foreach(DEVICE ${STM_DEVICES})
         stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
         
         if(NOT CORES)

+ 3 - 3
tests/fetch/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 if(NOT TEST_FAMILIES)
@@ -17,8 +17,8 @@ find_package(HAL REQUIRED)
 set(SOURCES main.c)
 
 foreach(FAMILY ${TEST_FAMILIES})
-    stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY})
-    list(GET DEVICES 0 DEVICE)
+    stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY})
+    list(GET STM_DEVICES 0 DEVICE)
     stm32_get_cores(CORES FAMILY ${FAMILY} DEVICE ${DEVICE})
     
     if(CORES)

+ 3 - 3
tests/hal/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.16)
 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake)
 
 if(NOT TEST_FAMILIES)
@@ -19,8 +19,8 @@ find_package(HAL REQUIRED)
 set(SOURCES main.c)
 
 foreach(FAMILY ${TEST_FAMILIES})
-    stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY})
-    list(GET DEVICES 0 DEVICE)
+    stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY})
+    list(GET STM_DEVICES 0 DEVICE)
     stm32_get_cores(CORES FAMILY ${FAMILY} DEVICE ${DEVICE})
     
     if(CORES)