Graphical driver interface. Displays vehicle telemetry and errors on an 800×480 capacitive touchscreen, logs to an SD card, and runs UI via LVGL under FreeRTOS. Largest board on the car by Flash and RAM.
| Part | Core | Flash | RAM | FreeRTOS | Optimization |
|---|---|---|---|---|---|
| STM32F469NIHx | Cortex-M4F | 2048 KB | 320 KB + 64 KB CCMRAM + 8 MB SDRAM | Yes (heap_4, 32 KB) | -Og Debug / -Os Release |
From DASH.ioc:
- LTDC + DSIHOST + DMA2D — MIPI-DSI display path to OTM8009A / NT35510 panel
- FMC — external SDRAM for framebuffer
- QUADSPI — external flash (fonts, UI assets)
- I2C1 — FT6x06 touchscreen controller (via
FEB_I2C_Mutex) - I2C2 — auxiliary I²C bus
- SDIO + FATFS — SD-card logging
- CAN2 — vehicle CAN (PB12 RX / PB13 TX)
- USART3, USART6 — debug + auxiliary
- SAI1 — audio
- CRC, TIM1, DMA, NVIC
From CMakeLists.txt:
feb_io— UART + Log + Console + Commands + Version + Time + String_Utilsfeb_rtos_utils—REQUIRE_RTOS_HANDLEfeb_version
CAN pack/unpack is compiled from common/FEB_CAN_Library_SN4/gen/ and the runtime dispatcher from common/FEB_CAN_Library/Src/ via file(GLOB); DASH does not link the feb_can INTERFACE target.
Bundled under Drivers/:
- LVGL (
Drivers/lvgl/) — UI toolkit - LVGL STM HAL layer (
Drivers/hal_stm_lvgl/) - BSP (
Drivers/BSP/STM32469I-Discovery/) — display, SDRAM, touchscreen driver glue - Components —
otm8009a,nt35510,ft6x06display/touch drivers - Fonts (
Drivers/Utilities/Fonts/)
No single FEB_Main.c. UI modules live in Core/User/Src/ and Core/User/Src/UI_Elements/, wired into FreeRTOS tasks:
displayTask— LVGL tick + renderbtnTxLoopTask— button / steering-wheel inputuartRxTask,uartTxTask— serial I/ODASHTaskRx,DASHTaskTx— CAN endpoints
Start up from CubeMX's main.c → MX_FREERTOS_Init() → task entry points.
./scripts/build.sh -b DASH
./scripts/flash.sh -b DASH- Tasks are dense.
displayTaskruns at priority 40 with 1 KB stack;btnTxLoopTaskat priority 41. Stack-overflow checking is on (configCHECK_FOR_STACK_OVERFLOW=2) — keep UI code off the stack. - SDRAM init order matters. FMC and DSIHOST must be brought up before LVGL can allocate its draw buffers. CubeMX handles the sequence in
MX_FMC_Init()/MX_DSIHOST_DSI_Init(); don't reorder. configUSE_IDLE_HOOK=1andconfigUSE_MALLOC_FAILED_HOOK=1— malloc failures halt immediately.- FATFS is enabled for SD-card logging via SDIO.
- Recursive mutexes are enabled (
configUSE_RECURSIVE_MUTEXES=1) for the I²C bus shared between touch and auxiliary sensors.
README.md— repo overviewcommon/README.md— library index