The FSFW example for the STM32H7 MCU family, using the FSFW FreeRTOS OSAL
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Robin Müller 34640746ae
everything working again
4 months ago
.idea/runConfigurations add default freertos build cfg 4 months ago
STM32CubeH7@b340b13929 fix some issues and test on hw 4 months ago
bsp_stm32h7_freertos everything working again 4 months ago
cmake everything working again 4 months ago
example_common@c564fa37fd everything working again 4 months ago
fsfw@678f8710c6 everything working again 4 months ago
generators bump submodules 4 months ago
misc added SVD file 11 months ago
scripts run auto-formatter 4 months ago
tmtc everything working again 4 months ago
.gitignore bump submodules 4 months ago
.gitmodules fsfw_hal moved to fsfw 1 year ago
CMakeLists.txt everything working again 4 months ago
LICENSE init commit 1 year ago
NOTICE init commit 1 year ago debugging mem exception 4 months ago update helper scripts 4 months ago

FSFW Example Application

This repository features a demo application. The example has been run successfully on the following platforms:

  • Linux host machine with the Linux OSAL or the Host OSAL
  • Windows with the Host OSAL
  • STM32H743ZI-Nucleo with the FreeRTOS OSAL
  • Raspberry Pi with the Linux OSAL
  • STM32H743ZI-Nucleo with the RTEMS OSAL

The purpose of this example is to provide a demo of the FSFW capabilities. However, it can also be used as a starting point to set up a repository for new flight software. It also aims to provide developers with practical examples of how the FSFW is inteded to be used and how project using the FSFW should or can be set up and it might serve as a basic test platform for the FSFW as well to ensure all OSALs are compiling and running as expected.

The repository contains a Python TMTC program which can be used to showcase the TMTC capabilities of the FSFW (currently, using the ECSS PUS packet standard).

Configuring the Example

The build system will copy three configuration files into the build directory:

  1. commonConfig.h which contains common configuration parameters
  2. OBSWConfig.h which can contain machine and architecture specific configuration options
  3. FSFWConfig.h which contains the configuration for the flight software framework

These files can be edited manually after CMake build generation.


Getting started with Eclipse for C/C++
Getting started with CMake

Getting started with the Hosted OSAL
Getting started with the FreeRTOS OSAL on a STM32
Getting started with the RTEMS OSAL on a STM32
Getting started with the Raspberry Pi
Getting started with the Beagle Bone Black

FSFW demo with FreeRTOS OSAL on the STM32H743ZI

This demo can be run on a STM32H743ZI-Nucleo board with the FreeRTOS OSAL.

General Information

The board is flashed and debugged with OpenOCD and this README specifies on how to make this work with the Eclipse IDE. Other IDEs or the command line can be used as well as long as long as OpenOCD integration is given. The example demo uses newlib nano (glibc). Some system calls were overriden so the C and C++ stdio functions work. IO is sent via the HUART3, so debug output can be read directly from the USB connection to the board.


If you have not set up the prerequisites yet, go to the prerequisites chapter for detailed instructions on how to install these.

Here is a brief overview of the required tools to develop software for the STM32H7 microcontroller:

  1. CMake build system generator installed
  2. Build system like Ninja Build or Make installed.
  3. Bare-Metal ARM toolchain installed
  4. Recommended for application code development: Eclipse for C/C++ installed with the Eclipse MCU plugin
  5. OpenOCD installed for Eclipse debugging
  6. STM32 USB drivers installed, separate steps for Windows or Linux

Building the software with CMake

On Windows, the following steps should be performed inside the MinGW64 console after installing MSYS2 or inside another Unix shell like git bash.

  1. Clone this repository

    git clone
  2. Set up submodules

    git submodule init
    git submodule update
  3. Navigate into the cloned repository and create a folder for the build. We will create a Debug build folder.

    mkdir cmake-build-debug
    cd cmake-build-debug
  4. Ensure that the ARM compiler has been added to the path and can be called from the command line. For example, the following command should work:

    arm-none-eabi-gcc --version

    Now we will create the build configuration for cross-compilation of an ARM target. On Linux, the following build will create a debug build configuration with the Unix Makefile generator. You can also specify -G Ninja to use Ninja instead of Make.

    cmake ..

    On Windows, use the following command to build with the MinGW Makefiles build system

    cmake -G "MinGW Makefiles" ..

    The build configuration can also be performed with the shell scripts located inside cmake/scripts.

  5. Build the application with the following command

    cmake --build . -j

    The application will be located inside the Debug folder and has been compiled for the flash memory.

  6. You can test the application by first connecting the STM32H743ZI-Nucleo via USB. The device should now show up in the list of connected devices (make sure the USB drivers are installed as well). Drag and drop the binary file into the connected device to flash it. The debug output is also sent via the connected USB port and a blink pattern (1 second interval) can be used to verify the software is running properly.

Setting up Prerequisites



sudo apt-get install cmake


On Windows, you can use pacman -S mingw-w64-x86_64-cmake, but you can also install the Windows CMake via the installer. It is recommended to pick the install option Add CMake to system PATH for all users to CMake can be used from the command line. Please note that you need to add the Windows CMake path to the MinGW64 path manually if you want to use it in CMake.


The instuctions here specify how to install and use a specific version of the xPacks cross-compiler but you can use any other ARM cross-compiler which can generate bare-metal code, usually denoted by the arm-none-eabi cross-compiler triplet.

If you don't want to install nodejs you may go with the four-command manual installation.


On Windows, it is recommended to perform the xpm and toolchain installation from the Windows command line.The simple way required npm, which can be installed by installing NodeJS. Make sure npm can be run from the command line by adding the folder containing npm.exe to the system path and running the following command

npm install --global xpm@latest
xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@11.2.1-1.1.1 --verbose

On Windows, the toolchain binaries will be located in a folder like this


You can now run the following commands in the repository root:

xpm init
xpm install @xpack-dev-tools/arm-none-eabi-gcc@11.2.1-1.1.1

to create symlinks to the toolchain in ./xpacks/.bin. You can now set up the environment by using . or the following command

export PATH="$(pwd)/xpacks/.bin":$PATH

On Windows, you can use git bash to perform the step above.

Alternatively, you can use the graphical system environmental variables editor to add the .bin path to the system variables permanently or use the appriate command for CMD or PowerShell to update the PATH variable.


Install npm and nodejs first. Example for Ubuntu according to this guide.

curl -sL | sudo -E bash -
sudo apt-get update && sudo apt-get install nodejs

Check that npm is installed with npm --version. Then xpm and the cross-compiler are installed.

sudo npm install --global xpm@latest
xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@11.2.1-1.1.1 --verbose

You can now run the following commands in the repository root:

xpm init
xpm install @xpack-dev-tools/arm-none-eabi-gcc@11.2.1-1.1.1

to create symlinks to the toolchain in ./xpacks/.bin. You can now set up the environment by using . or the following command

export PATH="$(pwd)/xpacks/.bin":$PATH

Build System

It is recommended to use ninja or make as the software build system.


It is recommended to use the Ninja build system. Download the ninja executable and place it somewhere. You need to add the folder containing the ninja executable to the system environmental variables so it can be used in the build process. You can test whether ninja works by running ninja --version in the command line.

Alternatively or additionally, you can also install mingw32-make which comes bundled with MinGW64. Make sure to add the binaries path to the Windows path during installation. Otherwise, you need to add msys64/mingw64/bin to the Windows path so you can run installed binaries from the command line. Open the MinGW64 shell and run the following commands.

pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-make mingw-w64-x86_64-cmake

You can test successfull installation with mingw32-make -v from the Windows Command Line.


On Linux, make is pre-installed and it is recommended to use it directly. You can install ninja with

sudo apt-get install ninja-build

USB Drivers


Install the STM32 USB drivers.


Install the USB drivers on Linux. On Ubuntu, you can run the following command to install it:

sudo apt-get install stlink-tools

Setting up Eclipse for OpenOCD debugging

The separate Eclipse README specifies how to set up Eclipse. The STM32 configuration uses the xPacks OpenOCD and the xPacks ARM Toolchain, so those should be installed as well. OpenOCD should be configured correctly in the STM32 launch configurations.


OpenOCD errors

If you get the following error in OpenOCD: "Error: auto_probe failed", this could be related from switching between FreeRTOS and RTEMS. You can try the following steps:

  1. First way: Flash the binary manually by drag & droping the binary into the USB drive manually once

  2. Second way: Add -c "gdb_memory_map disable" to the OpenOCD arguments (in Eclipse) and run once. Debugging might not be possible, so remove it for subsequent runs.

  3. Third way: Add the following lines to the stm32h7x.cfg file located inside the OpenOCD folder inside the scripts/target folder:

    $_CHIPNAME.cpu configure -event gdb-attach {
    $_CHIPNAME.cpu configure -event gdb-attach {
        reset init