LUA: show protocol2 only on receivers with serial1_TX or PWM pins defined (#2999)
[ExpressLRS.git] / src / lib / LED / STM32F3_WS2812B_LED.h
blobf4a07a44973072e0c0b596fd23d1e484c0f65d0e
1 #include <stdint.h>
2 #include "targets.h"
4 #if (GPIO_PIN_LED_WS2812 != UNDEF_PIN) && (GPIO_PIN_LED_WS2812_FAST != UNDEF_PIN)
5 #define WS2812_LED_IS_USED 1
7 #ifndef BRIGHTNESS
8 #define BRIGHTNESS 10 // 1...256
9 #endif
11 static uint32_t current_rgb;
13 static inline void LEDsend_1(void) {
14 digitalWriteFast(GPIO_PIN_LED_WS2812_FAST, HIGH);
15 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
16 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
17 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
18 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
19 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
20 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
21 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
22 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
23 #if defined(STM32F1)
24 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
25 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
26 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
27 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
28 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
29 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
30 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
31 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
32 __NOP();
33 #endif
34 __NOP(); __NOP(); __NOP(); __NOP();
35 #if !defined(STM32F1)
36 __NOP();
37 #endif
38 digitalWriteFast(GPIO_PIN_LED_WS2812_FAST, LOW);
39 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
40 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
41 #if defined(STM32F1)
42 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
43 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
44 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
45 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
46 __NOP(); __NOP(); __NOP();
47 #endif
48 __NOP(); __NOP(); __NOP(); __NOP();
49 #if !defined(STM32F1)
50 __NOP(); __NOP(); __NOP(); __NOP();
51 #endif
54 static inline void LEDsend_0(void) {
55 digitalWriteFast(GPIO_PIN_LED_WS2812_FAST, HIGH);
56 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
57 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
58 #if defined(STM32F1)
59 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
60 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
61 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
62 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
63 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
64 #endif
65 __NOP(); __NOP(); __NOP(); __NOP();
66 #if !defined(STM32F1)
67 __NOP(); __NOP(); __NOP(); __NOP();
68 #endif
69 digitalWriteFast(GPIO_PIN_LED_WS2812_FAST, LOW);
70 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
71 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
72 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
73 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
74 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
75 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
76 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
77 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
78 #if defined(STM32F1)
79 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
80 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
81 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
82 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
83 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
84 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
85 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
86 __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
87 __NOP(); __NOP(); __NOP(); __NOP();
88 #endif
89 __NOP(); __NOP(); __NOP(); __NOP();
90 #if !defined(STM32F1)
91 __NOP();
92 #endif
95 void WS281Binit(void) // takes RGB data
97 pinMode(GPIO_PIN_LED_WS2812, OUTPUT);
100 void WS281BsetLED(uint32_t const RGB) // takes RGB data
102 /* Check if update is needed */
103 if (current_rgb == RGB)
104 return;
105 current_rgb = RGB;
107 // Convert to GRB
108 uint32_t GRB = (RGB & 0x0000FF00) << 8;
109 GRB |= (RGB & 0x00FF0000) >> 8;
110 GRB |= (RGB & 0x000000FF);
112 uint32_t bit = 1<<23;
113 while (bit)
115 noInterrupts();
116 (GRB & bit) ? LEDsend_1() : LEDsend_0();
117 interrupts();
118 bit >>= 1;
120 delayMicroseconds(50); // needed to latch in the values
123 #endif /* (GPIO_PIN_LED_WS2812 != UNDEF_PIN) && (GPIO_PIN_LED_WS2812_FAST != UNDEF_PIN) */