[Martin Hubáček] wrote in with his WS2812 LED library for the STM32F3 series processors. [Martin]’s library takes the same approach as [Paul Stoffregen]’s OctoWS2811 for the Teensy, and [Erich Styger]’s for the Freescale FRDM-K64F board. That is, it uses three DMA channels to get the signal out as fast as possible.
He has a good overview of the method that you can check out for details, but it goes something like this. The WS2812 uses a PWM-like encoding to transfer data. If the signal is high for 1/3 of the time, it’s a zero, and if it’s high for 2/3 of the time, it’s a one.
The first DMA signal sends the start of a bit, setting all outputs high. The second DMA channel sends out a low signal for all of the zeros, and the third DMA channel sends out a low signal for the ones. Each of these three DMAs are clocked at just the right times to make the pulse timing work out.
The advantage of this GPIO/DMA setup over other methods is that it can drive a whole bank of pins — up to 16 strips simultaneously for the STM32F10x chips. It also loops the graphic buffer around so that you can drive repeating patterns without using much memory. And all the CPU has to do is load up the DMA buffer when it’s (half) empty, which means that even with a full load of LEDs, it’s still got most of its time left for number crunching.
Finally, to show off, [Martin] pulled a sweet trick and captured it on video. Since the digital signals are on/off encoded for the red, green, and blue channels, he decided to experiment with digital color mixing. He
ors two simultaneous signals together and demonstrates that it works just as you’d expect. Check it out in the video below.