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

Added stm32_generate_srec_file to generate Motorola S-record files

Benjamin Martens 4 лет назад
Родитель
Сommit
7bc8f50af7
2 измененных файлов с 33 добавлено и 21 удалено
  1. 6 4
      README.md
  2. 27 17
      cmake/stm32/common.cmake

+ 6 - 4
README.md

@@ -2,7 +2,7 @@
 
 
 ![Tests](https://github.com/ObKo/stm32-cmake/workflows/Tests/badge.svg)
 ![Tests](https://github.com/ObKo/stm32-cmake/workflows/Tests/badge.svg)
 
 
-This project is used to develop applications for the STM32 - ST's ARM Cortex-Mx MCUs. 
+This project is used to develop applications for the STM32 - ST's ARM Cortex-Mx MCUs.
 It uses cmake and GCC, along with newlib (libc), STM32Cube. Supports F0 F1 F2 F3 F4 F7 G0 G4 H7 L0 L1 L4 L5 U5 WB WL device families.
 It uses cmake and GCC, along with newlib (libc), STM32Cube. Supports F0 F1 F2 F3 F4 F7 G0 G4 H7 L0 L1 L4 L5 U5 WB WL device families.
 
 
 ## Requirements
 ## Requirements
@@ -35,7 +35,7 @@ It uses cmake and GCC, along with newlib (libc), STM32Cube. Supports F0 F1 F2 F3
    generation call.
    generation call.
 * `freertos` ([examples/freertos](examples/freertos)) - blink led using STM32 HAL library and FreeRTOS.
 * `freertos` ([examples/freertos](examples/freertos)) - blink led using STM32 HAL library and FreeRTOS.
    You need to specify at least one board by passing `FREERTOS_<BOARD>_EXAMPLE=ON` to CMake.
    You need to specify at least one board by passing `FREERTOS_<BOARD>_EXAMPLE=ON` to CMake.
-   Currently, the example can be built for the `H743ZI` and `F407VG` board targets. 
+   Currently, the example can be built for the `H743ZI` and `F407VG` board targets.
    You can opt to use the FreeRTOS CMSIS implementation provided by the Cube repository by supplying
    You can opt to use the FreeRTOS CMSIS implementation provided by the Cube repository by supplying
    `USE_CMSIS_RTOS=ON` or `USE_CMSIS_RTOS_V2` to CMake.
    `USE_CMSIS_RTOS=ON` or `USE_CMSIS_RTOS_V2` to CMake.
 
 
@@ -168,12 +168,12 @@ Here is typical usage:
 
 
 ```cmake
 ```cmake
 add_executable(stm32-blinky-f4 blinky.c stm32f4xx_hal_conf.h)
 add_executable(stm32-blinky-f4 blinky.c stm32f4xx_hal_conf.h)
-target_link_libraries(stm32-blinky-f4 
+target_link_libraries(stm32-blinky-f4
     HAL::STM32::F4::RCC
     HAL::STM32::F4::RCC
     HAL::STM32::F4::GPIO
     HAL::STM32::F4::GPIO
     HAL::STM32::F4::CORTEX
     HAL::STM32::F4::CORTEX
     CMSIS::STM32::F407VG
     CMSIS::STM32::F407VG
-    STM32::NoSys 
+    STM32::NoSys
 )
 )
 ```
 ```
 
 
@@ -194,8 +194,10 @@ CMSIS package will generate linker script for your device automatically (target
 * `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_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_print_size_of_target(<target>)` - Print the application sizes for all formats
 * `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_binary_file(<target>)` - Generate the binary file for the given target
+* `stm32_generate_srec_file(<target>)` - Generate the srec file for the given target
 * `stm32_generate_hex_file(<target>)` - Generate the hex 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.
 In the following functions, you can also specify mutiple families.
 
 
 * `stm32_get_devices_by_family(STM_DEVICES [FAMILY families...])` - return into `STM_DEVICES` all
 * `stm32_get_devices_by_family(STM_DEVICES [FAMILY families...])` - return into `STM_DEVICES` all

+ 27 - 17
cmake/stm32/common.cmake

@@ -68,6 +68,16 @@ function(stm32_generate_binary_file TARGET)
     )
     )
 endfunction()
 endfunction()
 
 
+function(stm32_generate_srec_file TARGET)
+    add_custom_command(
+        TARGET ${TARGET}
+        POST_BUILD
+        COMMAND ${CMAKE_OBJCOPY} -O srec ${TARGET}${CMAKE_EXECUTABLE_SUFFIX_C} ${TARGET}.srec
+        BYPRODUCTS ${TARGET}.hex
+        COMMENT "Generating srec file ${CMAKE_PROJECT_NAME}.srec"
+    )
+endfunction()
+
 function(stm32_generate_hex_file TARGET)
 function(stm32_generate_hex_file TARGET)
     add_custom_command(
     add_custom_command(
         TARGET ${TARGET}
         TARGET ${TARGET}
@@ -78,7 +88,7 @@ function(stm32_generate_hex_file TARGET)
     )
     )
 endfunction()
 endfunction()
 
 
-# This function takes FAMILY (e.g. L4) and DEVICE (e.g. L496VG) to output TYPE (e.g. L496xx)  
+# This function takes FAMILY (e.g. L4) and DEVICE (e.g. L496VG) to output TYPE (e.g. L496xx)
 function(stm32_get_chip_type FAMILY DEVICE TYPE)
 function(stm32_get_chip_type FAMILY DEVICE TYPE)
     set(INDEX 0)
     set(INDEX 0)
     foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
     foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
@@ -99,15 +109,15 @@ function(stm32_get_chip_info CHIP)
     set(ARG_SINGLE FAMILY DEVICE TYPE)
     set(ARG_SINGLE FAMILY DEVICE TYPE)
     set(ARG_MULTIPLE "")
     set(ARG_MULTIPLE "")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
-        
+
     string(TOUPPER ${CHIP} CHIP)
     string(TOUPPER ${CHIP} CHIP)
-        
+
     string(REGEX MATCH "^STM32([FGHLUW][0-9BL])([0-9A-Z][0-9M][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
     string(REGEX MATCH "^STM32([FGHLUW][0-9BL])([0-9A-Z][0-9M][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
-    
+
     if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
     if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
         message(FATAL_ERROR "Unknown chip ${CHIP}")
         message(FATAL_ERROR "Unknown chip ${CHIP}")
     endif()
     endif()
-    
+
     set(STM32_FAMILY ${CMAKE_MATCH_1})
     set(STM32_FAMILY ${CMAKE_MATCH_1})
     set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
     set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
 
 
@@ -117,7 +127,7 @@ function(stm32_get_chip_info CHIP)
     endif()
     endif()
 
 
     stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
     stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
-    
+
     if(ARG_FAMILY)
     if(ARG_FAMILY)
         set(${ARG_FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
         set(${ARG_FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
     endif()
     endif()
@@ -134,7 +144,7 @@ function(stm32_get_cores CORES)
     set(ARG_SINGLE CHIP FAMILY DEVICE)
     set(ARG_SINGLE CHIP FAMILY DEVICE)
     set(ARG_MULTIPLE "")
     set(ARG_MULTIPLE "")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
-        
+
     if(ARG_CHIP)
     if(ARG_CHIP)
         # TODO: I don't get why stm32_get_chip_info is called in stm32_get_cores
         # TODO: I don't get why stm32_get_chip_info is called in stm32_get_cores
         stm32_get_chip_info(${ARG_CHIP} FAMILY ARG_FAMILY TYPE ARG_TYPE DEVICE ARG_DEVICE)
         stm32_get_chip_info(${ARG_CHIP} FAMILY ARG_FAMILY TYPE ARG_TYPE DEVICE ARG_DEVICE)
@@ -155,7 +165,7 @@ function(stm32_get_cores CORES)
     else()
     else()
         message(FATAL_ERROR "Either CHIP or FAMILY or FAMILY/DEVICE should be specified for stm32_get_cores()")
         message(FATAL_ERROR "Either CHIP or FAMILY or FAMILY/DEVICE should be specified for stm32_get_cores()")
     endif()
     endif()
-    
+
     # TODO following is the only part really used by FindCMSIS. Maybe a cleanup is needed
     # TODO following is the only part really used by FindCMSIS. Maybe a cleanup is needed
     if(${ARG_FAMILY} STREQUAL "H7")
     if(${ARG_FAMILY} STREQUAL "H7")
         stm32h7_get_device_cores(${ARG_DEVICE} ${ARG_TYPE} CORE_LIST)
         stm32h7_get_device_cores(${ARG_DEVICE} ${ARG_TYPE} CORE_LIST)
@@ -177,15 +187,15 @@ function(stm32_get_memory_info)
     if((NOT INFO_CHIP) AND ((NOT INFO_FAMILY) OR (NOT INFO_DEVICE)))
     if((NOT INFO_CHIP) AND ((NOT INFO_FAMILY) OR (NOT INFO_DEVICE)))
         message(FATAL_ERROR "Either CHIP or FAMILY/DEVICE is required for stm32_get_memory_info()")
         message(FATAL_ERROR "Either CHIP or FAMILY/DEVICE is required for stm32_get_memory_info()")
     endif()
     endif()
-        
+
     if(INFO_CHIP)
     if(INFO_CHIP)
         stm32_get_chip_info(${INFO_CHIP} FAMILY INFO_FAMILY TYPE INFO_TYPE DEVICE INFO_DEVICE)
         stm32_get_chip_info(${INFO_CHIP} FAMILY INFO_FAMILY TYPE INFO_TYPE DEVICE INFO_DEVICE)
     else()
     else()
         stm32_get_chip_type(${INFO_FAMILY} ${INFO_DEVICE} INFO_TYPE)
         stm32_get_chip_type(${INFO_FAMILY} ${INFO_DEVICE} INFO_TYPE)
     endif()
     endif()
-    
+
     string(REGEX REPLACE "^[FGHLUW][0-9BL][0-9A-Z][0-9M].([3468BCDEFGHIYZ])$" "\\1" SIZE_CODE ${INFO_DEVICE})
     string(REGEX REPLACE "^[FGHLUW][0-9BL][0-9A-Z][0-9M].([3468BCDEFGHIYZ])$" "\\1" SIZE_CODE ${INFO_DEVICE})
-    
+
     if(SIZE_CODE STREQUAL "3")
     if(SIZE_CODE STREQUAL "3")
         set(FLASH "8K")
         set(FLASH "8K")
     elseif(SIZE_CODE STREQUAL "4")
     elseif(SIZE_CODE STREQUAL "4")
@@ -210,7 +220,7 @@ function(stm32_get_memory_info)
         set(FLASH "1536K")
         set(FLASH "1536K")
     elseif(SIZE_CODE STREQUAL "I")
     elseif(SIZE_CODE STREQUAL "I")
         set(FLASH "2048K")
         set(FLASH "2048K")
-    elseif(SIZE_CODE STREQUAL "Y")    
+    elseif(SIZE_CODE STREQUAL "Y")
         set(FLASH "640K")
         set(FLASH "640K")
     elseif(SIZE_CODE STREQUAL "Z")
     elseif(SIZE_CODE STREQUAL "Z")
         set(FLASH "192K")
         set(FLASH "192K")
@@ -218,7 +228,7 @@ function(stm32_get_memory_info)
         set(FLASH "16K")
         set(FLASH "16K")
         message(WARNING "Unknow flash size for device ${DEVICE}. Set to ${FLASH}")
         message(WARNING "Unknow flash size for device ${DEVICE}. Set to ${FLASH}")
     endif()
     endif()
-    
+
     list(FIND STM32_${INFO_FAMILY}_TYPES ${INFO_TYPE} TYPE_INDEX)
     list(FIND STM32_${INFO_FAMILY}_TYPES ${INFO_TYPE} TYPE_INDEX)
     list(GET STM32_${INFO_FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
     list(GET STM32_${INFO_FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
     list(GET STM32_${INFO_FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
     list(GET STM32_${INFO_FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
@@ -248,9 +258,9 @@ function(stm32_get_memory_info)
     if(TWO_FLASH_BANKS)
     if(TWO_FLASH_BANKS)
         string(REGEX MATCH "([0-9]+)K" FLASH_KB ${FLASH})
         string(REGEX MATCH "([0-9]+)K" FLASH_KB ${FLASH})
         math(EXPR FLASH_KB "${CMAKE_MATCH_1} / 2")
         math(EXPR FLASH_KB "${CMAKE_MATCH_1} / 2")
-        set(FLASH "${FLASH_KB}K")   
+        set(FLASH "${FLASH_KB}K")
     endif()
     endif()
-    
+
     if(INFO_FLASH)
     if(INFO_FLASH)
         set(SIZE ${FLASH})
         set(SIZE ${FLASH})
         set(ORIGIN ${FLASH_ORIGIN})
         set(ORIGIN ${FLASH_ORIGIN})
@@ -278,7 +288,7 @@ function(stm32_get_memory_info)
         endif()
         endif()
         set(ORIGIN ${RAM_ORIGIN}) #TODO: Real heap pointer?
         set(ORIGIN ${RAM_ORIGIN}) #TODO: Real heap pointer?
     endif()
     endif()
-    
+
     if(INFO_SIZE)
     if(INFO_SIZE)
         set(${INFO_SIZE} ${SIZE} PARENT_SCOPE)
         set(${INFO_SIZE} ${SIZE} PARENT_SCOPE)
     endif()
     endif()
@@ -298,7 +308,7 @@ function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
 
 
     get_target_property(LINK_DEPENDS ${TARGET} ${INTERFACE_PREFIX}LINK_DEPENDS)
     get_target_property(LINK_DEPENDS ${TARGET} ${INTERFACE_PREFIX}LINK_DEPENDS)
     if(LINK_DEPENDS)
     if(LINK_DEPENDS)
-        list(APPEND LINK_DEPENDS "${SCRIPT}")        
+        list(APPEND LINK_DEPENDS "${SCRIPT}")
     else()
     else()
         set(LINK_DEPENDS "${SCRIPT}")
         set(LINK_DEPENDS "${SCRIPT}")
     endif()
     endif()