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 08:18:58 2016 +0000
Revision:
0:f080cb888db6
Child:
1:8910a1fcbdb0
This is a bitbang library for RGB LED WS2812. it designed for Nucleo 411RE. if you want to use for another board, you have to edit the number of asm("nop").  see more detail about the delay time at https://cdn-shop.adafruit.com/datasheets/WS2812.pdf

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 0:f080cb888db6 250 }