Type | Tool used |
---|---|
Build framework | cmake |
Toolchain | arm-none-eabi-gcc |
RTOS | FreeRTOS |
HAL | STM32 CubeMX |
Test framework | Unity |
Mocking framework | FFF |
Code coverage | lcov |
GDB utilities | GDB dashboard |
GDB server | openocd |
Documentation | doxygen |
- Clone complete repo including submodules
git clone --recurse-submodules --depth 1 --single-branch https://github.com/rgujju/STM32_Base_Project <your_project_name>
But the problem with this is the CMSIS and FreeRTOS repos (submodules) are huge due to history and takes time to download.
- Clone this repo only and change paths of CMSIS and FreeRTOS in the CmakeLists.txt to the ones you already have.
git clone --depth 1 --single-branch https://github.com/rgujju/STM32_Base_Project <your_project_name>
-
components folder includes external libraries like RTOS, HAL, CMSIS, unity, and FFF mostly as git submodules.
-
modules folder contains sources for individual parts which can be unit tested.
-
test folder contains the tests for the modules.
-
Debug build is the default build if
CMAKE_BUILD_TYPE
is not specified during cross-compiling -
ARM Semihosting is turned on by default. To turn off use
-DSEMIHOSTING=0
.SEMIHOSTING
is also a macro which is set if ARM semihosting is enabled. -
Most of the values like HSE, linker script, RTOS path, HAL path, CMSIS path, etc can be set in the configurable section of CMakeLists.txt in project root.
-
To add new modules, copy modules/simple_module to modules/<your_module_name> and rename
simple_module
with<your_module_name>
in the modules/<your_module_name>/CMakeLists.txt file, and addadd_subdirectory(<your_module_name>)
to the modules/CMakeLists.txt. Finally add<your_module_name>
to the MODULES_USED variable in CMakeLists.txt. -
For adding test for the modules, create test/test_<your_module_name>.c and add two lines as follows in test/CMakeLists.txt
list(APPEND tests_names "test_<your_module_name>") list(APPEND tests_flags " ")
-
For
make flash
to work openocd should be running.
mkdir -p build/test
Generate Makefile
cmake ../.. -DTARGET_GROUP=test
Build the tests
make
To run the tests
ctest --verbose
or to test and generate coverage report all together.
make coverage
The coverage report will be in build/test/coverage/index.html
mkdir -p build/release
Generate Makefile
cmake ../.. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../../cross.cmake -DTARGET_GROUP=production
Generate elf
make <your_project_name>.elf
Load the board with elf
make flash
Note: To make FreeRTOS link with -flto
option during Release build -Wl,--undefined=vTaskSwitchContext
is passed to the linker.
mkdir -p build/debug
Generate Makefile
cmake ../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../../cross.cmake -DTARGET_GROUP=production
Generate elf
make <your_project_name>.elf
Start GDB and load the board with elf with GDB dashboard output to eg: /dev/pts/12
make flash GDB_TTY=/dev/pts/12
Note: flash
target is not present when -DTARGET_GROUP=test
is provided.
Currently using terminator to split the terminal to two and output the GDB dashboard to the terminal on the right
In the above created folders (build/release, build/debug), use command
make docs
Documentation files will be generated in html and latex format. For example if command is used in build/release dir then
documentation will be generated in build/release/html/index.html
Note: docs
target is not present when -DTARGET_GROUP=test
is provided.
- This project uses the STM32F429 mcu but should be portable to any mcu.
- Replace components/STM32F4xx_HAL_Driver and include/stm32f4xx_hal_conf.h with the HAL of your mcu.
- Replace include/STM32F4xx with the vendor files for your mcu. These files are basically the system, startup and header files of your mcu.
- The above 2 folders are provided by the vendor. In case of STM32, it is possible to use STM32CubeMX to generate them.
- Change MCU Setup, HAL Setup, and optionally RTOS Setup and CMSIS Setup in the CMakeLists.txt file.
- Linker script linker.ld needs to be changes according to your mcu memory. layout_base.ld also may be requried to be changed.