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

Revision:
0:f080cb888db6
Child:
1:8910a1fcbdb0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WS2812.cpp	Sat Dec 10 08:18:58 2016 +0000
@@ -0,0 +1,250 @@
+#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();
+}
\ No newline at end of file