A faithful digital replica of the Braun BC03 analog clock, running on a Waveshare RP2350-Touch-LCD-2.8C round display in Embedded Swift.
| Component | Detail |
|---|---|
| Board | Waveshare RP2350-Touch-LCD-2.8C |
| MCU | RP2350B — dual ARM Cortex-M33 @ 240MHz |
| Display | 2.8" round IPS, 480×480, RGB parallel interface |
| Flash | 16MB |
| RTC | PCF85063 over I2C |
All three hands and all 12 numerals are pre-rendered on macOS using CoreGraphics and stored as sparse pixel arrays in flash. On the device, drawing a hand is a tight C loop writing ~1800 pixels — no runtime rendering math. This gives pixel-perfect CoreGraphics fidelity at embedded speeds.
The second hand has 600 pre-rendered positions (one per 1/10 second), combined with time_us_32() sub-second timing for smooth continuous sweep. Updates are synchronized to the display's DMA scanout to eliminate tearing.
See CLAUDE.md for the full architecture walkthrough.
brew install ninja arm-none-eabi-gcc
brew install --cask gcc-arm-embedded
brew install swiftly
swiftly install latest
git clone https://github.com/raspberrypi/pico-sdk pico-sdk --recurse-submodulesswift run SpriteGencd firmware && mkdir -p build && cd build
PICO_SDK_PATH=/path/to/pico-sdk \
cmake .. -G Ninja \
-DPICO_TOOLCHAIN_PATH=/Applications/ArmGNUToolchain/15.2.rel1/arm-none-eabi/bin \
-DCMAKE_Swift_COMPILER=~/.swiftly/bin/swiftc
PICO_SDK_PATH=/path/to/pico-sdk ninjaHold BOOTSEL while plugging in USB, then copy the UF2:
cp firmware/build/braun-clock.uf2 /Volumes/RP2350/swift run SetTimeRenders the clock face to PNG without any hardware:
swift run MacSimulator # outputs to ~/Desktop/clock-test/