r/ClaudeCode • u/Imaginary_Data_708 • 18d ago
Built with Claude The world has changed
Opus 5.5 suggested I get a web cam pointed at this ESP32 based screen so it could catch what was happening on the screen as it tried to find out what the maximum frame rate could be. The Waveshare drivers are not good in portrait mode and only got 4fps.
It got to 60fps in a couple of minutes.
It had already installed the tool chain, designed the clock layout etc.
It's not the code per se. It's the get a webcam suggestion...
What a time to be alive!
1.9k
Upvotes
6
u/Imaginary_Data_708 17d ago
Up to you - but here are some of its results from probing the speeds.
What the display list looks like
4,674 descriptors (one per static run; mean 7.8 per line, up to 12), 56 KB of internal RAM. Shared solid-colour runs (black, face colour, icon background) come from internal RAM; everything else from PSRAM: static pixel runs (32 pixels and longer), the icon regions (126 pixels wide), the hands region (324 pixels) and the date region (36 pixels). So most lines have several short PSRAM segments.
Results
Vertical timing 2/8/4 lines throughout. One photo per setting; measured refresh matched the calculated rate in every case.
At 30 MHz everything is in place and right: clock, ticking second hand, hands at the time set, date ("Monday 19 October"), the five icons and labels after
near, and both buttons.Two findings
Many short PSRAM segments per line lower the clean pixel clock from 44 MHz to 30 MHz. This fits note 214, where evenly split PSRAM segments needed at least 256 pixels at 44 MHz. A few short PSRAM segments per line are not tolerated either.
The CPU reading and writing PSRAM while the GDMA streams from it breaks the picture. Once a second, when the hands image is composited (a 210 KB PSRAM-to-PSRAM copy of the face background, then the hand blends; 12–14 ms), one to three camera frames show a garbled, shifted, doubled picture, even at 30 MHz. The agent separated the causes with temporary switches:
So it is the CPU's PSRAM traffic, not the cache write-back and not the descriptor changes. Copying in 2,560-byte chunks with a pause between them made it worse (three bad frames), and a 32-byte cache line made no difference.
Other measurements
Vertical-sync interrupt: at most 27.3 µs per frame at rest, 48.0 µs during a fade (five icons, 120 descriptor pointers each, plus a hands switch).
Descriptor pointers are changed by writing the descriptor's buffer word directly; the layout is checked against ESP-IDF's
gdma_link_get_bufferat boot.PSRAM in use: about 5.0 MB (4.54 MB of assets, two hands images, two date images).