OpenPane — Bare-Metal STM32 Platform with Custom RTOS

View on GitHub

Work in progress — Phase 1 (RTOS core) underway. This page reflects the current state of the local codebase.

OpenPane e-ink dashboard target

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.json via bear

Roadmap

PhaseFeatureStatus
1Custom RTOS — SysTick, TCB, context switch, round-robin scheduler🔄 In Progress
2E-ink display driver via SPI-DMAPlanned
3WiFi module integrationPlanned
4Weather & sensor data displayPlanned
5MQTT + backend pipelinePlanned
6OTA firmware updatesPlanned

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