簡體   English   中英

使用CMake配置stm32項目

[英]Stm32 project configuration using CMake

我最近將我的 stm32 項目切換到 CMake 以獨立於 IDE。 根存儲庫(應用程序)包含多個子模塊(HAL、FreeRTOS 等),其 CMakeLists.txt 明確包含每個使用的文件:

set(EXECUTABLE ${PROJECT_NAME}.elf)

add_executable(${EXECUTABLE}
    
    # Own sources
    src/main.c
    src/SEGGER_SYSVIEW_Config_FreeRTOS.c
    src/startup_stm32h723zgtx.s
    src/stm32h7xx_hal_timebase_tim.c
    src/system_stm32h7xx.c

    # Base CMSIS and HAL library
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c
            
    #long list of HAL c files there...

    # FreeRTOS library
    lib-freertos/croutine.c
    lib-freertos/event_groups.c
    lib-freertos/list.c
    lib-freertos/queue.c
    lib-freertos/stream_buffer.c
    lib-freertos/tasks.c
    lib-freertos/timers.c
    lib-freertos/portable/GCC/ARM_CM7/r0p1/port.c
    lib-freertos/trace/Sample/FreeRTOSV10/SEGGER_SYSVIEW_FreeRTOS.c
    lib-freertos/trace/SEGGER/Syscalls/SEGGER_RTT_Syscalls_GCC.c
    lib-freertos/trace/SEGGER/SEGGER_RTT_ASM_ARMv7M.S
    lib-freertos/trace/SEGGER/SEGGER_RTT_printf.c
    lib-freertos/trace/SEGGER/SEGGER_RTT.c
    lib-freertos/trace/SEGGER/SEGGER_SYSVIEW.c
    )
    
target_include_directories(${EXECUTABLE}
    PRIVATE
    include
    src
    
    lib-hal/stm32h7xx/CMSIS/Include
    lib-hal/stm32h7xx/CMSIS/Device/ST/STM32H7xx/Include
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Inc
    
    lib-freertos/include
    lib-freertos/trace/Config
    lib-freertos/trace/SEGGER
    lib-freertos/trace/Sample/FreeRTOSV10/
    lib-freertos/portable/GCC/ARM_CM7/r0p1
    )

該解決方案有效,但我知道這不是一種可持續的方法。 所以我嘗試在 lib-hal 和 lib-freertos 子模塊中創建庫,指定它們的來源和包含

add_library(lib-hal-stm32h7xx)

target_include_directories(lib-hal-stm32h7xx
    PUBLIC
    CMSIS/Include
    CMSIS/Device/ST/STM32H7xx/Include
    STM32H7xx_HAL_Driver/Inc
    PRIVATE
    STM32H7xx_HAL_Driver/Src
)

target_sources(lib-hal-stm32h7xx
    PRIVATE
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c

    #long list of HAL c files there...
)

然后使用

add_subdirectory(lib-hal/stm32h7xx)
add_subdirectory(lib-freertos)

target_link_library(${EXECUTABLE} lib-freertos lib-hal-stm32h7xx)

將子模塊“導入”到應用程序項目中。 但是在構建可執行文件時,gcc 無法訪問位於根目錄include中的文件stm32h7xx_hal_conf.hFreeRTOSConfig.h 我不想將配置標頭放入子模塊中,因為它們在具有不同配置的多個項目中使用。 將庫添加到父項目后,是否可以以某種方式擴展庫的已指定目錄搜索范圍?

項目文件結構:

-src
-include (configuration for lib-hal and lib-freertos included there)
 -lib-hal
  -includes...
  -sources...
 -lib-freertos
  -includes...
  -sources...

預先感謝您的回復。

正如 Tsyvarev 在評論中提到的,您可以修改項目中目標的屬性。 為了保持整潔,我通常為此創建一個函數並將其放在一個單獨的文件中。

提示:您還可以將源文件添加到目標。 對於 FreeRTOS,您可以添加特定於體系結構的文件,以防您的所有項目不在同一個 MCU 系列上運行。

function(configure_freertos target_name)
    target_sources(${target_name}
        PRIVATE
            lib-freertos/portable/GCC/ARM_CM7/r0p1/port.c
    )

    target_include_directories(${target_name}
        PUBLIC
            include
            lib-freertos/portable/GCC/ARM_CM7/r0p1
    )
endfunction()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM