OpenPane — Bare-Metal STM32 Platform with Custom RTOS
Work in progress — Phase 1 (RTOS core) underway. This page reflects the current state of the local codebase.

Overview
OpenPane is a bare-metal embedded platform built on the STM32F446RE (ARM Cortex-M4, 84 MHz) without any hardware abstraction layer. Every peripheral — clocks, GPIO, SysTick, USART — is configured through direct register writes using only CMSIS headers. The long-term goal is a self-updating IoT dashboard driving an e-ink display with live weather and sensor data over WiFi/MQTT.
Current State — Phase 1: Custom RTOS Core
- SysTick driver — 1 ms interrupt,
systick_delay_ms(), proven with LED blink at 500 ms - Task Control Blocks — TCB struct with stack pointer, state (READY / RUNNING / BLOCKED), priority, PID, and name
- Task stack initialization — pre-populates fake exception entry frames (xPSR, PC, LR, R0–R3) and zeroes R4–R11 for each task; 4 × 1 KB stacks mapped from top of SRAM downward
- Memory layout — 128 KB SRAM partitioned explicitly: scheduler stack, 4 task stacks, heap
- PendSV context switch — architecture laid out; register save/restore in progress
- Build system — hand-written Makefile, C++17, no exceptions/RTTI, automatic
compile_commands.jsonviabear
Roadmap
| Phase | Feature | Status |
|---|---|---|
| 1 | Custom RTOS — SysTick, TCB, context switch, round-robin scheduler | 🔄 In Progress |
| 2 | E-ink display driver via SPI-DMA | Planned |
| 3 | WiFi module integration | Planned |
| 4 | Weather & sensor data display | Planned |
| 5 | MQTT + backend pipeline | Planned |
| 6 | OTA firmware updates | Planned |
Technology Stack
- MCU: STM32F446RET6 — ARM Cortex-M4 with FPU, 84 MHz, 512 KB Flash, 128 KB SRAM
- Board: NUCLEO-F446RE with onboard ST-Link v2-1
- Language: C++17 (bare-metal, no HAL, no CubeMX)
- Tools: arm-none-eabi-gcc, OpenOCD, GDB, VS Code Cortex-Debug