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 08:26:36 2016 +0000
Revision:
0:a27bf0451169
Child:
2:0d3906d69a41
This is an example of RGB LED WS2812. In main.cpp i have commented some line. these line is to calculate how many asm("NOP") do we need. because different CPU clock will make different sum of NOP

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