CMakeLists.txt 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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 F100RB F407VG H743ZI L552ZE)
  31. option(FREERTOS_F100RB_EXAMPLE "Compile FreeRTOS example for the F100RB board" OFF)
  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 L552ZE board" OFF)
  35. if(NOT FREERTOS_F100RB_EXAMPLE AND 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_F100RB_EXAMPLE)
  52. list(APPEND CMSIS_COMP_LIST STM32F100RB)
  53. list(APPEND HAL_COMP_LIST STM32F100RB)
  54. list(APPEND FREERTOS_COMP_LIST ARM_CM3)
  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 STM32F1)
  58. set(FREERTOS_F1_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::F1)
  59. else()
  60. set(FREERTOS_F1_NAMESPACE ${FREERTOS_NAMESPACE})
  61. endif()
  62. endif()
  63. if(FREERTOS_H743ZI_EXAMPLE)
  64. list(APPEND CMSIS_COMP_LIST STM32H743ZI_M7)
  65. list(APPEND HAL_COMP_LIST STM32H7M7)
  66. list(APPEND FREERTOS_COMP_LIST ARM_CM7)
  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 STM32H7)
  70. set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::H7::M7)
  71. else()
  72. set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE})
  73. endif()
  74. endif()
  75. if(FREERTOS_F407VG_EXAMPLE)
  76. list(APPEND CMSIS_COMP_LIST STM32F407VG)
  77. list(APPEND HAL_COMP_LIST STM32F407VG)
  78. list(APPEND FREERTOS_COMP_LIST ARM_CM4F)
  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 STM32F4)
  82. set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::F4)
  83. else()
  84. set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE})
  85. endif()
  86. endif()
  87. if(FREERTOS_L552ZE_EXAMPLE)
  88. list(APPEND CMSIS_COMP_LIST STM32L552ZE)
  89. list(APPEND HAL_COMP_LIST STM32L552ZE)
  90. list(APPEND FREERTOS_COMP_LIST ARM_CM33_NTZ)
  91. if(USE_CUBE_FREERTOS)
  92. # The device family needs to be supplied as a component to use the Cube FreeRTOS sources
  93. list(APPEND FREERTOS_COMP_LIST STM32L5)
  94. set(FREERTOS_L5_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::L5)
  95. else()
  96. set(FREERTOS_L5_NAMESPACE ${FREERTOS_NAMESPACE})
  97. endif()
  98. endif()
  99. find_package(CMSIS COMPONENTS ${CMSIS_COMP_LIST} REQUIRED)
  100. find_package(HAL COMPONENTS ${HAL_COMP_LIST} REQUIRED)
  101. find_package(FreeRTOS COMPONENTS ${FREERTOS_COMP_LIST} REQUIRED)
  102. set(PROJECT_SOURCES
  103. main.cpp
  104. )
  105. # This is required because FreeRTOSConfig.h, stm32hxx_hal_conf.h and main.h
  106. # need to be included
  107. set(INCLUDE_DIRS
  108. ${CMAKE_CURRENT_SOURCE_DIR}
  109. )
  110. if(FREERTOS_F100RB_EXAMPLE)
  111. set(TARGET_NAME ${PROJ_NAME}-f100rb)
  112. add_executable(${TARGET_NAME})
  113. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  114. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  115. target_link_libraries(${TARGET_NAME} PRIVATE
  116. ${FREERTOS_F1_NAMESPACE}::Timers
  117. ${FREERTOS_F1_NAMESPACE}::Heap::4
  118. ${FREERTOS_F1_NAMESPACE}::ARM_CM3
  119. HAL::STM32::F1::RCC
  120. HAL::STM32::F1::GPIO
  121. HAL::STM32::F1::CORTEX
  122. CMSIS::STM32::F100RB
  123. STM32::NoSys
  124. )
  125. if(USE_CMSIS_RTOS)
  126. target_link_libraries(${TARGET_NAME} PRIVATE
  127. CMSIS::STM32::F1::RTOS
  128. )
  129. endif()
  130. if(USE_CMSIS_RTOS_V2)
  131. target_link_libraries(${TARGET_NAME} PRIVATE
  132. CMSIS::STM32::F1::RTOS_V2
  133. )
  134. target_compile_definitions(${TARGET_NAME} PRIVATE
  135. USE_CMSIS_RTOS_V2
  136. CMSIS_RTOS_V2_DEVICE_HEADER="stm32f1xx_hal.h"
  137. )
  138. endif()
  139. stm32_print_size_of_target(${TARGET_NAME})
  140. stm32_generate_binary_file(${TARGET_NAME})
  141. stm32_generate_hex_file(${TARGET_NAME})
  142. endif()
  143. if(FREERTOS_H743ZI_EXAMPLE)
  144. set(TARGET_NAME ${PROJ_NAME}-h743zi)
  145. add_executable(${TARGET_NAME})
  146. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  147. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  148. target_link_libraries(${TARGET_NAME} PRIVATE
  149. ${FREERTOS_H7_NAMESPACE}::Timers
  150. ${FREERTOS_H7_NAMESPACE}::Heap::4
  151. ${FREERTOS_H7_NAMESPACE}::ARM_CM7
  152. HAL::STM32::H7::M7::RCC
  153. HAL::STM32::H7::M7::GPIO
  154. HAL::STM32::H7::M7::CORTEX
  155. CMSIS::STM32::H743ZI::M7
  156. STM32::NoSys
  157. )
  158. if(USE_CMSIS_RTOS)
  159. target_link_libraries(${TARGET_NAME} PRIVATE
  160. CMSIS::STM32::H7::M7::RTOS
  161. )
  162. endif()
  163. if(USE_CMSIS_RTOS_V2)
  164. target_link_libraries(${TARGET_NAME} PRIVATE
  165. CMSIS::STM32::H7::M7::RTOS_V2
  166. )
  167. target_compile_definitions(${TARGET_NAME} PRIVATE
  168. USE_CMSIS_RTOS_V2
  169. CMSIS_RTOS_V2_DEVICE_HEADER="stm32h7xx_hal.h"
  170. )
  171. endif()
  172. stm32_print_size_of_target(${TARGET_NAME})
  173. stm32_generate_binary_file(${TARGET_NAME})
  174. stm32_generate_hex_file(${TARGET_NAME})
  175. endif()
  176. if(FREERTOS_F407VG_EXAMPLE)
  177. set(TARGET_NAME ${PROJ_NAME}-f407vg)
  178. add_executable(${TARGET_NAME})
  179. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  180. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  181. target_link_libraries(${TARGET_NAME} PRIVATE
  182. ${FREERTOS_F4_NAMESPACE}::Timers
  183. ${FREERTOS_F4_NAMESPACE}::Heap::1
  184. ${FREERTOS_F4_NAMESPACE}::ARM_CM4F
  185. HAL::STM32::F4::RCC
  186. HAL::STM32::F4::GPIO
  187. HAL::STM32::F4::CORTEX
  188. CMSIS::STM32::F407VG
  189. STM32::NoSys
  190. )
  191. if(USE_CMSIS_RTOS)
  192. target_link_libraries(${TARGET_NAME} PRIVATE
  193. CMSIS::STM32::F4::RTOS
  194. )
  195. endif()
  196. if(USE_CMSIS_RTOS_V2)
  197. target_link_libraries(${TARGET_NAME} PRIVATE
  198. CMSIS::STM32::F4::RTOS_V2
  199. )
  200. target_compile_definitions(${TARGET_NAME} PRIVATE
  201. USE_CMSIS_RTOS_V2
  202. CMSIS_RTOS_V2_DEVICE_HEADER="stm32f4xx_hal.h"
  203. )
  204. endif()
  205. stm32_print_size_of_target(${TARGET_NAME})
  206. stm32_generate_binary_file(${TARGET_NAME})
  207. stm32_generate_hex_file(${TARGET_NAME})
  208. endif()
  209. if(FREERTOS_L552ZE_EXAMPLE)
  210. set(TARGET_NAME ${PROJ_NAME}-l552ze)
  211. add_executable(${TARGET_NAME})
  212. target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES})
  213. target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS})
  214. target_link_libraries(${TARGET_NAME} PRIVATE
  215. ${FREERTOS_L5_NAMESPACE}::Timers
  216. ${FREERTOS_L5_NAMESPACE}::Heap::1
  217. ${FREERTOS_L5_NAMESPACE}::ARM_CM33_NTZ
  218. HAL::STM32::L5::RCC
  219. HAL::STM32::L5::GPIO
  220. HAL::STM32::L5::CORTEX
  221. CMSIS::STM32::L552ZE
  222. STM32::NoSys
  223. )
  224. if(USE_CMSIS_RTOS)
  225. target_link_libraries(${TARGET_NAME} PRIVATE
  226. CMSIS::STM32::L5::RTOS
  227. )
  228. endif()
  229. if(USE_CMSIS_RTOS_V2)
  230. target_link_libraries(${TARGET_NAME} PRIVATE
  231. CMSIS::STM32::L5::RTOS_V2
  232. )
  233. target_compile_definitions(${TARGET_NAME} PRIVATE
  234. USE_CMSIS_RTOS_V2
  235. CMSIS_RTOS_V2_DEVICE_HEADER="stm32l5xx_hal.h"
  236. )
  237. endif()
  238. stm32_print_size_of_target(${TARGET_NAME})
  239. stm32_generate_binary_file(${TARGET_NAME})
  240. stm32_generate_hex_file(${TARGET_NAME})
  241. endif()