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:
- 0:f080cb888db6
- Child:
- 1:8910a1fcbdb0
File content as of revision 0:f080cb888db6:
#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(); }