This is the firmware dev section of the BMS project, as the hardware section states, the brain of the BMS is based on a STM32F407VGTx microcontroller unit.
It's mainly based on STM32Cube HAL (Hardware Abstraction Layer) and the CMSIS (Cortex Microcontroller Software Interface Standard).
To clone this repo run:
git clone --recursive -j8 https://github.com/moyamartin/bms_firmware.git
-
Core: Contains the firmware main source and header files related to the project's firmware
-
Test: Contains the unit tests related to different algorithms of the project, unit tests are NOT related to device drivers and so on. We would need to work on a hardware in the loop testing workbench for that.
-
Drivers: Contains the STM32Cube HAL, CMSIS software package and device drivers for the different peripherals of the main board
The firmware has to be able to accomplish the following goals:
- Estimate the state of charge of the battery using a Kalman Filter and an electrical model of a 18650PF (Under test).
- Device drivers for the peripherals of the BMS in order to get the following information:
- Discharge/charge current
- Cell voltage
- Unbalanced cell detector
- Finite-state machine for handling charge/discharge phases
- Communicate the current status of the battery pack via CAN bus or RS232 protocol
- Handle failure interruptions and trigger the load switch for protection
- Handle the battery charger indicators (WIP)
Before building and loading the firmware into the board, first you'll need to install the GNU ARM embedded toolchain and OpenOCD (On-Chip Debugger) or you can install the STM32CubeIDE and import it as this proyect is compatible with that development environment.
You will need a STLink/V2 in-circuit debugger/programmer in order to loadand debug the firmware on the board.
NOTE: if you have a STM32F4discovery board or another known board that has a STLink programmer with accessible pins you won't need to acquire an stand-alone programmer in order to load the firmware to the board, you only need to connect the SWDIO pins.
Open a terminal and run the following steps
1 - Go to the cloned repo's folder
cd root_path/bms_unr
2 - Run make
to build the firmware . This will create a build
folder containing the binaries of the
firmware (.bin
, .hex
and .elf
).
NOTE: to build the firmware without debug symbols modify the Makefile
and set
the DEBUG
variable to 0. (WIP, run make debug
or make prod
to avoid
changing this variable manually)
2- To load the firmware to the microcontroller run the following command
openocd -d0 -f board/stm32f4discovery.cfg -c "init;targets;halt;flash write_image erase bms_firmware.hex;shutdown"
3 - To debug the firmware you first have to run an openocd
server on a
terminal running (Make sure that you are building the project with debug symbols, otherwise you won't be able to see C code in GDB)
openocd -f board/stm32f4discovery.cfg
and on a separate terminal run
arm-none-eabi-gdb -f root_path/bms_firmare/build/bms_firmare.elf -x init.gdb
We are running some local test for specific algorithms using Cpputest. To run them first build and configure the framework running:
cd path_to_repo/Test/cpputest/cpputest_build && autoreconf .. -i && ../configure && make && mkdir ../lib && cp ./lib/* ../lib/
And them, to execute the tests run:
cd Test && make -B gcov
This will make a test coverage html file saying which tests passed or failed