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
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 }
Generated on Tue Jul 19 2022 03:57:51 by
![doxygen](doxygen.png)