This is an example program of WS2812 library https://developer.mbed.org/users/devararendy/code/WS2812/ in main program, i also put some line to measure how many asm NOP do we need. I have test it on STM32F411RE (Nucleo 411RE). if you would like to use another microcontroller, you need to adjust the asm("nop") in the library.

Dependencies:   USBDevice WS2812 mbed-os

Committer:
devararendy
Date:
Sat Dec 10 09:21:00 2016 +0000
Revision:
2:0d3906d69a41
Parent:
0:a27bf0451169
added some explanation of using TIM to measure asm("NOP") execution time and an example of using sendColors for sending all colors in buffer to all LEDs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
devararendy 0:a27bf0451169 1 #include "mbed.h"
devararendy 0:a27bf0451169 2 #include "USBSerial.h"
devararendy 0:a27bf0451169 3 #include "WS2812.h"
devararendy 0:a27bf0451169 4
devararendy 0:a27bf0451169 5 #define LED_RGB PA_1
devararendy 0:a27bf0451169 6
devararendy 2:0d3906d69a41 7 WS2812 RGB(LED_RGB, 3);
devararendy 2:0d3906d69a41 8 uint32_t colors[3]={0xFF0000,0xFFfe00,0xFF00FF};
devararendy 2:0d3906d69a41 9 //DigitalOut test(PB_7);
devararendy 0:a27bf0451169 10
devararendy 2:0d3906d69a41 11 USBSerial serial; //Im using STM32F411RE. USB Serial USB Full Speed D+ = PA12, D- PA11. D+ Pulled Up w/ 1k5 resistor (1K ohm is working too)
devararendy 2:0d3906d69a41 12
devararendy 0:a27bf0451169 13 static TIM_HandleTypeDef s_TimerInstance = {
devararendy 0:a27bf0451169 14 .Instance = TIM2
devararendy 0:a27bf0451169 15 };
devararendy 0:a27bf0451169 16 void InitializeTimer()
devararendy 0:a27bf0451169 17 {
devararendy 0:a27bf0451169 18 __TIM2_CLK_ENABLE();
devararendy 0:a27bf0451169 19 s_TimerInstance.Init.Prescaler = 1;
devararendy 0:a27bf0451169 20 s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
devararendy 2:0d3906d69a41 21 s_TimerInstance.Init.Period = 45000000; //Timer clock = 45MHz
devararendy 0:a27bf0451169 22 s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
devararendy 0:a27bf0451169 23 s_TimerInstance.Init.RepetitionCounter = 0;
devararendy 0:a27bf0451169 24 HAL_TIM_Base_Init(&s_TimerInstance);
devararendy 0:a27bf0451169 25 HAL_TIM_Base_Start(&s_TimerInstance);
devararendy 0:a27bf0451169 26 }
devararendy 0:a27bf0451169 27 int main(void)
devararendy 0:a27bf0451169 28 {
devararendy 0:a27bf0451169 29 wait(3);
devararendy 0:a27bf0451169 30 InitializeTimer();
devararendy 0:a27bf0451169 31 serial.printf("Welcome to STM32FC RGB LED Tester\r\n");
devararendy 0:a27bf0451169 32 while(1)
devararendy 0:a27bf0451169 33 {
devararendy 0:a27bf0451169 34 /*
devararendy 2:0d3906d69a41 35 //to convert timer val to nanoSecond = val/45*1000
devararendy 2:0d3906d69a41 36 //example timer val for one asm("nop") is 3. convert to nanoSecond: 3/45*1000 = 66.666nS
devararendy 2:0d3906d69a41 37 unsigned int timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
devararendy 0:a27bf0451169 38 test = 1;
devararendy 0:a27bf0451169 39 asm("nop");
devararendy 0:a27bf0451169 40 asm("nop");
devararendy 0:a27bf0451169 41 asm("nop");
devararendy 0:a27bf0451169 42 asm("nop");
devararendy 0:a27bf0451169 43 asm("nop");
devararendy 0:a27bf0451169 44 asm("nop");
devararendy 0:a27bf0451169 45 asm("nop");
devararendy 0:a27bf0451169 46 timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue;
devararendy 0:a27bf0451169 47
devararendy 0:a27bf0451169 48 unsigned int timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
devararendy 0:a27bf0451169 49 test = 0;
devararendy 0:a27bf0451169 50 asm("nop");
devararendy 0:a27bf0451169 51 asm("nop");
devararendy 0:a27bf0451169 52 asm("nop");
devararendy 0:a27bf0451169 53 asm("nop");
devararendy 0:a27bf0451169 54 asm("nop");
devararendy 0:a27bf0451169 55
devararendy 0:a27bf0451169 56 asm("nop");
devararendy 0:a27bf0451169 57 asm("nop");
devararendy 0:a27bf0451169 58 asm("nop");
devararendy 0:a27bf0451169 59 asm("nop");
devararendy 0:a27bf0451169 60 asm("nop");
devararendy 0:a27bf0451169 61
devararendy 0:a27bf0451169 62 asm("nop");
devararendy 0:a27bf0451169 63 asm("nop");
devararendy 0:a27bf0451169 64 asm("nop");
devararendy 0:a27bf0451169 65 asm("nop");
devararendy 0:a27bf0451169 66 asm("nop");
devararendy 0:a27bf0451169 67
devararendy 0:a27bf0451169 68 asm("nop");
devararendy 0:a27bf0451169 69 asm("nop");
devararendy 0:a27bf0451169 70 asm("nop");
devararendy 0:a27bf0451169 71 asm("nop");
devararendy 0:a27bf0451169 72 asm("nop");
devararendy 0:a27bf0451169 73
devararendy 0:a27bf0451169 74 asm("nop");
devararendy 0:a27bf0451169 75 asm("nop");
devararendy 0:a27bf0451169 76 asm("nop");
devararendy 0:a27bf0451169 77 asm("nop");
devararendy 0:a27bf0451169 78 asm("nop");
devararendy 0:a27bf0451169 79
devararendy 0:a27bf0451169 80 asm("nop");
devararendy 0:a27bf0451169 81 asm("nop");
devararendy 0:a27bf0451169 82 asm("nop");
devararendy 0:a27bf0451169 83 asm("nop");
devararendy 0:a27bf0451169 84 asm("nop");
devararendy 0:a27bf0451169 85
devararendy 0:a27bf0451169 86 asm("nop");
devararendy 0:a27bf0451169 87 asm("nop");
devararendy 0:a27bf0451169 88 asm("nop");
devararendy 0:a27bf0451169 89 asm("nop");
devararendy 0:a27bf0451169 90 asm("nop");
devararendy 0:a27bf0451169 91
devararendy 0:a27bf0451169 92 asm("nop");
devararendy 0:a27bf0451169 93 asm("nop");
devararendy 0:a27bf0451169 94 asm("nop");
devararendy 0:a27bf0451169 95 asm("nop");
devararendy 0:a27bf0451169 96 asm("nop");
devararendy 0:a27bf0451169 97 asm("nop");
devararendy 0:a27bf0451169 98 asm("nop");
devararendy 0:a27bf0451169 99 asm("nop");
devararendy 0:a27bf0451169 100 asm("nop");
devararendy 0:a27bf0451169 101 asm("nop");
devararendy 0:a27bf0451169 102
devararendy 0:a27bf0451169 103 asm("nop");
devararendy 0:a27bf0451169 104 asm("nop");
devararendy 0:a27bf0451169 105 asm("nop");
devararendy 0:a27bf0451169 106 asm("nop");
devararendy 0:a27bf0451169 107 asm("nop");
devararendy 0:a27bf0451169 108
devararendy 0:a27bf0451169 109 asm("nop");
devararendy 0:a27bf0451169 110 asm("nop");
devararendy 0:a27bf0451169 111 asm("nop");
devararendy 0:a27bf0451169 112 timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue2;
devararendy 0:a27bf0451169 113
devararendy 0:a27bf0451169 114 serial.printf("Send 0 val %u, val2 = %u \r\n", timerValue, timerValue2);
devararendy 0:a27bf0451169 115 //////////////////////////////////////////////////////////////////////////
devararendy 0:a27bf0451169 116 timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
devararendy 0:a27bf0451169 117 test = 1;
devararendy 0:a27bf0451169 118 asm("nop");
devararendy 0:a27bf0451169 119 asm("nop");
devararendy 0:a27bf0451169 120 asm("nop");
devararendy 0:a27bf0451169 121 asm("nop");
devararendy 0:a27bf0451169 122 asm("nop");
devararendy 0:a27bf0451169 123
devararendy 0:a27bf0451169 124 asm("nop");
devararendy 0:a27bf0451169 125 asm("nop");
devararendy 0:a27bf0451169 126 asm("nop");
devararendy 0:a27bf0451169 127 asm("nop");
devararendy 0:a27bf0451169 128 asm("nop");
devararendy 0:a27bf0451169 129
devararendy 0:a27bf0451169 130 asm("nop");
devararendy 0:a27bf0451169 131 asm("nop");
devararendy 0:a27bf0451169 132 asm("nop");
devararendy 0:a27bf0451169 133 asm("nop");
devararendy 0:a27bf0451169 134 asm("nop");
devararendy 0:a27bf0451169 135
devararendy 0:a27bf0451169 136 asm("nop");
devararendy 0:a27bf0451169 137 asm("nop");
devararendy 0:a27bf0451169 138 asm("nop");
devararendy 0:a27bf0451169 139 asm("nop");
devararendy 0:a27bf0451169 140 asm("nop");
devararendy 0:a27bf0451169 141
devararendy 0:a27bf0451169 142 asm("nop");
devararendy 0:a27bf0451169 143 asm("nop");
devararendy 0:a27bf0451169 144 asm("nop");
devararendy 0:a27bf0451169 145 asm("nop");
devararendy 0:a27bf0451169 146 asm("nop");
devararendy 0:a27bf0451169 147
devararendy 0:a27bf0451169 148 asm("nop");
devararendy 0:a27bf0451169 149 asm("nop");
devararendy 0:a27bf0451169 150 asm("nop");
devararendy 0:a27bf0451169 151 asm("nop");
devararendy 0:a27bf0451169 152 asm("nop");
devararendy 0:a27bf0451169 153
devararendy 0:a27bf0451169 154 asm("nop");
devararendy 0:a27bf0451169 155 asm("nop");
devararendy 0:a27bf0451169 156 asm("nop");
devararendy 0:a27bf0451169 157 asm("nop");
devararendy 0:a27bf0451169 158 asm("nop");
devararendy 0:a27bf0451169 159
devararendy 0:a27bf0451169 160 asm("nop");
devararendy 0:a27bf0451169 161 asm("nop");
devararendy 0:a27bf0451169 162 asm("nop");
devararendy 0:a27bf0451169 163 asm("nop");
devararendy 0:a27bf0451169 164 asm("nop");
devararendy 0:a27bf0451169 165 timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue;
devararendy 0:a27bf0451169 166
devararendy 0:a27bf0451169 167 timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
devararendy 0:a27bf0451169 168 test = 0;
devararendy 0:a27bf0451169 169 asm("nop");
devararendy 0:a27bf0451169 170 asm("nop");
devararendy 0:a27bf0451169 171 asm("nop");
devararendy 0:a27bf0451169 172 asm("nop");
devararendy 0:a27bf0451169 173 asm("nop");
devararendy 0:a27bf0451169 174
devararendy 0:a27bf0451169 175 asm("nop");
devararendy 0:a27bf0451169 176 asm("nop");
devararendy 0:a27bf0451169 177 asm("nop");
devararendy 0:a27bf0451169 178 asm("nop");
devararendy 0:a27bf0451169 179 asm("nop");
devararendy 0:a27bf0451169 180
devararendy 0:a27bf0451169 181 asm("nop");
devararendy 0:a27bf0451169 182 asm("nop");
devararendy 0:a27bf0451169 183 asm("nop");
devararendy 0:a27bf0451169 184 asm("nop");
devararendy 0:a27bf0451169 185 asm("nop");
devararendy 0:a27bf0451169 186
devararendy 0:a27bf0451169 187 asm("nop");
devararendy 0:a27bf0451169 188 asm("nop");
devararendy 0:a27bf0451169 189 asm("nop");
devararendy 0:a27bf0451169 190 asm("nop");
devararendy 0:a27bf0451169 191 asm("nop");
devararendy 0:a27bf0451169 192
devararendy 0:a27bf0451169 193 asm("nop");
devararendy 0:a27bf0451169 194 asm("nop");
devararendy 0:a27bf0451169 195 asm("nop");
devararendy 0:a27bf0451169 196 asm("nop");
devararendy 0:a27bf0451169 197 asm("nop");
devararendy 0:a27bf0451169 198
devararendy 0:a27bf0451169 199 asm("nop");
devararendy 0:a27bf0451169 200 asm("nop");
devararendy 0:a27bf0451169 201 asm("nop");
devararendy 0:a27bf0451169 202 asm("nop");
devararendy 0:a27bf0451169 203 asm("nop");
devararendy 0:a27bf0451169 204
devararendy 0:a27bf0451169 205 asm("nop");
devararendy 0:a27bf0451169 206 asm("nop");
devararendy 0:a27bf0451169 207 asm("nop");
devararendy 0:a27bf0451169 208 asm("nop");
devararendy 0:a27bf0451169 209 asm("nop");
devararendy 0:a27bf0451169 210 timerValue2 = __HAL_TIM_GET_COUNTER(&s_TimerInstance) - timerValue2;
devararendy 0:a27bf0451169 211
devararendy 0:a27bf0451169 212 serial.printf("Send 1 val %u, val2 = %u \r\n", timerValue, timerValue2);
devararendy 0:a27bf0451169 213 */
devararendy 0:a27bf0451169 214 /*
devararendy 0:a27bf0451169 215 RGB.writeColor(0xffffff);
devararendy 0:a27bf0451169 216 RGB.sendReset();
devararendy 0:a27bf0451169 217 serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue);
devararendy 0:a27bf0451169 218 wait(2);
devararendy 0:a27bf0451169 219 RGB.writeColor(0xff00ff);
devararendy 0:a27bf0451169 220 RGB.sendReset();
devararendy 0:a27bf0451169 221 serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue);
devararendy 0:a27bf0451169 222 wait(2);
devararendy 0:a27bf0451169 223 RGB.writeColor(0xffff00);
devararendy 0:a27bf0451169 224 RGB.sendReset();
devararendy 0:a27bf0451169 225 serial.printf("R = 0x%X, G = 0x%X ,B = 0x%X\r\n", RGB.Red, RGB.Green, RGB.Blue);
devararendy 0:a27bf0451169 226 wait(2);
devararendy 0:a27bf0451169 227 */
devararendy 0:a27bf0451169 228
devararendy 2:0d3906d69a41 229 /*
devararendy 0:a27bf0451169 230 RGB.send1Color(0xFF0000);
devararendy 0:a27bf0451169 231 Thread::wait(1000);
devararendy 0:a27bf0451169 232 RGB.send1Color(0xFF00);
devararendy 0:a27bf0451169 233 Thread::wait(1000);
devararendy 0:a27bf0451169 234 RGB.send1Color(0xFF);
devararendy 0:a27bf0451169 235 Thread::wait(1000);
devararendy 0:a27bf0451169 236 RGB.send1Color(0xFFFF00);
devararendy 0:a27bf0451169 237 Thread::wait(1000);
devararendy 0:a27bf0451169 238 RGB.send1Color(0xFFFF);
devararendy 0:a27bf0451169 239 Thread::wait(1000);
devararendy 0:a27bf0451169 240 RGB.send1Color(0xFF00FF);
devararendy 0:a27bf0451169 241 Thread::wait(1000);
devararendy 0:a27bf0451169 242
devararendy 0:a27bf0451169 243 RGB.send1Color(0xff8000);
devararendy 0:a27bf0451169 244 Thread::wait(1000);
devararendy 0:a27bf0451169 245 RGB.send1Color(0x9933ff);
devararendy 0:a27bf0451169 246 Thread::wait(1000);
devararendy 0:a27bf0451169 247 RGB.send1Color(0xff3300);
devararendy 0:a27bf0451169 248 Thread::wait(1000);
devararendy 0:a27bf0451169 249 RGB.send1Color(0x99cc00);
devararendy 0:a27bf0451169 250 Thread::wait(1000);
devararendy 0:a27bf0451169 251 RGB.send1Color(0xff99ff);
devararendy 0:a27bf0451169 252 Thread::wait(1000);
devararendy 0:a27bf0451169 253 RGB.send1Color(0x009999);
devararendy 0:a27bf0451169 254 Thread::wait(1000);
devararendy 2:0d3906d69a41 255 */
devararendy 0:a27bf0451169 256
devararendy 2:0d3906d69a41 257 RGB.sendColors(colors);
devararendy 2:0d3906d69a41 258 wait(1);
devararendy 0:a27bf0451169 259 }
devararendy 0:a27bf0451169 260 }