CMakeLists.txt 7.3 KB

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