STM32 avionics board repo
This guide should get you through your first build of the project for stm32. For local simulation, read the desktop readme.
First, pull this git repository using the following command from a directory of your liking.
git clone --recurse-submodules [email protected]:AerospaceNU/stm32-avionics.git
Note: you must have git installed. You can install git for windows here.
Next, open STM32 Cube IDE. If you do not have Cube you can install it from this link. Please download version 1.12.0 for compatibility with our code.
When opening the IDE, you can use the default workspace. Using the cloned directory may cause problems.
Once the IDE is open, you can import the project. Navigate to File -> Import -> General -> Existing Projects into Workspace
. Browse for the stm32-avionics
folder. Make sure Search for nested projects
is checked and that none of the other options are checked, then import all projects. All projects should build at this point by clicking on the hammer icon when one of their files is open.
To keep commonality among code, we will be using both a formatter and a linter for C/C++. The formatter is called clang-format, and the linter is called Cpplint.
- Ensure python is installed on your system. If not, download from the Python website. The newest version is preferred. Also ensure Python executable is added to your PATH
- Run
pip install clang-format
- Find clang-format.exe. This should be in your python installation folder in Lib/site-packages/clang_format/data/bin. Record the full path to the clang-format.exe file.
- Run
pip install cpplint
- Cpplint needs to be an executable to be run in Eclipse as a plugin. Therefore, you need to make an executable. Install pyinstaller with
pip install pyinstaller
, then runpyinstaller path_to_cpplint.py
. - In the folder where you ran pyinstaller, you should see a folder called
dist/cpplint
. Move this folder somewhere where you'll remember, outside the repository. Note there should be acpplint.exe
file. This will be used later.
- In IDE, click Help->Install New Software. Click Add.
- For name, type CppStyle, and for URL, type http://www.zhanwei.wang/CppStyle/update. Follow instructions until end and restart IDE.
- Go to Window->Preferences->C/C++->Code Style->Formatter->Code Formatter. Change to CppStyle (clang-format)
- Go to Window->Preferences->C/C++->CppStyle. Change Clang-format Path to correct executable recorded in earlier section. Change Cpplint path to
cpplint.exe
from previous section. - Check Run clang-format on file save and Enable cpplint.
- Go to Preferences->C/C++->Code Analysis. Check all boxes except:
- Coding Style/Avoid magic numbers
- Coding Style/C-Style cast instead of C++ cast
- Coding Style/Goto statement used
- Coding Style/Lack of copyright information
- Coding Style/Line Comments
- Coding Style/Multiple variable declaration
- Coding Style/Name convention for function
- Coding Style/Return with parenthesis
- Cpplint Issues/Legal
- Potential Programming Problems/Miss copy constructor or assignment operator
- By default CppStyle doesn't run on .c files. Staying on Code Analysis tab, highlight all items under Cpplint Issues by clicking on "Build/c++11", holding shift, and clicking on "Whitespace/todo." Click the Customize Selected button underneath. Go to the Scope tab and click Add... next to Inclusion patterns. Type
*.c
and click OK. Apply all changes. - When you save a file, both clang-format and cpplint should now run.
To run code in debug mode, click on the bug symbol drop down. Click on fcb_v0
or the equivalent for the specific board version. If it doesn't show up, click on Debug Configurations...
and find it. The code should load onto the board.
Read this to understand how the code is set up. We will start with important folders with custom code then move to folders with "generated" code.
- Files for communicating with hardware connected to a stm32 microcontroller, like on our FCBs
- Calls STM32's HAL functions located in Driver folder
- All files that don't deal directly with hardware.
- These files should not call any code from Devices or HAL drivers, except for Hardware Manager.
- Scheduler: Controls all states, including running current state and transitioning between states.
- States: Hold an init, run, and cleanup function for scheduler to call. Running returns an end condition to help the scheduler determine what to do next.
- Hardware Manager: Wrapper for all calls to Devices folder. Allows simplification from system level, such as calling a function to get all sensor data, initialize all sensor data, etc.
- Others, like Data Log, Data Transmission, Filters: Files that don't need to know about hardware directly because the underlying implementation doesn't matter. For instance, it doesn't matter how the flash or radio are set up to call a function from hardware manager to control them.
- Files that could be used anywhere in System or Devices
- These files consist of general helpers and math operations
- This folder is full of generated code. It will change when you generate code from the configuration GUI.
- The only reason to edit files in this folder directly is to start your system level code in main.cpp. If editing, only write code in between the USER_CODE_BEGIN USER_CODE_END comments.
- We replaced the generated main.c with a main.cpp. Whenever code is generated, you must delete the generated main.c, or building the code will fail.
- HAL drivers
- Directory is created after generating code from the configuration GUI. The contents of each file should never change after a project is created.
- Contains third-party tools, such as ST USB Device library. Folders may be generated or imported.
- ioc: Defines configuration GUI to generate code for the Core folder. This is where all settings for peripherals should be changed.
- cproject: Configuration file for all code-related settings. This consists of includes, source folders, compiler options, build configurations, and more.
The following corrections must be applied any time the source files are rebuilt due to a change in the .ioc
file.
When the sources are rebuilt, there is one issue created in the sources. Our project is a C++ project, but CubeMX generates only C sources. For this reason, the main.c
file must be deleted.
Ignore this section if software was installed using the Installing Software section above. This is useful information for creating new projects but unnecessary once the project is already created.
After all of the sources are configured correctly, the build system has to be configured. The source files have to be added to the include paths and the build path.
Begin by navigating to Project -> Properties
then once that dialog is open, go to C/C++ Build -> Settings -> Tool Settings -> MCU GCC Compiler
and select the Include Paths
tab and click on the file icon with a green plus on it. This action should open a pop-up box. Select the workspace
button in the dialog and include the Devices
and System
folders. If any additional directories are created, this process must be repeated.
The Devices
and System
directories must also be converted to source folders. In Project -> Properties
, go to C/C++ General -> Paths and Symbols
and click on the Sources
tab.
At this point, the project should be all set to build. Click on the hammer icon and the project should compile.