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

Merge pull request #271 from smokeythebandit/master

Added stm32_generate_srec_file to generate Motorola S-record files
Hish15 4 лет назад
Родитель
Сommit
12240e07ee
2 измененных файлов с 34 добавлено и 21 удалено
  1. 6 4
      README.md
  2. 28 17
      cmake/stm32/common.cmake

+ 6 - 4
README.md

@@ -2,7 +2,7 @@
 
 ![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.
 
 ## Requirements
@@ -35,7 +35,7 @@ It uses cmake and GCC, along with newlib (libc), STM32Cube. Supports F0 F1 F2 F3
    generation call.
 * `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.
-   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
    `USE_CMSIS_RTOS=ON` or `USE_CMSIS_RTOS_V2` to CMake.
 
@@ -168,12 +168,12 @@ Here is typical usage:
 
 ```cmake
 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::GPIO
     HAL::STM32::F4::CORTEX
     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_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_srec_file(<target>)` - Generate the srec 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

+ 28 - 17
cmake/stm32/common.cmake

@@ -68,6 +68,17 @@ function(stm32_generate_binary_file TARGET)
     )
 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}.srec
+
+        COMMENT "Generating srec file ${CMAKE_PROJECT_NAME}.srec"
+    )
+endfunction()
+
 function(stm32_generate_hex_file TARGET)
     add_custom_command(
         TARGET ${TARGET}
@@ -78,7 +89,7 @@ function(stm32_generate_hex_file TARGET)
     )
 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)
     set(INDEX 0)
     foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
@@ -99,15 +110,15 @@ function(stm32_get_chip_info CHIP)
     set(ARG_SINGLE FAMILY DEVICE TYPE)
     set(ARG_MULTIPLE "")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
-        
+
     string(TOUPPER ${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))
         message(FATAL_ERROR "Unknown chip ${CHIP}")
     endif()
-    
+
     set(STM32_FAMILY ${CMAKE_MATCH_1})
     set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
 
@@ -117,7 +128,7 @@ function(stm32_get_chip_info CHIP)
     endif()
 
     stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
-    
+
     if(ARG_FAMILY)
         set(${ARG_FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
     endif()
@@ -134,7 +145,7 @@ function(stm32_get_cores CORES)
     set(ARG_SINGLE CHIP FAMILY DEVICE)
     set(ARG_MULTIPLE "")
     cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
-        
+
     if(ARG_CHIP)
         # 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)
@@ -155,7 +166,7 @@ function(stm32_get_cores CORES)
     else()
         message(FATAL_ERROR "Either CHIP or FAMILY or FAMILY/DEVICE should be specified for stm32_get_cores()")
     endif()
-    
+
     # TODO following is the only part really used by FindCMSIS. Maybe a cleanup is needed
     if(${ARG_FAMILY} STREQUAL "H7")
         stm32h7_get_device_cores(${ARG_DEVICE} ${ARG_TYPE} CORE_LIST)
@@ -177,15 +188,15 @@ function(stm32_get_memory_info)
     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()")
     endif()
-        
+
     if(INFO_CHIP)
         stm32_get_chip_info(${INFO_CHIP} FAMILY INFO_FAMILY TYPE INFO_TYPE DEVICE INFO_DEVICE)
     else()
         stm32_get_chip_type(${INFO_FAMILY} ${INFO_DEVICE} INFO_TYPE)
     endif()
-    
+
     string(REGEX REPLACE "^[FGHLUW][0-9BL][0-9A-Z][0-9M].([3468BCDEFGHIYZ])$" "\\1" SIZE_CODE ${INFO_DEVICE})
-    
+
     if(SIZE_CODE STREQUAL "3")
         set(FLASH "8K")
     elseif(SIZE_CODE STREQUAL "4")
@@ -210,7 +221,7 @@ function(stm32_get_memory_info)
         set(FLASH "1536K")
     elseif(SIZE_CODE STREQUAL "I")
         set(FLASH "2048K")
-    elseif(SIZE_CODE STREQUAL "Y")    
+    elseif(SIZE_CODE STREQUAL "Y")
         set(FLASH "640K")
     elseif(SIZE_CODE STREQUAL "Z")
         set(FLASH "192K")
@@ -218,7 +229,7 @@ function(stm32_get_memory_info)
         set(FLASH "16K")
         message(WARNING "Unknow flash size for device ${DEVICE}. Set to ${FLASH}")
     endif()
-    
+
     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}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
@@ -248,9 +259,9 @@ function(stm32_get_memory_info)
     if(TWO_FLASH_BANKS)
         string(REGEX MATCH "([0-9]+)K" FLASH_KB ${FLASH})
         math(EXPR FLASH_KB "${CMAKE_MATCH_1} / 2")
-        set(FLASH "${FLASH_KB}K")   
+        set(FLASH "${FLASH_KB}K")
     endif()
-    
+
     if(INFO_FLASH)
         set(SIZE ${FLASH})
         set(ORIGIN ${FLASH_ORIGIN})
@@ -278,7 +289,7 @@ function(stm32_get_memory_info)
         endif()
         set(ORIGIN ${RAM_ORIGIN}) #TODO: Real heap pointer?
     endif()
-    
+
     if(INFO_SIZE)
         set(${INFO_SIZE} ${SIZE} PARENT_SCOPE)
     endif()
@@ -298,7 +309,7 @@ function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
 
     get_target_property(LINK_DEPENDS ${TARGET} ${INTERFACE_PREFIX}LINK_DEPENDS)
     if(LINK_DEPENDS)
-        list(APPEND LINK_DEPENDS "${SCRIPT}")        
+        list(APPEND LINK_DEPENDS "${SCRIPT}")
     else()
         set(LINK_DEPENDS "${SCRIPT}")
     endif()