This is a bitbang library for WS2812. I test it with STM32F411RE (Nucleo 441RE). If you want to use another board, u need to adjust the sum of asm("nop"). In the example program i put some code to measure how many asm("nop") do we need. See more detail about WS2812 timing https://cdn-shop.adafruit.com/datasheets/WS2812.pdf

Dependents:   STM32FC_RGB_WS2812

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WS2812.cpp Source File

WS2812.cpp

00001 #include "WS2812.h"
00002 
00003 
00004 WS2812::WS2812(PinName pin, int qty):dataOut(pin)
00005 {
00006     dataPin = pin;
00007     LED_Qty = qty;
00008 }
00009 WS2812::~WS2812()
00010 {
00011        
00012 }
00013 void WS2812::sendReset()
00014 {
00015     dataOut = 0;
00016     wait_us(60);
00017 }
00018 void WS2812::writeColor(uint32_t RGB)
00019 {
00020      Red = ((RGB&0xFF0000)>>16);
00021      Green = ((RGB&0xFF00)>>8);
00022      Blue = (RGB&0xFF);
00023     
00024     writeByte(Green);
00025     writeByte(Red);
00026     writeByte(Blue);
00027     
00028 }
00029 void WS2812::send0()
00030 {
00031     dataOut = 1;
00032     //asm("nop");
00033 //    asm("nop");
00034 //    asm("nop");
00035 
00036 //--------------hitung manual
00037             asm("nop");
00038             asm("nop");
00039             asm("nop");
00040             asm("nop");
00041             asm("nop");
00042             asm("nop");
00043             asm("nop");
00044     dataOut = 0;
00045     //asm("nop");
00046 //    asm("nop");
00047 //    asm("nop");
00048 //    asm("nop");
00049 //    asm("nop");
00050 //    asm("nop");
00051 //    
00052 //    asm("nop");
00053 //    asm("nop");
00054 //    asm("nop");
00055 
00056 //-----------------hitung manual
00057             asm("nop");
00058             asm("nop");
00059             asm("nop");
00060             asm("nop");
00061             asm("nop");
00062             
00063             asm("nop");
00064             asm("nop");
00065             asm("nop");
00066             asm("nop");
00067             asm("nop");
00068             
00069             asm("nop");
00070             asm("nop");
00071             asm("nop");
00072             asm("nop");
00073             asm("nop");
00074             
00075             asm("nop");
00076             asm("nop");
00077             asm("nop");
00078             asm("nop");
00079             asm("nop");
00080             
00081             asm("nop");
00082             asm("nop");
00083             asm("nop");
00084             asm("nop");
00085             asm("nop");
00086             
00087             asm("nop");
00088             asm("nop");
00089             asm("nop");
00090             asm("nop");
00091             asm("nop");
00092             
00093             asm("nop");
00094             asm("nop");
00095             asm("nop");
00096             asm("nop");
00097             asm("nop");
00098             
00099             asm("nop");
00100             asm("nop");
00101             asm("nop");
00102             asm("nop");
00103             asm("nop");
00104             asm("nop");
00105             asm("nop");
00106             asm("nop");
00107             asm("nop");
00108             asm("nop");
00109             
00110             asm("nop");
00111             asm("nop");
00112             asm("nop");
00113             asm("nop");
00114             asm("nop");
00115             
00116             asm("nop");
00117             asm("nop");
00118             asm("nop");
00119 }
00120 void WS2812::send1()
00121 {
00122     dataOut = 1;
00123     //asm("nop");
00124 //    asm("nop");
00125 //    asm("nop");
00126 //    asm("nop");
00127 //    
00128 //    asm("nop");
00129 //    asm("nop");
00130 //    asm("nop");
00131 //-----------------------------------
00132             asm("nop");
00133             asm("nop");
00134             asm("nop");
00135             asm("nop");
00136             asm("nop");
00137             
00138             asm("nop");
00139             asm("nop");
00140             asm("nop");
00141             asm("nop");
00142             asm("nop");
00143             
00144             asm("nop");
00145             asm("nop");
00146             asm("nop");
00147             asm("nop");
00148             asm("nop");
00149             
00150             asm("nop");
00151             asm("nop");
00152             asm("nop");
00153             asm("nop");
00154             asm("nop");
00155             
00156             asm("nop");
00157             asm("nop");
00158             asm("nop");
00159             asm("nop");
00160             asm("nop");
00161             
00162             asm("nop");
00163             asm("nop");
00164             asm("nop");
00165             asm("nop");
00166             asm("nop");
00167             
00168             asm("nop");
00169             asm("nop");
00170             asm("nop");
00171             asm("nop");
00172             asm("nop");
00173             
00174             asm("nop");
00175             asm("nop");
00176             asm("nop");
00177             asm("nop");
00178             asm("nop");
00179     dataOut = 0;
00180    // asm("nop");
00181 //    asm("nop");
00182 //    asm("nop");
00183 //    
00184 //    asm("nop");
00185 //    asm("nop");
00186 //    asm("nop");
00187 //-----------------hitung manual
00188             asm("nop");
00189             asm("nop");
00190             asm("nop");
00191             asm("nop");
00192             asm("nop");
00193             
00194             asm("nop");
00195             asm("nop");
00196             asm("nop");
00197             asm("nop");
00198             asm("nop");
00199             
00200             asm("nop");
00201             asm("nop");
00202             asm("nop");
00203             asm("nop");
00204             asm("nop");
00205             
00206             asm("nop");
00207             asm("nop");
00208             asm("nop");
00209             asm("nop");
00210             asm("nop");
00211             
00212             asm("nop");
00213             asm("nop");
00214             asm("nop");
00215             asm("nop");
00216             asm("nop");
00217             
00218             asm("nop");
00219             asm("nop");
00220             asm("nop");
00221             asm("nop");
00222             asm("nop");
00223             
00224             asm("nop");
00225             asm("nop");
00226             asm("nop");
00227             asm("nop");
00228             asm("nop");
00229 }
00230 void WS2812::writeByte(uint8_t data)
00231 {
00232     for(int x=7;x>=0;x--)
00233     {
00234         if(data&(1<<x))
00235         {
00236             //bit is high
00237             send1();
00238         }
00239         else
00240         {
00241             //bit is low
00242             send0();
00243         }
00244     }
00245 }
00246 void WS2812::send1Color(uint32_t RGB)
00247 {
00248     writeColor(RGB);
00249     sendReset();
00250 }
00251 void WS2812::sendColors(uint32_t * ColorBuffer)
00252 {
00253     for(int x=0;x<LED_Qty;x++)
00254     {
00255         writeColor(*(&ColorBuffer[x]));
00256     }
00257     sendReset();
00258 }