CMakeLists.txt 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. cmake_minimum_required(VERSION 3.16)
  2. set(PROJ_NAME stm32-freertos)
  3. set(STM32_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..)
  4. # Please note: When using CMSIS, it is recommended to use the FreeRTOS version supplied in the
  5. # Cube repository because more recent kernels might be incompatible to the CMSIS
  6. # implementation provided by STM
  7. option(USE_CMSIS_RTOS "Use CMSIS RTOS provided by Cube repository" OFF)
  8. option(USE_CMSIS_RTOS_V2 "Use CMSIS RTOS_V2 provided by Cube repository" OFF)
  9. option(USE_CUBE_FREERTOS "Use the FreeRTOS kernel provided by the Cube repository" ON)
  10. if(USE_CUBE_FREERTOS)
  11. message(STATUS "Using FreeRTOS provided by Cube repository")
  12. else()
  13. message(STATUS "Using FreeRTOS from kernel repository")
  14. endif()
  15. if(USE_CMSIS_RTOS AND USE_CMSIS_RTOS_V2)
  16. message(FATAL_ERROR "Can not use USE_CMSIS_RTOS_V2 together with USE_CMSIS_RTOS!")
  17. endif()
  18. if(USE_CMSIS_RTOS)
  19. message(STATUS "Compiling CMSIS RTOS support")
  20. elseif(USE_CMSIS_RTOS_V2)
  21. message(STATUS "Compiling CMSIS RTOS V2 support")
  22. endif()
  23. # This must come before the project call!
  24. set(CMAKE_TOOLCHAIN_FILE ${STM32_CMAKE_PATH}/cmake/stm32_gcc.cmake)
  25. project(${PROJ_NAME} CXX C ASM)
  26. set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
  27. # Can be used to print out all devices for the H7 or/and the F4 family
  28. # stm32_print_devices_by_family(FAMILY H7)
  29. # stm32_print_devices_by_family(FAMILY F4)
  30. set(SUPPORTED_BOARDS F407VG H743ZI L552ZE)
  31. option(FREERTOS_F407VG_EXAMPLE "Compile FreeRTOS example for the F407VG board" OFF)
  32. option(FREERTOS_H743ZI_EXAMPLE "Compile FreeRTOS example for the H743ZI board" OFF)
  33. option(FREERTOS_L552ZE_EXAMPLE "Compile FreeRTOS example for the L552ZE board" OFF)
  34. if(NOT FREERTOS_F407VG_EXAMPLE AND NOT FREERTOS_H743ZI_EXAMPLE AND NOT FREERTOS_L552ZE_EXAMPLE)
  35. message(FATAL_ERROR
  36. "Please select at least one target to compile by passing FREERTOS_<BOARD>_EXAMPLE=ON\n"
  37. "Supported boards: ${SUPPORTED_BOARDS}"
  38. )
  39. endif()
  40. set(HAL_COMP_LIST RCC GPIO CORTEX)
  41. set(CMSIS_COMP_LIST "")
  42. set(FREERTOS_COMP_LIST "")
  43. set(FREERTOS_NAMESPACE FreeRTOS)
  44. if(USE_CMSIS_RTOS)
  45. list(APPEND CMSIS_COMP_LIST RTOS)
  46. endif()
  47. if(USE_CMSIS_RTOS_V2)
  48. list(APPEND CMSIS_COMP_LIST RTOS_V2)
  49. endif()
  50. if(FREERTOS_H743ZI_EXAMPLE)
  51. list(APPEND CMSIS_COMP_LIST STM32H743ZI_M7)
  52. list(APPEND HAL_COMP_LIST STM32H7M7)
  53. list(APPEND FREERTOS_COMP_LIST ARM_CM7)
  54. if(USE_CUBE_FREERTOS)
  55. # The device family needs to be supplied as a component to use the Cube FreeRTOS sources
  56. list(APPEND FREERTOS_COMP_LIST STM32H7)
  57. set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::H7::M7)
  58. else()
  59. set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE})
  60. endif()
  61. endif()
  62. if(FREERTOS_F407VG_EXAMPLE)
  63. list(APPEND CMSIS_COMP_LIST STM32F407VG)
  64. list(APPEND HAL_COMP_LIST STM32F407VG)
  65. list(APPEND FREERTOS_COMP_LIST ARM_CM4F)
  66. if(USE_CUBE_FREERTOS)
  67. # The device family needs to be supplied as a component to use the Cube FreeRTOS sources
  68. list(APPEND FREERTOS_COMP_LIST STM32F4)
  69. set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::F4)
  70. else()
  71. set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE})
  72. endif()
  73. endif()
  74. if(FREERTOS_L552ZE_EXAMPLE)
  75. list(APPEND CMSIS_COMP_LIST STM32L552ZE)
  76. list(APPEND HAL_COMP_LIST STM32L552ZE)
  77. list(APPEND FREERTOS_COMP_LIST ARM_CM33_NTZ)
  78. if(USE_CUBE_FREERTOS)
  79. # The device family needs to be supplied as a component to use the Cube FreeRTOS sources
  80. list(APPEND FREERTOS_COMP_LIST STM32L5)
  81. set(FREERTOS_L5_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::L5)
  82. else()
  83. set(FREERTOS_L5_NAMESPACE ${FREERTOS_NAMESPACE})
  84. endif()
  85. endif()
  86. find_package(CMSIS COMPONENTS ${CMSIS_COMP_LIST} REQUIRED)
  87. find_package(HAL COMPONENTS ${HAL_COMP_LIST} REQUIRED)
  88. find_package(FreeRTOS COMPONENTS ${FREERTOS_COMP_LIST} REQUIRED)
  89. set(PROJECT_SOURCES
  90. main.cpp
  91. )
  92. # This is required because FreeRTOSConfig.h, stm32hxx_hal_conf.h and main.h
  93. # need to be included
  94. set(INCLUDE_DIRS
  95. ${CMAKE_CURRENT_SOURCE_DIR}
  96. )
  97. if(FREERTOS_H743ZI_EXAMPLE)
  98. set(TARGET_NAME ${PROJ_NAME}-h743zi)
  99. add_executable(${TARGET_NAME})
  100. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  101. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  102. target_link_libraries(${TARGET_NAME} PRIVATE
  103. ${FREERTOS_H7_NAMESPACE}::Timers
  104. ${FREERTOS_H7_NAMESPACE}::Heap::4
  105. ${FREERTOS_H7_NAMESPACE}::ARM_CM7
  106. HAL::STM32::H7::M7::RCC
  107. HAL::STM32::H7::M7::GPIO
  108. HAL::STM32::H7::M7::CORTEX
  109. CMSIS::STM32::H743ZI::M7
  110. STM32::NoSys
  111. )
  112. if(USE_CMSIS_RTOS)
  113. target_link_libraries(${TARGET_NAME} PRIVATE
  114. CMSIS::STM32::H7::M7::RTOS
  115. )
  116. endif()
  117. if(USE_CMSIS_RTOS_V2)
  118. target_link_libraries(${TARGET_NAME} PRIVATE
  119. CMSIS::STM32::H7::M7::RTOS_V2
  120. )
  121. target_compile_definitions(${TARGET_NAME} PRIVATE
  122. USE_CMSIS_RTOS_V2
  123. CMSIS_RTOS_V2_DEVICE_HEADER="stm32h7xx_hal.h"
  124. )
  125. endif()
  126. stm32_print_size_of_target(${TARGET_NAME})
  127. stm32_generate_binary_file(${TARGET_NAME})
  128. stm32_generate_hex_file(${TARGET_NAME})
  129. endif()
  130. if(FREERTOS_F407VG_EXAMPLE)
  131. set(TARGET_NAME ${PROJ_NAME}-f407vg)
  132. add_executable(${TARGET_NAME})
  133. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  134. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  135. target_link_libraries(${TARGET_NAME} PRIVATE
  136. ${FREERTOS_F4_NAMESPACE}::Timers
  137. ${FREERTOS_F4_NAMESPACE}::Heap::1
  138. ${FREERTOS_F4_NAMESPACE}::ARM_CM4F
  139. HAL::STM32::F4::RCC
  140. HAL::STM32::F4::GPIO
  141. HAL::STM32::F4::CORTEX
  142. CMSIS::STM32::F407VG
  143. STM32::NoSys
  144. )
  145. if(USE_CMSIS_RTOS)
  146. target_link_libraries(${TARGET_NAME} PRIVATE
  147. CMSIS::STM32::F4::RTOS
  148. )
  149. endif()
  150. if(USE_CMSIS_RTOS_V2)
  151. target_link_libraries(${TARGET_NAME} PRIVATE
  152. CMSIS::STM32::F4::RTOS_V2
  153. )
  154. target_compile_definitions(${TARGET_NAME} PRIVATE
  155. USE_CMSIS_RTOS_V2
  156. CMSIS_RTOS_V2_DEVICE_HEADER="stm32f4xx_hal.h"
  157. )
  158. endif()
  159. stm32_print_size_of_target(${TARGET_NAME})
  160. stm32_generate_binary_file(${TARGET_NAME})
  161. stm32_generate_hex_file(${TARGET_NAME})
  162. endif()
  163. if(FREERTOS_L552ZE_EXAMPLE)
  164. set(TARGET_NAME ${PROJ_NAME}-l552ze)
  165. add_executable(${TARGET_NAME})
  166. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  167. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  168. target_link_libraries(${TARGET_NAME} PRIVATE
  169. ${FREERTOS_L5_NAMESPACE}::Timers
  170. ${FREERTOS_L5_NAMESPACE}::Heap::1
  171. ${FREERTOS_L5_NAMESPACE}::ARM_CM33_NTZ
  172. HAL::STM32::L5::RCC
  173. HAL::STM32::L5::GPIO
  174. HAL::STM32::L5::CORTEX
  175. CMSIS::STM32::L552ZE
  176. STM32::NoSys
  177. )
  178. if(USE_CMSIS_RTOS)
  179. target_link_libraries(${TARGET_NAME} PRIVATE
  180. CMSIS::STM32::L5::RTOS
  181. )
  182. endif()
  183. if(USE_CMSIS_RTOS_V2)
  184. target_link_libraries(${TARGET_NAME} PRIVATE
  185. CMSIS::STM32::L5::RTOS_V2
  186. )
  187. target_compile_definitions(${TARGET_NAME} PRIVATE
  188. USE_CMSIS_RTOS_V2
  189. CMSIS_RTOS_V2_DEVICE_HEADER="stm32l5xx_hal.h"
  190. )
  191. endif()
  192. stm32_print_size_of_target(${TARGET_NAME})
  193. stm32_generate_binary_file(${TARGET_NAME})
  194. stm32_generate_hex_file(${TARGET_NAME})
  195. endif()