From dc25bcac6924e1307b00410d61089aaacb5b68b6 Mon Sep 17 00:00:00 2001 From: Gabriel Arjones Date: Fri, 16 Apr 2021 15:46:02 -0300 Subject: [PATCH 1/4] Add support for CMSIS RTOS --- cmake/FindCMSIS.cmake | 68 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/cmake/FindCMSIS.cmake b/cmake/FindCMSIS.cmake index f830b063..8c0253a3 100644 --- a/cmake/FindCMSIS.cmake +++ b/cmake/FindCMSIS.cmake @@ -1,3 +1,5 @@ +set(CMSIS_RTOS RTOS RTOS_V2) + if(NOT CMSIS_FIND_COMPONENTS) set(CMSIS_FIND_COMPONENTS ${STM32_SUPPORTED_FAMILIES_LONG_NAME}) endif() @@ -7,6 +9,32 @@ if(STM32H7 IN_LIST CMSIS_FIND_COMPONENTS) endif() list(REMOVE_DUPLICATES CMSIS_FIND_COMPONENTS) +foreach(COMP ${CMSIS_FIND_COMPONENTS}) + string(TOLOWER ${COMP} COMP_L) + string(TOUPPER ${COMP} COMP) + + if(${COMP} IN_LIST CMSIS_RTOS) + list(APPEND CMSIS_FIND_COMPONENTS_RTOS ${COMP}) + continue() + endif() + + string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?_?(M[47])?.*$" COMP ${COMP}) + if(CMAKE_MATCH_1) + list(APPEND CMSIS_FIND_COMPONENTS_FAMILIES ${COMP}) + endif() +endforeach() + +if(NOT CMSIS_FIND_COMPONENTS_FAMILIES) + set(CMSIS_FIND_COMPONENTS_FAMILIES ${STM32_SUPPORTED_FAMILIES_LONG_NAME}) +endif() + +if(NOT CMSIS_FIND_COMPONENTS_RTOS) + set(CMSIS_FIND_COMPONENTS_RTOS ${CMSIS_RTOS}) +endif() + +message(STATUS "Search for CMSIS families: ${CMSIS_FIND_COMPONENTS_FAMILIES}") +message(STATUS "Search for CMSIS RTOS: ${CMSIS_FIND_COMPONENTS_RTOS}") + include(stm32/devices) function(cmsis_generate_default_linker_script FAMILY DEVICE CORE) @@ -41,7 +69,7 @@ function(cmsis_generate_default_linker_script FAMILY DEVICE CORE) stm32_add_linker_script(CMSIS::STM32::${DEVICE}${CORE_C} INTERFACE "${OUTPUT_LD_FILE}") endfunction() -foreach(COMP ${CMSIS_FIND_COMPONENTS}) +foreach(COMP ${CMSIS_FIND_COMPONENTS_FAMILIES}) string(TOLOWER ${COMP} COMP_L) string(TOUPPER ${COMP} COMP) @@ -176,6 +204,44 @@ foreach(COMP ${CMSIS_FIND_COMPONENTS}) else() set(CMSIS_${COMP}_FOUND FALSE) endif() + + foreach(RTOS_COMP ${CMSIS_FIND_COMPONENTS_RTOS}) + if (${RTOS_COMP} STREQUAL "RTOS_V2") + set(RTOS_COMP_VERSION "2") + else() + unset(RTOS_COMP_VERSION) + endif() + + find_path(CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_PATH + NAMES "cmsis_os${RTOS_COMP_VERSION}.h" + PATHS "${STM32_CUBE_${FAMILY}_PATH}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_${RTOS_COMP}" + NO_DEFAULT_PATH + ) + if (NOT CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_PATH) + continue() + endif() + + find_file(CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_SOURCE + NAMES "cmsis_os${RTOS_COMP_VERSION}.c" + PATHS "${STM32_CUBE_${FAMILY}_PATH}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_${RTOS_COMP}" + NO_DEFAULT_PATH + ) + if (NOT CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_SOURCE) + continue() + endif() + + if(NOT (TARGET CMSIS::STM32::${FAMILY}${CORE_C}::${RTOS_COMP})) + add_library(CMSIS::STM32::${FAMILY}${CORE_C}::${RTOS_COMP} INTERFACE IMPORTED) + target_link_libraries(CMSIS::STM32::${FAMILY}${CORE_C}::${RTOS_COMP} INTERFACE CMSIS::STM32::${FAMILY}${CORE_C}) + target_include_directories(CMSIS::STM32::${FAMILY}${CORE_C}::${RTOS_COMP} INTERFACE "${CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_PATH}") + target_sources(CMSIS::STM32::${FAMILY}${CORE_C}::${RTOS_COMP} INTERFACE "${CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_SOURCE}") + endif() + + list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_SOURCE}") + list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}${CORE_U}_${RTOS_COMP}_PATH}") + set(CMSIS_${RTOS_COMP}_FOUND TRUE) + endforeach() + list(REMOVE_DUPLICATES CMSIS_INCLUDE_DIRS) list(REMOVE_DUPLICATES CMSIS_SOURCES) endforeach() From 22339cc837f1b706772c93e88f14767a4885b6c7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 28 Jun 2021 10:25:16 +0200 Subject: [PATCH 2/4] Allow choosing FreeRTOS from STM32Cube --- README.md | 28 +++++- cmake/FindFreeRTOS.cmake | 196 +++++++++++++++++++++++++++++---------- 2 files changed, 176 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 07d922f7..e9a35cc7 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,10 @@ Typical usage: ```cmake find_package(FreeRTOS COMPONENTS ARM_CM4F REQUIRED) -target_link_libraries(... FreeRTOS::ARM_CM4F) +target_link_libraries(${TARGET_NAME} PRIVATE + ... + FreeRTOS::ARM_CM4F +) ``` The following FreeRTOS ports are supported: `ARM_CM0`, `ARM_CM3`, `ARM_CM4F`, `ARM_CM7`. @@ -224,3 +227,26 @@ Other FreeRTOS libraries: * `FreeRTOS::StreamBuffer` - stream buffer (`stream_buffer.c`) * `FreeRTOS::Timers` - timers (`timers.c`) * `FreeRTOS::Heap::` - heap implementation (`heap_.c`), ``: [1-5] + +The STM32Cube packages can contain the FreeRTOS source package and a CMSIS RTOS and RTOS_V2 +implementation. You can specify to use CMSIS with a `CMSIS` target and by finding the CMSIS +`RTOS` package. + +Typical usage for a H7 device when using the M7 core with CMSIS `RTOS`: + +```cmake +find_package(CMSIS COMPONENTS STM32H743ZI STM32H7_M7 RTOS REQUIRED) +target_link_libraries(${TARGET_NAME} PRIVATE + ... + FreeRTOS::ARM_CM7 + CMSIS::STM32::H7::M7::RTOS +) +``` + +The following targets are available in general: + +* `CMSIS::STM32::::RTOS` +* `CMSIS::STM32::::RTOS_V2` + +For the multi-core architectures, you have to specify both family and core like specified in the +example. diff --git a/cmake/FindFreeRTOS.cmake b/cmake/FindFreeRTOS.cmake index 7e992b5e..b1af4c3d 100644 --- a/cmake/FindFreeRTOS.cmake +++ b/cmake/FindFreeRTOS.cmake @@ -1,9 +1,7 @@ +set(FreeRTOS_PORTS ARM_CM0 ARM_CM3 ARM_CM4F ARM_CM7) if(NOT FreeRTOS_FIND_COMPONENTS) - set(FreeRTOS_FIND_COMPONENTS - ARM_CM0 ARM_CM3 ARM_CM4F ARM_CM7 - ) + set(FreeRTOS_FIND_COMPONENTS ${FreeRTOS_PORTS}) endif() -list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS) set(FreeRTOS_HEAPS 1 2 3 4 5) @@ -46,41 +44,30 @@ if(NOT (TARGET FreeRTOS)) target_include_directories(FreeRTOS INTERFACE "${FreeRTOS_COMMON_INCLUDE}") endif() -if(NOT (TARGET FreeRTOS::Coroutine)) - add_library(FreeRTOS::Coroutine INTERFACE IMPORTED) - target_sources(FreeRTOS::Coroutine INTERFACE "${FreeRTOS_SOURCE_DIR}/croutine.c") - target_link_libraries(FreeRTOS::Coroutine INTERFACE FreeRTOS) -endif() +foreach(COMP ${FreeRTOS_FIND_COMPONENTS}) + string(TOUPPER ${COMP} COMP) + string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?_?(M[47])?.*$" FAMILY_COMP ${COMP}) + if(CMAKE_MATCH_1) + list(APPEND FreeRTOS_FIND_COMPONENTS_FAMILIES ${FAMILY_COMP}) + continue() + endif() -if(NOT (TARGET FreeRTOS::EventGroups)) - add_library(FreeRTOS::EventGroups INTERFACE IMPORTED) - target_sources(FreeRTOS::EventGroups INTERFACE "${FreeRTOS_SOURCE_DIR}/event_groups.c") - target_link_libraries(FreeRTOS::EventGroups INTERFACE FreeRTOS) -endif() + list(APPEND FreeRTOS_FIND_COMPONENTS_PORTS ${COMP}) +endforeach() -if(NOT (TARGET FreeRTOS::StreamBuffer)) - add_library(FreeRTOS::StreamBuffer INTERFACE IMPORTED) - target_sources(FreeRTOS::StreamBuffer INTERFACE "${FreeRTOS_SOURCE_DIR}/stream_buffer.c") - target_link_libraries(FreeRTOS::StreamBuffer INTERFACE FreeRTOS) +if(NOT FreeRTOS_FIND_COMPONENTS_PORTS) + set(FreeRTOS_FIND_COMPONENTS_PORTS ${FreeRTOS_PORTS}) endif() -if(NOT (TARGET FreeRTOS::Timers)) - add_library(FreeRTOS::Timers INTERFACE IMPORTED) - target_sources(FreeRTOS::Timers INTERFACE "${FreeRTOS_SOURCE_DIR}/timers.c") - target_link_libraries(FreeRTOS::Timers INTERFACE FreeRTOS) -endif() +list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS) +list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS_PORTS) +list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS_FAMILIES) -foreach(HEAP ${FreeRTOS_HEAPS}) - if(NOT (TARGET FreeRTOS::Heap::${HEAP})) - add_library(FreeRTOS::Heap::${HEAP} INTERFACE IMPORTED) - target_sources(FreeRTOS::Heap::${HEAP} INTERFACE "${FreeRTOS_SOURCE_DIR}/portable/MemMang/heap_${HEAP}.c") - target_link_libraries(FreeRTOS::Heap::${HEAP} INTERFACE FreeRTOS) - endif() -endforeach() +set(FreeRTOS_HEAPS 1 2 3 4 5) -foreach(PORT ${FreeRTOS_FIND_COMPONENTS}) - find_path(FreeRTOS_${PORT}_PATH - NAMES portmacro.h +macro(stm32_find_freertos FreeRTOS_NAMESPACE FREERTOS_PATH) + find_path(FreeRTOS_COMMON_INCLUDE + NAMES FreeRTOS.h PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" PATH_SUFFIXES "portable/GCC/${PORT}/r0p1" @@ -101,22 +88,137 @@ foreach(PORT ${FreeRTOS_FIND_COMPONENTS}) PATHS "${FreeRTOS_${PORT}_PATH}" NO_DEFAULT_PATH ) - if(NOT (TARGET FreeRTOS::${PORT})) - add_library(FreeRTOS::${PORT} INTERFACE IMPORTED) - target_link_libraries(FreeRTOS::${PORT} INTERFACE FreeRTOS) - target_sources(FreeRTOS::${PORT} INTERFACE "${FreeRTOS_${PORT}_SOURCE}") - target_include_directories(FreeRTOS::${PORT} INTERFACE "${FreeRTOS_${PORT}_PATH}") + if(NOT (TARGET FreeRTOS)) + add_library(FreeRTOS INTERFACE IMPORTED) + target_sources(FreeRTOS INTERFACE + "${FreeRTOS_SOURCE_DIR}/tasks.c" + "${FreeRTOS_SOURCE_DIR}/list.c" + "${FreeRTOS_SOURCE_DIR}/queue.c" + ) + target_include_directories(FreeRTOS INTERFACE "${FreeRTOS_COMMON_INCLUDE}") endif() - - if(FreeRTOS_${PORT}_PATH AND - FreeRTOS_${PORT}_SOURCE AND - FreeRTOS_COMMON_INCLUDE AND - FreeRTOS_SOURCE_DIR) - set(FreeRTOS_${PORT}_FOUND TRUE) - else() - set(FreeRTOS_${PORT}_FOUND FALSE) + + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::Coroutine)) + add_library(${FreeRTOS_NAMESPACE}::Coroutine INTERFACE IMPORTED) + target_sources(${FreeRTOS_NAMESPACE}::Coroutine INTERFACE "${FreeRTOS_SOURCE_DIR}/croutine.c") + target_link_libraries(${FreeRTOS_NAMESPACE}::Coroutine INTERFACE FreeRTOS) endif() -endforeach() + + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::EventGroups)) + add_library(${FreeRTOS_NAMESPACE}::EventGroups INTERFACE IMPORTED) + target_sources(${FreeRTOS_NAMESPACE}::EventGroups INTERFACE "${FreeRTOS_SOURCE_DIR}/event_groups.c") + target_link_libraries(${FreeRTOS_NAMESPACE}::EventGroups INTERFACE FreeRTOS) + endif() + + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::StreamBuffer)) + add_library(${FreeRTOS_NAMESPACE}::StreamBuffer INTERFACE IMPORTED) + target_sources(${FreeRTOS_NAMESPACE}::StreamBuffer INTERFACE "${FreeRTOS_SOURCE_DIR}/stream_buffer.c") + target_link_libraries(${FreeRTOS_NAMESPACE}::StreamBuffer INTERFACE FreeRTOS) + endif() + + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::Timers)) + add_library(${FreeRTOS_NAMESPACE}::Timers INTERFACE IMPORTED) + target_sources(${FreeRTOS_NAMESPACE}::Timers INTERFACE "${FreeRTOS_SOURCE_DIR}/timers.c") + target_link_libraries(${FreeRTOS_NAMESPACE}::Timers INTERFACE FreeRTOS) + endif() + + foreach(HEAP ${FreeRTOS_HEAPS}) + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::Heap::${HEAP})) + add_library(${FreeRTOS_NAMESPACE}::Heap::${HEAP} INTERFACE IMPORTED) + target_sources(${FreeRTOS_NAMESPACE}::Heap::${HEAP} INTERFACE "${FreeRTOS_SOURCE_DIR}/portable/MemMang/heap_${HEAP}.c") + target_link_libraries(${FreeRTOS_NAMESPACE}::Heap::${HEAP} INTERFACE FreeRTOS) + endif() + endforeach() + + foreach(PORT ${FreeRTOS_FIND_COMPONENTS_PORTS}) + find_path(FreeRTOS_${PORT}_PATH + NAMES portmacro.h + PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" + PATH_SUFFIXES "Source/portable/GCC/${PORT}" "Source/portable/GCC/${PORT}/r0p1" + NO_DEFAULT_PATH + ) + list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_${PORT}_PATH}") + + find_file(FreeRTOS_${PORT}_SOURCE + NAMES port.c + PATHS "${FreeRTOS_${PORT}_PATH}" + NO_DEFAULT_PATH + ) + if(NOT (TARGET ${FreeRTOS_NAMESPACE}::${PORT})) + add_library(${FreeRTOS_NAMESPACE}::${PORT} INTERFACE IMPORTED) + target_link_libraries(${FreeRTOS_NAMESPACE}::${PORT} INTERFACE FreeRTOS) + target_sources(${FreeRTOS_NAMESPACE}::${PORT} INTERFACE "${FreeRTOS_${PORT}_SOURCE}") + target_include_directories(${FreeRTOS_NAMESPACE}::${PORT} INTERFACE "${FreeRTOS_${PORT}_PATH}") + endif() + + if(FreeRTOS_${PORT}_PATH AND + FreeRTOS_${PORT}_SOURCE AND + FreeRTOS_COMMON_INCLUDE AND + FreeRTOS_SOURCE_DIR) + set(FreeRTOS_${PORT}_FOUND TRUE) + else() + set(FreeRTOS_${PORT}_FOUND FALSE) + endif() + endforeach() +endmacro() + +if(NOT FreeRTOS_FIND_COMPONENTS_FAMILIES) + if(NOT FREERTOS_PATH) + set(FREERTOS_PATH /opt/FreeRTOS CACHE PATH "Path to FreeRTOS") + message(STATUS "No FREERTOS_PATH specified using default: ${FREERTOS_PATH}") + endif() + stm32_find_freertos(FreeRTOS ${FREERTOS_PATH}) +else() + message(STATUS "Search for FreeRTOS families: ${FreeRTOS_FIND_COMPONENTS_FAMILIES}") + message(STATUS "Search for FreeRTOS ports: ${FreeRTOS_FIND_COMPONENTS_PORTS}") + + foreach(COMP ${FreeRTOS_FIND_COMPONENTS_FAMILIES}) + string(TOLOWER ${COMP} COMP_L) + string(TOUPPER ${COMP} COMP) + + string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?_?(M[47])?.*$" COMP ${COMP}) + + if((NOT CMAKE_MATCH_1) AND (NOT CMAKE_MATCH_2)) + message(FATAL_ERROR "Unknown FreeRTOS component: ${COMP}") + endif() + + if(CMAKE_MATCH_2) + set(FAMILY ${CMAKE_MATCH_1}) + set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}") + else() + set(FAMILY ${CMAKE_MATCH_1}) + stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY} CORE ${CORE}) + endif() + + if(CMAKE_MATCH_3) + set(CORE ${CMAKE_MATCH_3}) + set(CORE_C "::${CORE}") + set(CORE_U "_${CORE}") + else() + unset(CORE) + unset(CORE_C) + unset(CORE_U) + endif() + + string(TOLOWER ${FAMILY} FAMILY_L) + if(NOT STM32_CUBE_${FAMILY}_PATH) + set(STM32_CUBE_${FAMILY}_PATH /opt/STM32Cube${FAMILY} CACHE PATH "Path to STM32Cube${FAMILY}") + message(STATUS "Did not specify STM32_CMSIS_${FAMILY}_PATH, using default STM32_CUBE_${FAMILY}_PATH: ${STM32_CUBE_${FAMILY}_PATH}") + endif() + + stm32_find_freertos(FreeRTOS::STM32::${FAMILY}${CORE_C} ${STM32_CUBE_${FAMILY}_PATH}/Middlewares/Third_Party/FreeRTOS) + foreach(PORT_COMP ${FreeRTOS_FIND_COMPONENTS_PORTS}) + if(FreeRTOS_${PORT_COMP}_PATH AND + FreeRTOS_${PORT_COMP}_SOURCE AND + FreeRTOS_COMMON_INCLUDE AND + FreeRTOS_SOURCE_DIR) + set(FreeRTOS_${COMP}_FOUND TRUE) + else() + set(FreeRTOS_${COMP}_FOUND FALSE) + endif() + endforeach() + endforeach() +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FreeRTOS From ddabe51f9fbce1dd9781cca0c6746510184ea165 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 4 Jul 2021 12:52:34 +0200 Subject: [PATCH 3/4] CMSIS RTOS feature Adds the full features set for CMSIS RTOS support, with a lot work provided by g-arjones. Builds on https://github.com/ObKo/stm32-cmake/pull/190 and https://github.com/ObKo/stm32-cmake/pull/189. It allows to use the CMSIS support provided in the STM32 cube repository. Also adds documentation and an updated freertos example with the same architecture as https://github.com/ObKo/stm32-cmake/pull/225 --- README.md | 78 +- cmake/FindCMSIS.cmake | 3 + cmake/FindFreeRTOS.cmake | 92 ++- cmake/stm32/devices.cmake | 2 +- examples/freertos/CMakeLists.txt | 178 ++++- examples/freertos/FreeRTOSConfig.h | 274 ++++--- examples/freertos/main.cpp | 79 ++ examples/freertos/main.h | 11 + examples/freertos/stm32f4xx_hal_conf.h | 996 ++++++++++++------------- examples/freertos/stm32h7xx_hal_conf.h | 432 +++++++++++ 10 files changed, 1428 insertions(+), 717 deletions(-) create mode 100644 examples/freertos/main.cpp create mode 100644 examples/freertos/main.h mode change 100755 => 100644 examples/freertos/stm32f4xx_hal_conf.h create mode 100644 examples/freertos/stm32h7xx_hal_conf.h diff --git a/README.md b/README.md index e9a35cc7..6608f111 100644 --- a/README.md +++ b/README.md @@ -30,19 +30,24 @@ It uses cmake and GCC, along with newlib (libc), STM32Cube. Supports F0 F1 F2 F3 * `fetch-cube` ([examples/fetch-cube](examples/fetch-cube)) - example of using FetchContent for fetching STM32Cube from ST's git. * `fetch-cmsis-hal` ([examples/fetch-cmsis-hal](examples/fetch-cmsis-hal)) - example of using FetchContent for fetching STM32 CMSIS and HAL from ST's git. * `blinky` ([examples/blinky](examples/blinky)) - blink led using STM32 HAL library and SysTick. -It will compile a project for the `F4` family by default, but you can also compile for the -`L0` and `F1` family by passing `L0_EXAMPLE=ON` or `F1_EXAMPLE=ON` to the CMake generation call. + It will compile a project for the `F4` family by default, but you can also compile for the + `L0` and `F1` family by passing `BLINKY_L0_EXAMPLE=ON` or `BLINKY_F1_EXAMPLE=ON` to the CMake + 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__EXAMPLE=ON` to CMake. + 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. # Usage First of all you need to configure toolchain and library paths using CMake variables. There are generally three ways to do this: -1. Pass the variables through command line during cmake run with passed to CMake with +1. Pass the variables through command line during cmake run with passed to CMake with `-D=...` 2. Set the variables inside your `CMakeLists.txt` -3. Pass these variables to CMake by setting them as environmental variables. +3. Pass these variables to CMake by setting them as environmental variables. The most important set of variables which needs to be set can be found in the following section. @@ -208,45 +213,72 @@ stm32-cmake contains additional CMake modules for finding and configuring variou FreeRTOS-Kernel (usually located in the subfolder `FreeRTOS` on a downloaded release). You can supply `FREERTOS_PATH` as an environmental variable as well. -Typical usage: +You can either use the FreeRTOS kernel provided in the Cube repositories, or a separate +FreeRTOS kernel. The Cube repository also provides the CMSIS RTOS and CMSIS RTOS V2 implementations. +If you like to use the CMSIS implementations, it is recommended to also use the FreeRTOS sources +provided in the Cube repository because the CMSIS port might be incompatible to newer kernel +versions. + +You can specify to use CMSIS with a `CMSIS` target and by finding the CMSIS `RTOS` package. +To select which FreeRTOS to use, you can find the package for a specific FreeRTOS port and then +link against that port target within a specific namespace. + +Typical usage for a H7 device when using the M7 core, using an external kernel without CMSIS +support. The FreeRTOS namespace is set to `FreeRTOS` and the `ARM_CM7` port is used: ```cmake -find_package(FreeRTOS COMPONENTS ARM_CM4F REQUIRED) +find_package(CMSIS COMPONENTS STM32H743ZI STM32H7_M7 REQUIRED) +find_package(FreeRTOS ARM_CM7 REQUIRED) target_link_libraries(${TARGET_NAME} PRIVATE ... - FreeRTOS::ARM_CM4F + FreeRTOS::ARM_CM7 ) ``` -The following FreeRTOS ports are supported: `ARM_CM0`, `ARM_CM3`, `ARM_CM4F`, `ARM_CM7`. +Typical usage for a F4 device, using an external kernel without CMSIS support. +The FreeRTOS namespace is set to `FreeRTOS` and the `ARM_CM4F` port is used: -Other FreeRTOS libraries: - -* `FreeRTOS::Coroutine` - co-routines (`croutines.c`) -* `FreeRTOS::EventGroups` - event groups (`event_groups.c`) -* `FreeRTOS::StreamBuffer` - stream buffer (`stream_buffer.c`) -* `FreeRTOS::Timers` - timers (`timers.c`) -* `FreeRTOS::Heap::` - heap implementation (`heap_.c`), ``: [1-5] - -The STM32Cube packages can contain the FreeRTOS source package and a CMSIS RTOS and RTOS_V2 -implementation. You can specify to use CMSIS with a `CMSIS` target and by finding the CMSIS -`RTOS` package. +```cmake +find_package(FreeRTOS COMPONENTS ARM_CM4F REQUIRED) +target_link_libraries(${TARGET_NAME} PRIVATE + ... + FreeRTOS::ARM_CM4F +) +``` -Typical usage for a H7 device when using the M7 core with CMSIS `RTOS`: +Another typical usage using the FreeRTOS provided in the Cube repository and the CMSIS support. +The FreeRTOS namespace is set to `FreeRTOS::STM32::` and the `ARM_CM7` port is used: ```cmake find_package(CMSIS COMPONENTS STM32H743ZI STM32H7_M7 RTOS REQUIRED) +find_package(FreeRTOS COMPONENTS ARM_CM7 STM32H7 REQUIRED) target_link_libraries(${TARGET_NAME} PRIVATE ... - FreeRTOS::ARM_CM7 + FreeRTOS::STM32::H7::M7::ARM_CM7 CMSIS::STM32::H7::M7::RTOS ) ``` -The following targets are available in general: +The following CMSIS targets are available in general: * `CMSIS::STM32::::RTOS` * `CMSIS::STM32::::RTOS_V2` +The following additional FreeRTOS targets are available in general to use the FreeRTOS provided +in the Cube repository + +* `FreeRTOS::STM32::` + For the multi-core architectures, you have to specify both family and core like specified in the -example. +example above. + +The following FreeRTOS ports are supported in general: `ARM_CM0`, `ARM_CM3`, `ARM_CM4F`, `ARM_CM7`, +`ARM_CM3_MPU`, `ARM_CM4_MPU`, `ARM_CM7_MPU`. + +Other FreeRTOS libraries, with `FREERTOS_NAMESPACE` being set as specified in the examples above: + +* `${FREERTOS_NAMESPACE}::Coroutine` - co-routines (`croutines.c`) +* `${FREERTOS_NAMESPACE}::EventGroups` - event groups (`event_groups.c`) +* `${FREERTOS_NAMESPACE}::StreamBuffer` - stream buffer (`stream_buffer.c`) +* `${FREERTOS_NAMESPACE}::Timers` - timers (`timers.c`) +* `${FREERTOS_NAMESPACE}::Heap::` - heap implementation (`heap_.c`), ``: [1-5] diff --git a/cmake/FindCMSIS.cmake b/cmake/FindCMSIS.cmake index 8c0253a3..b436f629 100644 --- a/cmake/FindCMSIS.cmake +++ b/cmake/FindCMSIS.cmake @@ -9,15 +9,18 @@ if(STM32H7 IN_LIST CMSIS_FIND_COMPONENTS) endif() list(REMOVE_DUPLICATES CMSIS_FIND_COMPONENTS) +# This section fills the RTOS or family components list foreach(COMP ${CMSIS_FIND_COMPONENTS}) string(TOLOWER ${COMP} COMP_L) string(TOUPPER ${COMP} COMP) + # Component is RTOS component if(${COMP} IN_LIST CMSIS_RTOS) list(APPEND CMSIS_FIND_COMPONENTS_RTOS ${COMP}) continue() endif() + # Component is not RTOS component, so check whether it is a family component string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?_?(M[47])?.*$" COMP ${COMP}) if(CMAKE_MATCH_1) list(APPEND CMSIS_FIND_COMPONENTS_FAMILIES ${COMP}) diff --git a/cmake/FindFreeRTOS.cmake b/cmake/FindFreeRTOS.cmake index b1af4c3d..5f47c610 100644 --- a/cmake/FindFreeRTOS.cmake +++ b/cmake/FindFreeRTOS.cmake @@ -1,9 +1,8 @@ -set(FreeRTOS_PORTS ARM_CM0 ARM_CM3 ARM_CM4F ARM_CM7) +set(FreeRTOS_PORTS ARM_CM0 ARM_CM3 ARM_CM4F ARM_CM7 ARM_CM4_MPU ARM_CM3_MPU ARM_CM7_MPU) if(NOT FreeRTOS_FIND_COMPONENTS) set(FreeRTOS_FIND_COMPONENTS ${FreeRTOS_PORTS}) endif() - -set(FreeRTOS_HEAPS 1 2 3 4 5) +list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS) if((NOT FREERTOS_PATH) AND (DEFINED ENV{FREERTOS_PATH})) set(FREERTOS_PATH $ENV{FREERTOS_PATH} CACHE PATH "Path to FreeRTOS") @@ -11,47 +10,33 @@ if((NOT FREERTOS_PATH) AND (DEFINED ENV{FREERTOS_PATH})) endif() if(NOT FREERTOS_PATH) - set(FREERTOS_PATH /opt/FreeRTOS CACHE PATH "Path to FreeRTOS") - message(STATUS "No FREERTOS_PATH specified using default: ${FREERTOS_PATH}") -endif() - -find_path(FreeRTOS_COMMON_INCLUDE - NAMES FreeRTOS.h - PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" - PATH_SUFFIXES "Source/include" "include" - NO_DEFAULT_PATH -) - -if(NOT FreeRTOS_COMMON_INCLUDE) - message(WARNING "FreeRTOS common include path not found, build might fail") + set(DEFAULT_FREERTOS_PATH "/opt/FreeRTOS") + if(EXISTS ${DEFAULT_FREERTOS_PATH}) + set(FREERTOS_PATH ${DEFAULT_FREERTOS_PATH} CACHE PATH "Path to FreeRTOS") + message(STATUS "No FREERTOS_PATH specified using default: ${DEFAULT_FREERTOS_PATH}") + else() + message(STATUS + "No FreeRTOS folder found at default location ${DEFAULT_FREERTOS_PATH}. " + "Leaving empty" + ) + endif() endif() -list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_COMMON_INCLUDE}") - -find_path(FreeRTOS_SOURCE_DIR - NAMES tasks.c - PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" - PATH_SUFFIXES "Source" - NO_DEFAULT_PATH -) -if(NOT (TARGET FreeRTOS)) - add_library(FreeRTOS INTERFACE IMPORTED) - target_sources(FreeRTOS INTERFACE - "${FreeRTOS_SOURCE_DIR}/tasks.c" - "${FreeRTOS_SOURCE_DIR}/list.c" - "${FreeRTOS_SOURCE_DIR}/queue.c" - ) - target_include_directories(FreeRTOS INTERFACE "${FreeRTOS_COMMON_INCLUDE}") +if(STM32H7 IN_LIST FreeRTOS_FIND_COMPONENTS) + list(REMOVE_ITEM FreeRTOS_FIND_COMPONENTS STM32H7) + list(APPEND FreeRTOS_FIND_COMPONENTS STM32H7_M7 STM32H7_M4) endif() +# This section fills the family and ports components list foreach(COMP ${FreeRTOS_FIND_COMPONENTS}) string(TOUPPER ${COMP} COMP) string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?_?(M[47])?.*$" FAMILY_COMP ${COMP}) + # Valid family component, so add it (e.g. STM32H7) if(CMAKE_MATCH_1) list(APPEND FreeRTOS_FIND_COMPONENTS_FAMILIES ${FAMILY_COMP}) continue() endif() - + # Was not a family component, so add it to the port list list(APPEND FreeRTOS_FIND_COMPONENTS_PORTS ${COMP}) endforeach() @@ -69,23 +54,20 @@ macro(stm32_find_freertos FreeRTOS_NAMESPACE FREERTOS_PATH) find_path(FreeRTOS_COMMON_INCLUDE NAMES FreeRTOS.h PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" - PATH_SUFFIXES - "portable/GCC/${PORT}/r0p1" - "portable/GCC/${PORT}" - "Source/portable/GCC/${PORT}" - "Source/portable/GCC/${PORT}/r0p1" + PATH_SUFFIXES "Source/include" "include" NO_DEFAULT_PATH ) - if(NOT FreeRTOS_${PORT}_PATH) - message(WARNING "FreeRTOS port path not found, build might fail") + if(NOT FreeRTOS_COMMON_INCLUDE) + message(WARNING "FreeRTOS common include path not found, build might fail") endif() - list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_${PORT}_PATH}") - - find_file(FreeRTOS_${PORT}_SOURCE - NAMES port.c - PATHS "${FreeRTOS_${PORT}_PATH}" + list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_COMMON_INCLUDE}") + + find_path(FreeRTOS_SOURCE_DIR + NAMES tasks.c + PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" + PATH_SUFFIXES "Source" NO_DEFAULT_PATH ) if(NOT (TARGET FreeRTOS)) @@ -134,9 +116,18 @@ macro(stm32_find_freertos FreeRTOS_NAMESPACE FREERTOS_PATH) find_path(FreeRTOS_${PORT}_PATH NAMES portmacro.h PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS" - PATH_SUFFIXES "Source/portable/GCC/${PORT}" "Source/portable/GCC/${PORT}/r0p1" + PATH_SUFFIXES + "portable/GCC/${PORT}/r0p1" + "portable/GCC/${PORT}" + "Source/portable/GCC/${PORT}" + "Source/portable/GCC/${PORT}/r0p1" NO_DEFAULT_PATH ) + + if(NOT FreeRTOS_${PORT}_PATH) + message(WARNING "FreeRTOS port path not found, build might fail") + endif() + list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_${PORT}_PATH}") find_file(FreeRTOS_${PORT}_SOURCE @@ -162,15 +153,16 @@ macro(stm32_find_freertos FreeRTOS_NAMESPACE FREERTOS_PATH) endforeach() endmacro() +message(STATUS "Search for FreeRTOS ports: ${FreeRTOS_FIND_COMPONENTS_PORTS}") + if(NOT FreeRTOS_FIND_COMPONENTS_FAMILIES) if(NOT FREERTOS_PATH) set(FREERTOS_PATH /opt/FreeRTOS CACHE PATH "Path to FreeRTOS") - message(STATUS "No FREERTOS_PATH specified using default: ${FREERTOS_PATH}") + message(STATUS "No FREERTOS_PATH specified, using default: ${FREERTOS_PATH}") endif() stm32_find_freertos(FreeRTOS ${FREERTOS_PATH}) else() message(STATUS "Search for FreeRTOS families: ${FreeRTOS_FIND_COMPONENTS_FAMILIES}") - message(STATUS "Search for FreeRTOS ports: ${FreeRTOS_FIND_COMPONENTS_PORTS}") foreach(COMP ${FreeRTOS_FIND_COMPONENTS_FAMILIES}) string(TOLOWER ${COMP} COMP_L) @@ -184,10 +176,10 @@ else() if(CMAKE_MATCH_2) set(FAMILY ${CMAKE_MATCH_1}) - set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}") + set(STM_DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}") else() set(FAMILY ${CMAKE_MATCH_1}) - stm32_get_devices_by_family(DEVICES FAMILY ${FAMILY} CORE ${CORE}) + stm32_get_devices_by_family(STM_DEVICES FAMILY ${FAMILY}) endif() if(CMAKE_MATCH_3) diff --git a/cmake/stm32/devices.cmake b/cmake/stm32/devices.cmake index e21554d9..886aec0e 100644 --- a/cmake/stm32/devices.cmake +++ b/cmake/stm32/devices.cmake @@ -1145,7 +1145,7 @@ function(stm32_get_devices_by_family STM_DEVICES) # No family argument, so get list of all devices set(RESULTING_DEV_LIST ${STM32_ALL_DEVICES}) endif() - + set(${STM_DEVICES} ${RESULTING_DEV_LIST} PARENT_SCOPE) endfunction() diff --git a/examples/freertos/CMakeLists.txt b/examples/freertos/CMakeLists.txt index ab1665af..5092bd3b 100644 --- a/examples/freertos/CMakeLists.txt +++ b/examples/freertos/CMakeLists.txt @@ -1,27 +1,169 @@ cmake_minimum_required(VERSION 3.16) -set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/stm32_gcc.cmake) +set(PROJ_NAME stm32-freertos) +set(STM32_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..) -project(stm32-freertos C ASM) +# Please note: When using CMSIS, it is recommended to use the FreeRTOS version supplied in the +# Cube repository because more recent kernels might be incompatible to the CMSIS +# implementation provided by STM +option(USE_CMSIS_RTOS "Use CMSIS RTOS provided by Cube repository" OFF) +option(USE_CMSIS_RTOS_V2 "Use CMSIS RTOS_V2 provided by Cube repository" OFF) +option(USE_CUBE_FREERTOS "Use the FreeRTOS kernel provided by the Cube repository" ON) + +if(USE_CUBE_FREERTOS) + message(STATUS "Using FreeRTOS provided by Cube repository") +else() + message(STATUS "Using FreeRTOS from kernel repository") +endif() + +if(USE_CMSIS_RTOS AND USE_CMSIS_RTOS_V2) + message(FATAL_ERROR "Can not use USE_CMSIS_RTOS_V2 together with USE_CMSIS_RTOS!") +endif() + +if(USE_CMSIS_RTOS) + message(STATUS "Compiling CMSIS RTOS support") +elseif(USE_CMSIS_RTOS_V2) + message(STATUS "Compiling CMSIS RTOS V2 support") +endif() + +# This must come before the project call! +set(CMAKE_TOOLCHAIN_FILE ${STM32_CMAKE_PATH}/cmake/stm32_gcc.cmake) +project(${PROJ_NAME} CXX C ASM) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) -find_package(CMSIS COMPONENTS STM32F407VG REQUIRED) -find_package(HAL COMPONENTS STM32F407VG REQUIRED) -find_package(FreeRTOS COMPONENTS ARM_CM4F REQUIRED) +# Can be used to print out all devices for the H7 family +# include(${STM32_CMAKE_PATH}/cmake/stm32/devices.cmake) +# stm32_print_devices_by_family(FAMILY H7) +# stm32_print_devices_by_family(FAMILY F4) + +set(SUPPORTED_BOARDS F407VG H743ZI) +option(FREERTOS_F407VG_EXAMPLE "Compile FreeRTOS example for the F407VG board" OFF) +option(FREERTOS_H743ZI_EXAMPLE "Compile FreeRTOS example for the H743ZI board" OFF) + +if(NOT FREERTOS_F407VG_EXAMPLE AND NOT FREERTOS_H743ZI_EXAMPLE) + message(FATAL_ERROR + "Please select at least one target to compile by passing FREERTOS__EXAMPLE=ON\n" + "Supported boards: ${SUPPORTED_BOARDS}" + ) +endif() + +set(HAL_COMP_LIST RCC GPIO CORTEX) +set(CMSIS_COMP_LIST "") +set(FREERTOS_COMP_LIST "") +set(FREERTOS_NAMESPACE FreeRTOS) + +if(USE_CMSIS_RTOS) + list(APPEND CMSIS_COMP_LIST RTOS) +endif() +if(USE_CMSIS_RTOS_V2) + list(APPEND CMSIS_COMP_LIST RTOS_V2) +endif() + +if(FREERTOS_H743ZI_EXAMPLE) + list(APPEND CMSIS_COMP_LIST STM32H743ZI STM32H7_M7) + list(APPEND HAL_COMP_LIST STM32H7M7 STM32H743ZI) + list(APPEND FREERTOS_COMP_LIST ARM_CM7) + list(APPEND FREERTOS_COMP_LIST STM32H7) + if(USE_CUBE_FREERTOS) + set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::H7::M7) + else() + set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}) + endif() +endif() + +if(FREERTOS_F407VG_EXAMPLE) + list(APPEND CMSIS_COMP_LIST STM32F407VG) + list(APPEND HAL_COMP_LIST STM32F407VG) + list(APPEND FREERTOS_COMP_LIST ARM_CM4F) + if(USE_CMSIS_RTOS OR USE_CMSIS_RTOS_V2) + list(APPEND FREERTOS_COMP_LIST STM32F4) + set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::F4) + else() + set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE}) + endif() +endif() + +find_package(CMSIS COMPONENTS ${CMSIS_COMP_LIST} REQUIRED) +find_package(HAL COMPONENTS ${HAL_COMP_LIST} REQUIRED) +find_package(FreeRTOS COMPONENTS ${FREERTOS_COMP_LIST} REQUIRED) set(PROJECT_SOURCES - main.c - FreeRTOSConfig.h + main.cpp ) -add_executable(stm32-freertos ${PROJECT_SOURCES} stm32f4xx_hal_conf.h) -target_link_libraries(stm32-freertos PRIVATE - FreeRTOS::Timers - FreeRTOS::Heap::1 - FreeRTOS::ARM_CM4F - HAL::STM32::F4::RCC - HAL::STM32::F4::GPIO - HAL::STM32::F4::CORTEX - CMSIS::STM32::F407VG - STM32::NoSys +# This is required because FreeRTOSConfig.h, stm32hxx_hal_conf.h and main.h +# need to be included +set(INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR} ) -stm32_print_size_of_target(stm32-freertos) + +if(FREERTOS_H743ZI_EXAMPLE) + set(TARGET_NAME ${PROJ_NAME}-h743zi) + add_executable(${TARGET_NAME}) + + target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES}) + target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} PRIVATE + ${FREERTOS_H7_NAMESPACE}::Timers + ${FREERTOS_H7_NAMESPACE}::Heap::4 + ${FREERTOS_H7_NAMESPACE}::ARM_CM7 + HAL::STM32::H7::M7::RCC + HAL::STM32::H7::M7::GPIO + HAL::STM32::H7::M7::CORTEX + CMSIS::STM32::H743ZI::M7 + STM32::NoSys + ) + if(USE_CMSIS_RTOS) + target_link_libraries(${TARGET_NAME} PRIVATE + CMSIS::STM32::H7::M7::RTOS + ) + endif() + if(USE_CMSIS_RTOS_V2) + target_link_libraries(${TARGET_NAME} PRIVATE + CMSIS::STM32::H7::M7::RTOS_V2 + ) + target_compile_definitions(${TARGET_NAME} PRIVATE + USE_CMSIS_RTOS_V2 + CMSIS_RTOS_V2_DEVICE_HEADER="stm32h7xx_hal.h" + ) + endif() + + stm32_print_size_of_target(${TARGET_NAME}) + stm32_generate_binary_file(${TARGET_NAME}) + stm32_generate_hex_file(${TARGET_NAME}) +endif() + +if(FREERTOS_F407VG_EXAMPLE) + set(TARGET_NAME ${PROJ_NAME}-f407vg) + add_executable(${TARGET_NAME}) + + target_sources(${TARGET_NAME} PRIVATE ${PROJECT_SOURCES}) + target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} PRIVATE + ${FREERTOS_F4_NAMESPACE}::Timers + ${FREERTOS_F4_NAMESPACE}::Heap::1 + ${FREERTOS_F4_NAMESPACE}::ARM_CM4F + HAL::STM32::F4::RCC + HAL::STM32::F4::GPIO + HAL::STM32::F4::CORTEX + CMSIS::STM32::F407VG + STM32::NoSys + ) + if(USE_CMSIS_RTOS) + target_link_libraries(${TARGET_NAME} PRIVATE + CMSIS::STM32::F4::RTOS + ) + endif() + if(USE_CMSIS_RTOS_V2) + target_link_libraries(${TARGET_NAME} PRIVATE + CMSIS::STM32::F4::RTOS_V2 + ) + target_compile_definitions(${TARGET_NAME} PRIVATE + USE_CMSIS_RTOS_V2 + CMSIS_RTOS_V2_DEVICE_HEADER="stm32f4xx_hal.h" + ) + endif() + + stm32_print_size_of_target(${TARGET_NAME}) + stm32_generate_binary_file(${TARGET_NAME}) + stm32_generate_hex_file(${TARGET_NAME}) +endif() diff --git a/examples/freertos/FreeRTOSConfig.h b/examples/freertos/FreeRTOSConfig.h index 141bfbb4..a67e23bd 100644 --- a/examples/freertos/FreeRTOSConfig.h +++ b/examples/freertos/FreeRTOSConfig.h @@ -1,124 +1,150 @@ -/* - * FreeRTOS Kernel V10.4.1 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -/*----------------------------------------------------------- - * Application specific definitions. - * - * These definitions should be adjusted for your particular hardware and - * application requirements. - * - * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE - * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. - * - * See http://www.freertos.org/a00110.html - *----------------------------------------------------------*/ - -#include -extern uint32_t SystemCoreClock; - -#define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 1 -#define configCPU_CLOCK_HZ ( SystemCoreClock ) -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configMAX_PRIORITIES ( 5 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) -#define configMAX_TASK_NAME_LEN ( 10 ) -#define configUSE_TRACE_FACILITY 1 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 1 -#define configUSE_MUTEXES 1 -#define configQUEUE_REGISTRY_SIZE 8 -#define configCHECK_FOR_STACK_OVERFLOW 2 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configUSE_MALLOC_FAILED_HOOK 1 -#define configUSE_APPLICATION_TASK_TAG 0 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configGENERATE_RUN_TIME_STATS 0 - -/* Co-routine definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) - -/* Software timer definitions. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY ( 2 ) -#define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) - -/* Set the following definitions to 1 to include the API function, or zero -to exclude the API function. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 1 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 - -/* Cortex-M specific definitions. */ -#ifdef __NVIC_PRIO_BITS - /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ - #define configPRIO_BITS __NVIC_PRIO_BITS -#else - #define configPRIO_BITS 4 /* 15 priority levels */ -#endif - -/* The lowest interrupt priority that can be used in a call to a "set priority" -function. */ -#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf - -/* The highest interrupt priority that can be used by any interrupt service -routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL -INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER -PRIORITY THAN THIS! (higher priorities are lower numeric values. */ -#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 - -/* Interrupt priorities used by the kernel port layer itself. These are generic -to all Cortex-M ports, and do not rely on any particular library functions. */ -#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! -See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ -#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) - -/* Normal assert() semantics without relying on the provision of an assert.h -header file. */ -#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } - -/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS -standard names. */ -#define vPortSVCHandler SVC_Handler -#define xPortPendSVHandler PendSV_Handler -#define xPortSysTickHandler SysTick_Handler - -#endif /* FREERTOS_CONFIG_H */ - +/* + * FreeRTOS Kernel V10.4.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html + *----------------------------------------------------------*/ + +#include +extern uint32_t SystemCoreClock; + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( SystemCoreClock ) +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#if !defined USE_CMSIS_RTOS_V2 +#define configMAX_PRIORITIES ( 5 ) +#endif +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 10 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_APPLICATION_TASK_TAG 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configGENERATE_RUN_TIME_STATS 0 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Software timer definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY ( 2 ) +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +#if defined USE_CMSIS_RTOS_V2 + +#ifndef CMSIS_RTOS_V2_DEVICE_HEADER +#error "CMSIS device header needs to be passed by the build system" +#endif +#define CMSIS_device_header CMSIS_RTOS_V2_DEVICE_HEADER + +/* Needed for CMSIS RTOS_V2 */ +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configMAX_PRIORITIES 56 + +#define INCLUDE_xSemaphoreGetMutexHolder 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTimerPendFunctionCall 1 + +#endif + +/* Cortex-M specific definitions. */ +#ifdef __NVIC_PRIO_BITS + /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 4 /* 15 priority levels */ +#endif + +/* The lowest interrupt priority that can be used in a call to a "set priority" +function. */ +#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf + +/* The highest interrupt priority that can be used by any interrupt service +routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL +INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER +PRIORITY THAN THIS! (higher priorities are lower numeric values. */ +#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 + +/* Interrupt priorities used by the kernel port layer itself. These are generic +to all Cortex-M ports, and do not rely on any particular library functions. */ +#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } + +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler + +/* When using CMSIS RTOS V2, this define causes a multiple definition error */ +#if !defined USE_CMSIS_RTOS_V2 +#define xPortSysTickHandler SysTick_Handler +#endif + +#endif /* FREERTOS_CONFIG_H */ + diff --git a/examples/freertos/main.cpp b/examples/freertos/main.cpp new file mode 100644 index 00000000..df43c03a --- /dev/null +++ b/examples/freertos/main.cpp @@ -0,0 +1,79 @@ +#include "main.h" +#include +#include +#include + +#if defined STM32H7 + #include + + // STM32H743ZI blue LED + #define LED_PORT GPIOB + #define LED_PIN GPIO_PIN_7 + #define LED_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE +#elif defined STM32F4 + #include + + // STM32F4-Discovery green led - PD12 + #define LED_PORT GPIOD + #define LED_PIN GPIO_PIN_12 + #define LED_PORT_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE +#endif + +static void blinky::blinkTask(void *arg) +{ + for(;;) + { + vTaskDelay(500); + HAL_GPIO_TogglePin(LED_PORT, LED_PIN); + } +} + +void blinky::init() +{ + GPIO_InitTypeDef GPIO_Config; + + GPIO_Config.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_Config.Pull = GPIO_NOPULL; + GPIO_Config.Speed = GPIO_SPEED_FREQ_HIGH; + + GPIO_Config.Pin = LED_PIN; + + LED_PORT_CLK_ENABLE(); + HAL_GPIO_Init(LED_PORT, &GPIO_Config); +} + +int main(void) +{ + SystemInit(); + blinky::init(); + + xTaskCreate(blinky::blinkTask, "blinky", configMINIMAL_STACK_SIZE * 4, NULL, tskIDLE_PRIORITY + 1, NULL); + + vTaskStartScheduler(); + for (;;); + + return 0; +} + +extern "C" void vApplicationTickHook(void) +{ +} + +extern "C" void vApplicationIdleHook(void) +{ +} + +extern "C" void vApplicationMallocFailedHook(void) +{ + taskDISABLE_INTERRUPTS(); + for(;;); +} + +extern "C" void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) +{ + (void) pcTaskName; + (void) pxTask; + + taskDISABLE_INTERRUPTS(); + for(;;); +} diff --git a/examples/freertos/main.h b/examples/freertos/main.h new file mode 100644 index 00000000..d3a99f45 --- /dev/null +++ b/examples/freertos/main.h @@ -0,0 +1,11 @@ +#ifndef STM32_CMAKE_EXAMPLES_FREERTOS_MAIN_H_ +#define STM32_CMAKE_EXAMPLES_FREERTOS_MAIN_H_ + +namespace blinky { + +void init(); +static void blinkTask(void* args); + +} + +#endif /* STM32_CMAKE_EXAMPLES_FREERTOS_MAIN_H_ */ diff --git a/examples/freertos/stm32f4xx_hal_conf.h b/examples/freertos/stm32f4xx_hal_conf.h old mode 100755 new mode 100644 index a934b1cc..8b5b674e --- a/examples/freertos/stm32f4xx_hal_conf.h +++ b/examples/freertos/stm32f4xx_hal_conf.h @@ -1,501 +1,495 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -// #define HAL_ADC_MODULE_ENABLED -// #define HAL_CAN_MODULE_ENABLED -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -// #define HAL_CRC_MODULE_ENABLED -// #define HAL_CEC_MODULE_ENABLED -// #define HAL_CRYP_MODULE_ENABLED -// #define HAL_DAC_MODULE_ENABLED -// #define HAL_DCMI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -// #define HAL_DMA2D_MODULE_ENABLED -// #define HAL_ETH_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -// #define HAL_NAND_MODULE_ENABLED -// #define HAL_NOR_MODULE_ENABLED -// #define HAL_PCCARD_MODULE_ENABLED -// #define HAL_SRAM_MODULE_ENABLED -// #define HAL_SDRAM_MODULE_ENABLED -// #define HAL_HASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -// #define HAL_EXTI_MODULE_ENABLED -// #define HAL_I2C_MODULE_ENABLED -// #define HAL_SMBUS_MODULE_ENABLED -// #define HAL_I2S_MODULE_ENABLED -// #define HAL_IWDG_MODULE_ENABLED -// #define HAL_LTDC_MODULE_ENABLED -// #define HAL_DSI_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -// #define HAL_QSPI_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -// #define HAL_RNG_MODULE_ENABLED -// #define HAL_RTC_MODULE_ENABLED -// #define HAL_SAI_MODULE_ENABLED -// #define HAL_SD_MODULE_ENABLED -// #define HAL_SPI_MODULE_ENABLED -// #define HAL_TIM_MODULE_ENABLED -// #define HAL_UART_MODULE_ENABLED -// #define HAL_USART_MODULE_ENABLED -// #define HAL_IRDA_MODULE_ENABLED -// #define HAL_SMARTCARD_MODULE_ENABLED -// #define HAL_WWDG_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -// #define HAL_PCD_MODULE_ENABLED -// #define HAL_HCD_MODULE_ENABLED -// #define HAL_FMPI2C_MODULE_ENABLED -// #define HAL_FMPSMBUS_MODULE_ENABLED -// #define HAL_SPDIFRX_MODULE_ENABLED -// #define HAL_DFSDM_MODULE_ENABLED -// #define HAL_LPTIM_MODULE_ENABLED -// #define HAL_MMC_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848 PHY Address*/ -#define DP83848_PHY_ADDRESS 0x01U -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ - -#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ - -#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ - -#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ - -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 1U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_FMPSMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_fmpsmbus.h" -#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +// #define HAL_ADC_MODULE_ENABLED +// #define HAL_CAN_MODULE_ENABLED +// #define HAL_CAN_LEGACY_MODULE_ENABLED +// #define HAL_CRC_MODULE_ENABLED +// #define HAL_CEC_MODULE_ENABLED +// #define HAL_CRYP_MODULE_ENABLED +// #define HAL_DAC_MODULE_ENABLED +// #define HAL_DCMI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +// #define HAL_DMA2D_MODULE_ENABLED +// #define HAL_ETH_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +// #define HAL_NAND_MODULE_ENABLED +// #define HAL_NOR_MODULE_ENABLED +// #define HAL_PCCARD_MODULE_ENABLED +// #define HAL_SRAM_MODULE_ENABLED +// #define HAL_SDRAM_MODULE_ENABLED +// #define HAL_HASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +// #define HAL_EXTI_MODULE_ENABLED +// #define HAL_I2C_MODULE_ENABLED +// #define HAL_SMBUS_MODULE_ENABLED +// #define HAL_I2S_MODULE_ENABLED +// #define HAL_IWDG_MODULE_ENABLED +// #define HAL_LTDC_MODULE_ENABLED +// #define HAL_DSI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +// #define HAL_QSPI_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +// #define HAL_RNG_MODULE_ENABLED +// #define HAL_RTC_MODULE_ENABLED +// #define HAL_SAI_MODULE_ENABLED +// #define HAL_SD_MODULE_ENABLED +// #define HAL_SPI_MODULE_ENABLED +// #define HAL_TIM_MODULE_ENABLED +// #define HAL_UART_MODULE_ENABLED +// #define HAL_USART_MODULE_ENABLED +// #define HAL_IRDA_MODULE_ENABLED +// #define HAL_SMARTCARD_MODULE_ENABLED +// #define HAL_WWDG_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +// #define HAL_PCD_MODULE_ENABLED +// #define HAL_HCD_MODULE_ENABLED +// #define HAL_FMPI2C_MODULE_ENABLED +// #define HAL_SPDIFRX_MODULE_ENABLED +// #define HAL_DFSDM_MODULE_ENABLED +// #define HAL_LPTIM_MODULE_ENABLED +// #define HAL_MMC_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/freertos/stm32h7xx_hal_conf.h b/examples/freertos/stm32h7xx_hal_conf.h new file mode 100644 index 00000000..a0244eea --- /dev/null +++ b/examples/freertos/stm32h7xx_hal_conf.h @@ -0,0 +1,432 @@ +/** + ****************************************************************************** + * @file stm32h7xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32H7xx_HAL_CONF_H +#define __STM32H7xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + #define HAL_MODULE_ENABLED + #define HAL_ADC_MODULE_ENABLED +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ + #define HAL_CORTEX_MODULE_ENABLED +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +#define HAL_DMA2D_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +/* #define HAL_FDCAN_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_HRTIM_MODULE_ENABLED */ +/* #define HAL_HSEM_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_JPEG_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_LTDC_MODULE_ENABLED +/* #define HAL_MDIOS_MODULE_ENABLED */ +#define HAL_MDMA_MODULE_ENABLED +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_OPAMP_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_RAMECC_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SDRAM_MODULE_ENABLED +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SWPMI_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal oscillator (CSI) default value. + * This value is the default CSI value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0x0F) /*!< tick interrupt priority */ +#define USE_RTOS 0 +#define USE_SD_TRANSCEIVER 1U /*!< use uSD Transceiver */ + +/* ########################### Ethernet Configuration ######################### */ +#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ +#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ + +#define ETH_MAC_ADDR0 ((uint8_t)0x02) +#define ETH_MAC_ADDR1 ((uint8_t)0x00) +#define ETH_MAC_ADDR2 ((uint8_t)0x00) +#define ETH_MAC_ADDR3 ((uint8_t)0x00) +#define ETH_MAC_ADDR4 ((uint8_t)0x00) +#define ETH_MAC_ADDR5 ((uint8_t)0x00) + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1 */ + + +/* ################## SPI peripheral configuration ########################## */ +/** + * @brief Used to activate CRC feature inside HAL SPI Driver + * Activated (1U): CRC code is compiled within HAL SPI driver + * Deactivated (0U): CRC code excluded from HAL SPI driver + */ + +#define USE_SPI_CRC 1U + + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32h7xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32h7xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32h7xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_MDMA_MODULE_ENABLED + #include "stm32h7xx_hal_mdma.h" +#endif /* HAL_MDMA_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32h7xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32h7xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32h7xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32h7xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32h7xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32h7xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32h7xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32h7xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED + #include "stm32h7xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32h7xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32h7xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32h7xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32h7xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32h7xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32h7xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED + #include "stm32h7xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_HSEM_MODULE_ENABLED + #include "stm32h7xx_hal_hsem.h" +#endif /* HAL_HSEM_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32h7xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32h7xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32h7xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32h7xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32h7xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_JPEG_MODULE_ENABLED + #include "stm32h7xx_hal_jpeg.h" +#endif /* HAL_JPEG_MODULE_ENABLED */ + +#ifdef HAL_MDIOS_MODULE_ENABLED + #include "stm32h7xx_hal_mdios.h" +#endif /* HAL_MDIOS_MODULE_ENABLED */ + + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32h7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h7xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32h7xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32h7xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32h7xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32h7xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RAMECC_MODULE_ENABLED + #include "stm32h7xx_hal_ramecc.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32h7xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32h7xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32h7xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32h7xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32h7xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32h7xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32h7xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32h7xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32h7xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32h7xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32h7xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32h7xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32h7xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32h7xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32h7xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32h7xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32H7xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 750cce6427ab84a06db06f8e431fb7b00cbe993d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 1 Aug 2021 20:46:15 +0200 Subject: [PATCH 4/4] Changes from code review 1. include for device print function not necessary anymore 2. Improved component convention for H7 example 3. Fixed possible bug in F4 example component logic, is also consistent now 4. Some clarifications and form improvements for FreeRTOS section in README --- README.md | 22 +++++++++++++--------- cmake/FindFreeRTOS.cmake | 6 +----- examples/freertos/CMakeLists.txt | 13 +++++++------ 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6608f111..8a54a6fb 100644 --- a/README.md +++ b/README.md @@ -211,17 +211,20 @@ stm32-cmake contains additional CMake modules for finding and configuring variou `FREERTOS_PATH` can be either the path to the whole [FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS) github repo, or the path to FreeRTOS-Kernel (usually located in the subfolder `FreeRTOS` on a downloaded release). -You can supply `FREERTOS_PATH` as an environmental variable as well. +`FREERTOS_PATH` can be supplied as an environmental variable as well. -You can either use the FreeRTOS kernel provided in the Cube repositories, or a separate +It is possible to either use the FreeRTOS kernel provided in the Cube repositories, or a separate FreeRTOS kernel. The Cube repository also provides the CMSIS RTOS and CMSIS RTOS V2 implementations. -If you like to use the CMSIS implementations, it is recommended to also use the FreeRTOS sources +If the CMSIS implementations is used, it is recommended to also use the FreeRTOS sources provided in the Cube repository because the CMSIS port might be incompatible to newer kernel -versions. +versions. The FreeRTOS port to use is specified as a `FreeRTOS` component. A list of available +ports can be found below. If the FreeRTOS sources provided in the Cube repository are used, the +device family also has to be specified as a component for the `FreeRTOS` package. -You can specify to use CMSIS with a `CMSIS` target and by finding the CMSIS `RTOS` package. -To select which FreeRTOS to use, you can find the package for a specific FreeRTOS port and then -link against that port target within a specific namespace. +CMSIS RTOS can be used by specifying a `CMSIS` target and by finding the CMSIS `RTOS` package. +The following section will show a few example configurations for the H7 and F4 family. +You can also find example code for the `H743ZI` and `F407VG` devices in the `examples` +folder. Typical usage for a H7 device when using the M7 core, using an external kernel without CMSIS support. The FreeRTOS namespace is set to `FreeRTOS` and the `ARM_CM7` port is used: @@ -247,7 +250,8 @@ target_link_libraries(${TARGET_NAME} PRIVATE ``` Another typical usage using the FreeRTOS provided in the Cube repository and the CMSIS support. -The FreeRTOS namespace is set to `FreeRTOS::STM32::` and the `ARM_CM7` port is used: +The FreeRTOS namespace is set to `FreeRTOS::STM32::`, the `ARM_CM7` port is used and +the device family is specified as a `FreeRTOS` component with `STM32H7`: ```cmake find_package(CMSIS COMPONENTS STM32H743ZI STM32H7_M7 RTOS REQUIRED) @@ -269,7 +273,7 @@ in the Cube repository * `FreeRTOS::STM32::` -For the multi-core architectures, you have to specify both family and core like specified in the +For the multi-core architectures, both family and core need to be specified like shown in the example above. The following FreeRTOS ports are supported in general: `ARM_CM0`, `ARM_CM3`, `ARM_CM4F`, `ARM_CM7`, diff --git a/cmake/FindFreeRTOS.cmake b/cmake/FindFreeRTOS.cmake index 5f47c610..5287fcce 100644 --- a/cmake/FindFreeRTOS.cmake +++ b/cmake/FindFreeRTOS.cmake @@ -17,7 +17,7 @@ if(NOT FREERTOS_PATH) else() message(STATUS "No FreeRTOS folder found at default location ${DEFAULT_FREERTOS_PATH}. " - "Leaving empty" + "Leaving empty.." ) endif() endif() @@ -156,10 +156,6 @@ endmacro() message(STATUS "Search for FreeRTOS ports: ${FreeRTOS_FIND_COMPONENTS_PORTS}") if(NOT FreeRTOS_FIND_COMPONENTS_FAMILIES) - if(NOT FREERTOS_PATH) - set(FREERTOS_PATH /opt/FreeRTOS CACHE PATH "Path to FreeRTOS") - message(STATUS "No FREERTOS_PATH specified, using default: ${FREERTOS_PATH}") - endif() stm32_find_freertos(FreeRTOS ${FREERTOS_PATH}) else() message(STATUS "Search for FreeRTOS families: ${FreeRTOS_FIND_COMPONENTS_FAMILIES}") diff --git a/examples/freertos/CMakeLists.txt b/examples/freertos/CMakeLists.txt index 5092bd3b..11a6f46f 100644 --- a/examples/freertos/CMakeLists.txt +++ b/examples/freertos/CMakeLists.txt @@ -30,8 +30,7 @@ set(CMAKE_TOOLCHAIN_FILE ${STM32_CMAKE_PATH}/cmake/stm32_gcc.cmake) project(${PROJ_NAME} CXX C ASM) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) -# Can be used to print out all devices for the H7 family -# include(${STM32_CMAKE_PATH}/cmake/stm32/devices.cmake) +# Can be used to print out all devices for the H7 or/and the F4 family # stm32_print_devices_by_family(FAMILY H7) # stm32_print_devices_by_family(FAMILY F4) @@ -59,11 +58,12 @@ if(USE_CMSIS_RTOS_V2) endif() if(FREERTOS_H743ZI_EXAMPLE) - list(APPEND CMSIS_COMP_LIST STM32H743ZI STM32H7_M7) - list(APPEND HAL_COMP_LIST STM32H7M7 STM32H743ZI) + list(APPEND CMSIS_COMP_LIST STM32H743ZI_M7) + list(APPEND HAL_COMP_LIST STM32H7M7) list(APPEND FREERTOS_COMP_LIST ARM_CM7) - list(APPEND FREERTOS_COMP_LIST STM32H7) if(USE_CUBE_FREERTOS) + # The device family needs to be supplied as a component to use the Cube FreeRTOS sources + list(APPEND FREERTOS_COMP_LIST STM32H7) set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::H7::M7) else() set(FREERTOS_H7_NAMESPACE ${FREERTOS_NAMESPACE}) @@ -74,7 +74,8 @@ if(FREERTOS_F407VG_EXAMPLE) list(APPEND CMSIS_COMP_LIST STM32F407VG) list(APPEND HAL_COMP_LIST STM32F407VG) list(APPEND FREERTOS_COMP_LIST ARM_CM4F) - if(USE_CMSIS_RTOS OR USE_CMSIS_RTOS_V2) + if(USE_CUBE_FREERTOS) + # The device family needs to be supplied as a component to use the Cube FreeRTOS sources list(APPEND FREERTOS_COMP_LIST STM32F4) set(FREERTOS_F4_NAMESPACE ${FREERTOS_NAMESPACE}::STM32::F4) else()