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

WS2812.cpp

Committer:
devararendy
Date:
2016-12-10
Revision:
1:8910a1fcbdb0
Parent:
0:f080cb888db6

File content as of revision 1:8910a1fcbdb0:

#include "WS2812.h"


WS2812::WS2812(PinName pin, int qty):dataOut(pin)
{
    dataPin = pin;
    LED_Qty = qty;
}
WS2812::~WS2812()
{
       
}
void WS2812::sendReset()
{
    dataOut = 0;
    wait_us(60);
}
void WS2812::writeColor(uint32_t RGB)
{
     Red = ((RGB&0xFF0000)>>16);
     Green = ((RGB&0xFF00)>>8);
     Blue = (RGB&0xFF);
    
    writeByte(Green);
    writeByte(Red);
    writeByte(Blue);
    
}
void WS2812::send0()
{
    dataOut = 1;
    //asm("nop");
//    asm("nop");
//    asm("nop");

//--------------hitung manual
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
    dataOut = 0;
    //asm("nop");
//    asm("nop");
//    asm("nop");
//    asm("nop");
//    asm("nop");
//    asm("nop");
//    
//    asm("nop");
//    asm("nop");
//    asm("nop");

//-----------------hitung manual
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
}
void WS2812::send1()
{
    dataOut = 1;
    //asm("nop");
//    asm("nop");
//    asm("nop");
//    asm("nop");
//    
//    asm("nop");
//    asm("nop");
//    asm("nop");
//-----------------------------------
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
    dataOut = 0;
   // asm("nop");
//    asm("nop");
//    asm("nop");
//    
//    asm("nop");
//    asm("nop");
//    asm("nop");
//-----------------hitung manual
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
            asm("nop");
}
void WS2812::writeByte(uint8_t data)
{
    for(int x=7;x>=0;x--)
    {
        if(data&(1<<x))
        {
            //bit is high
            send1();
        }
        else
        {
            //bit is low
            send0();
        }
    }
}
void WS2812::send1Color(uint32_t RGB)
{
    writeColor(RGB);
    sendReset();
}
void WS2812::sendColors(uint32_t * ColorBuffer)
{
    for(int x=0;x<LED_Qty;x++)
    {
        writeColor(*(&ColorBuffer[x]));
    }
    sendReset();
}