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

Committer:
devararendy
Date:
Sat Dec 10 09:18:10 2016 +0000
Revision:
1:8910a1fcbdb0
Parent:
0:f080cb888db6
added sendColors function, for sending color buffer to all LEDs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
devararendy 0:f080cb888db6 1 #include "WS2812.h"
devararendy 0:f080cb888db6 2
devararendy 0:f080cb888db6 3
devararendy 0:f080cb888db6 4 WS2812::WS2812(PinName pin, int qty):dataOut(pin)
devararendy 0:f080cb888db6 5 {
devararendy 0:f080cb888db6 6 dataPin = pin;
devararendy 0:f080cb888db6 7 LED_Qty = qty;
devararendy 0:f080cb888db6 8 }
devararendy 0:f080cb888db6 9 WS2812::~WS2812()
devararendy 0:f080cb888db6 10 {
devararendy 0:f080cb888db6 11
devararendy 0:f080cb888db6 12 }
devararendy 0:f080cb888db6 13 void WS2812::sendReset()
devararendy 0:f080cb888db6 14 {
devararendy 0:f080cb888db6 15 dataOut = 0;
devararendy 0:f080cb888db6 16 wait_us(60);
devararendy 0:f080cb888db6 17 }
devararendy 0:f080cb888db6 18 void WS2812::writeColor(uint32_t RGB)
devararendy 0:f080cb888db6 19 {
devararendy 0:f080cb888db6 20 Red = ((RGB&0xFF0000)>>16);
devararendy 0:f080cb888db6 21 Green = ((RGB&0xFF00)>>8);
devararendy 0:f080cb888db6 22 Blue = (RGB&0xFF);
devararendy 0:f080cb888db6 23
devararendy 0:f080cb888db6 24 writeByte(Green);
devararendy 0:f080cb888db6 25 writeByte(Red);
devararendy 0:f080cb888db6 26 writeByte(Blue);
devararendy 0:f080cb888db6 27
devararendy 0:f080cb888db6 28 }
devararendy 0:f080cb888db6 29 void WS2812::send0()
devararendy 0:f080cb888db6 30 {
devararendy 0:f080cb888db6 31 dataOut = 1;
devararendy 0:f080cb888db6 32 //asm("nop");
devararendy 0:f080cb888db6 33 // asm("nop");
devararendy 0:f080cb888db6 34 // asm("nop");
devararendy 0:f080cb888db6 35
devararendy 0:f080cb888db6 36 //--------------hitung manual
devararendy 0:f080cb888db6 37 asm("nop");
devararendy 0:f080cb888db6 38 asm("nop");
devararendy 0:f080cb888db6 39 asm("nop");
devararendy 0:f080cb888db6 40 asm("nop");
devararendy 0:f080cb888db6 41 asm("nop");
devararendy 0:f080cb888db6 42 asm("nop");
devararendy 0:f080cb888db6 43 asm("nop");
devararendy 0:f080cb888db6 44 dataOut = 0;
devararendy 0:f080cb888db6 45 //asm("nop");
devararendy 0:f080cb888db6 46 // asm("nop");
devararendy 0:f080cb888db6 47 // asm("nop");
devararendy 0:f080cb888db6 48 // asm("nop");
devararendy 0:f080cb888db6 49 // asm("nop");
devararendy 0:f080cb888db6 50 // asm("nop");
devararendy 0:f080cb888db6 51 //
devararendy 0:f080cb888db6 52 // asm("nop");
devararendy 0:f080cb888db6 53 // asm("nop");
devararendy 0:f080cb888db6 54 // asm("nop");
devararendy 0:f080cb888db6 55
devararendy 0:f080cb888db6 56 //-----------------hitung manual
devararendy 0:f080cb888db6 57 asm("nop");
devararendy 0:f080cb888db6 58 asm("nop");
devararendy 0:f080cb888db6 59 asm("nop");
devararendy 0:f080cb888db6 60 asm("nop");
devararendy 0:f080cb888db6 61 asm("nop");
devararendy 0:f080cb888db6 62
devararendy 0:f080cb888db6 63 asm("nop");
devararendy 0:f080cb888db6 64 asm("nop");
devararendy 0:f080cb888db6 65 asm("nop");
devararendy 0:f080cb888db6 66 asm("nop");
devararendy 0:f080cb888db6 67 asm("nop");
devararendy 0:f080cb888db6 68
devararendy 0:f080cb888db6 69 asm("nop");
devararendy 0:f080cb888db6 70 asm("nop");
devararendy 0:f080cb888db6 71 asm("nop");
devararendy 0:f080cb888db6 72 asm("nop");
devararendy 0:f080cb888db6 73 asm("nop");
devararendy 0:f080cb888db6 74
devararendy 0:f080cb888db6 75 asm("nop");
devararendy 0:f080cb888db6 76 asm("nop");
devararendy 0:f080cb888db6 77 asm("nop");
devararendy 0:f080cb888db6 78 asm("nop");
devararendy 0:f080cb888db6 79 asm("nop");
devararendy 0:f080cb888db6 80
devararendy 0:f080cb888db6 81 asm("nop");
devararendy 0:f080cb888db6 82 asm("nop");
devararendy 0:f080cb888db6 83 asm("nop");
devararendy 0:f080cb888db6 84 asm("nop");
devararendy 0:f080cb888db6 85 asm("nop");
devararendy 0:f080cb888db6 86
devararendy 0:f080cb888db6 87 asm("nop");
devararendy 0:f080cb888db6 88 asm("nop");
devararendy 0:f080cb888db6 89 asm("nop");
devararendy 0:f080cb888db6 90 asm("nop");
devararendy 0:f080cb888db6 91 asm("nop");
devararendy 0:f080cb888db6 92
devararendy 0:f080cb888db6 93 asm("nop");
devararendy 0:f080cb888db6 94 asm("nop");
devararendy 0:f080cb888db6 95 asm("nop");
devararendy 0:f080cb888db6 96 asm("nop");
devararendy 0:f080cb888db6 97 asm("nop");
devararendy 0:f080cb888db6 98
devararendy 0:f080cb888db6 99 asm("nop");
devararendy 0:f080cb888db6 100 asm("nop");
devararendy 0:f080cb888db6 101 asm("nop");
devararendy 0:f080cb888db6 102 asm("nop");
devararendy 0:f080cb888db6 103 asm("nop");
devararendy 0:f080cb888db6 104 asm("nop");
devararendy 0:f080cb888db6 105 asm("nop");
devararendy 0:f080cb888db6 106 asm("nop");
devararendy 0:f080cb888db6 107 asm("nop");
devararendy 0:f080cb888db6 108 asm("nop");
devararendy 0:f080cb888db6 109
devararendy 0:f080cb888db6 110 asm("nop");
devararendy 0:f080cb888db6 111 asm("nop");
devararendy 0:f080cb888db6 112 asm("nop");
devararendy 0:f080cb888db6 113 asm("nop");
devararendy 0:f080cb888db6 114 asm("nop");
devararendy 0:f080cb888db6 115
devararendy 0:f080cb888db6 116 asm("nop");
devararendy 0:f080cb888db6 117 asm("nop");
devararendy 0:f080cb888db6 118 asm("nop");
devararendy 0:f080cb888db6 119 }
devararendy 0:f080cb888db6 120 void WS2812::send1()
devararendy 0:f080cb888db6 121 {
devararendy 0:f080cb888db6 122 dataOut = 1;
devararendy 0:f080cb888db6 123 //asm("nop");
devararendy 0:f080cb888db6 124 // asm("nop");
devararendy 0:f080cb888db6 125 // asm("nop");
devararendy 0:f080cb888db6 126 // asm("nop");
devararendy 0:f080cb888db6 127 //
devararendy 0:f080cb888db6 128 // asm("nop");
devararendy 0:f080cb888db6 129 // asm("nop");
devararendy 0:f080cb888db6 130 // asm("nop");
devararendy 0:f080cb888db6 131 //-----------------------------------
devararendy 0:f080cb888db6 132 asm("nop");
devararendy 0:f080cb888db6 133 asm("nop");
devararendy 0:f080cb888db6 134 asm("nop");
devararendy 0:f080cb888db6 135 asm("nop");
devararendy 0:f080cb888db6 136 asm("nop");
devararendy 0:f080cb888db6 137
devararendy 0:f080cb888db6 138 asm("nop");
devararendy 0:f080cb888db6 139 asm("nop");
devararendy 0:f080cb888db6 140 asm("nop");
devararendy 0:f080cb888db6 141 asm("nop");
devararendy 0:f080cb888db6 142 asm("nop");
devararendy 0:f080cb888db6 143
devararendy 0:f080cb888db6 144 asm("nop");
devararendy 0:f080cb888db6 145 asm("nop");
devararendy 0:f080cb888db6 146 asm("nop");
devararendy 0:f080cb888db6 147 asm("nop");
devararendy 0:f080cb888db6 148 asm("nop");
devararendy 0:f080cb888db6 149
devararendy 0:f080cb888db6 150 asm("nop");
devararendy 0:f080cb888db6 151 asm("nop");
devararendy 0:f080cb888db6 152 asm("nop");
devararendy 0:f080cb888db6 153 asm("nop");
devararendy 0:f080cb888db6 154 asm("nop");
devararendy 0:f080cb888db6 155
devararendy 0:f080cb888db6 156 asm("nop");
devararendy 0:f080cb888db6 157 asm("nop");
devararendy 0:f080cb888db6 158 asm("nop");
devararendy 0:f080cb888db6 159 asm("nop");
devararendy 0:f080cb888db6 160 asm("nop");
devararendy 0:f080cb888db6 161
devararendy 0:f080cb888db6 162 asm("nop");
devararendy 0:f080cb888db6 163 asm("nop");
devararendy 0:f080cb888db6 164 asm("nop");
devararendy 0:f080cb888db6 165 asm("nop");
devararendy 0:f080cb888db6 166 asm("nop");
devararendy 0:f080cb888db6 167
devararendy 0:f080cb888db6 168 asm("nop");
devararendy 0:f080cb888db6 169 asm("nop");
devararendy 0:f080cb888db6 170 asm("nop");
devararendy 0:f080cb888db6 171 asm("nop");
devararendy 0:f080cb888db6 172 asm("nop");
devararendy 0:f080cb888db6 173
devararendy 0:f080cb888db6 174 asm("nop");
devararendy 0:f080cb888db6 175 asm("nop");
devararendy 0:f080cb888db6 176 asm("nop");
devararendy 0:f080cb888db6 177 asm("nop");
devararendy 0:f080cb888db6 178 asm("nop");
devararendy 0:f080cb888db6 179 dataOut = 0;
devararendy 0:f080cb888db6 180 // asm("nop");
devararendy 0:f080cb888db6 181 // asm("nop");
devararendy 0:f080cb888db6 182 // asm("nop");
devararendy 0:f080cb888db6 183 //
devararendy 0:f080cb888db6 184 // asm("nop");
devararendy 0:f080cb888db6 185 // asm("nop");
devararendy 0:f080cb888db6 186 // asm("nop");
devararendy 0:f080cb888db6 187 //-----------------hitung manual
devararendy 0:f080cb888db6 188 asm("nop");
devararendy 0:f080cb888db6 189 asm("nop");
devararendy 0:f080cb888db6 190 asm("nop");
devararendy 0:f080cb888db6 191 asm("nop");
devararendy 0:f080cb888db6 192 asm("nop");
devararendy 0:f080cb888db6 193
devararendy 0:f080cb888db6 194 asm("nop");
devararendy 0:f080cb888db6 195 asm("nop");
devararendy 0:f080cb888db6 196 asm("nop");
devararendy 0:f080cb888db6 197 asm("nop");
devararendy 0:f080cb888db6 198 asm("nop");
devararendy 0:f080cb888db6 199
devararendy 0:f080cb888db6 200 asm("nop");
devararendy 0:f080cb888db6 201 asm("nop");
devararendy 0:f080cb888db6 202 asm("nop");
devararendy 0:f080cb888db6 203 asm("nop");
devararendy 0:f080cb888db6 204 asm("nop");
devararendy 0:f080cb888db6 205
devararendy 0:f080cb888db6 206 asm("nop");
devararendy 0:f080cb888db6 207 asm("nop");
devararendy 0:f080cb888db6 208 asm("nop");
devararendy 0:f080cb888db6 209 asm("nop");
devararendy 0:f080cb888db6 210 asm("nop");
devararendy 0:f080cb888db6 211
devararendy 0:f080cb888db6 212 asm("nop");
devararendy 0:f080cb888db6 213 asm("nop");
devararendy 0:f080cb888db6 214 asm("nop");
devararendy 0:f080cb888db6 215 asm("nop");
devararendy 0:f080cb888db6 216 asm("nop");
devararendy 0:f080cb888db6 217
devararendy 0:f080cb888db6 218 asm("nop");
devararendy 0:f080cb888db6 219 asm("nop");
devararendy 0:f080cb888db6 220 asm("nop");
devararendy 0:f080cb888db6 221 asm("nop");
devararendy 0:f080cb888db6 222 asm("nop");
devararendy 0:f080cb888db6 223
devararendy 0:f080cb888db6 224 asm("nop");
devararendy 0:f080cb888db6 225 asm("nop");
devararendy 0:f080cb888db6 226 asm("nop");
devararendy 0:f080cb888db6 227 asm("nop");
devararendy 0:f080cb888db6 228 asm("nop");
devararendy 0:f080cb888db6 229 }
devararendy 0:f080cb888db6 230 void WS2812::writeByte(uint8_t data)
devararendy 0:f080cb888db6 231 {
devararendy 0:f080cb888db6 232 for(int x=7;x>=0;x--)
devararendy 0:f080cb888db6 233 {
devararendy 0:f080cb888db6 234 if(data&(1<<x))
devararendy 0:f080cb888db6 235 {
devararendy 0:f080cb888db6 236 //bit is high
devararendy 0:f080cb888db6 237 send1();
devararendy 0:f080cb888db6 238 }
devararendy 0:f080cb888db6 239 else
devararendy 0:f080cb888db6 240 {
devararendy 0:f080cb888db6 241 //bit is low
devararendy 0:f080cb888db6 242 send0();
devararendy 0:f080cb888db6 243 }
devararendy 0:f080cb888db6 244 }
devararendy 0:f080cb888db6 245 }
devararendy 0:f080cb888db6 246 void WS2812::send1Color(uint32_t RGB)
devararendy 0:f080cb888db6 247 {
devararendy 0:f080cb888db6 248 writeColor(RGB);
devararendy 0:f080cb888db6 249 sendReset();
devararendy 1:8910a1fcbdb0 250 }
devararendy 1:8910a1fcbdb0 251 void WS2812::sendColors(uint32_t * ColorBuffer)
devararendy 1:8910a1fcbdb0 252 {
devararendy 1:8910a1fcbdb0 253 for(int x=0;x<LED_Qty;x++)
devararendy 1:8910a1fcbdb0 254 {
devararendy 1:8910a1fcbdb0 255 writeColor(*(&ColorBuffer[x]));
devararendy 1:8910a1fcbdb0 256 }
devararendy 1:8910a1fcbdb0 257 sendReset();
devararendy 0:f080cb888db6 258 }