Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: neopixel.cpp
- Revision:
- 0:ca84ed7518f5
- Child:
- 5:68617f409aaf
- Child:
- 6:a7894e6982ea
diff -r 000000000000 -r ca84ed7518f5 neopixel.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/neopixel.cpp Thu Jan 02 09:30:06 2020 +0000
@@ -0,0 +1,104 @@
+#include "mbed.h"
+#include "neopixel.h"
+
+const int wait_time[4][2] = {
+ {6,14},
+ {2, 5},
+ {2, 6},
+ {5,11}
+};
+
+NeoPixelOut::NeoPixelOut(PinName pin) : DigitalOut(pin)
+{
+ normalize = false;
+ global_scale = 1.0f;
+ #ifdef __STM32L432xx_H
+ boad_ = 0;
+ #endif
+ #ifdef __STM32F446xx_H
+ boad_ = 1;
+ #endif
+}
+
+// The timing should be approximately 800ns/300ns, 300ns/800ns
+void NeoPixelOut::byte(register uint32_t byte)
+{
+ for (int i = 0; i < 8; i++) {
+ gpio_write(&gpio, 1);
+
+ // duty cycle determines bit value
+ if (byte & 0x80) {
+ // one
+ for(int j = 0; j < wait_time[0][boad_]; j++) asm("NOP");//6 14
+
+ gpio_write(&gpio, 0);
+ for(int j = 0; j < wait_time[1][boad_]; j++) asm("NOP");//2 5
+ }
+ else {
+ // zero
+ for(int j = 0; j < wait_time[2][boad_]; j++) asm("NOP");//2 6
+
+ gpio_write(&gpio, 0);
+ for(int j = 0; j < wait_time[3][boad_]; j++) asm("NOP");//5 11
+ }
+
+ byte = byte << 1; // shift to next bit
+ }
+
+}
+
+void NeoPixelOut::send(Pixel *colors, uint32_t count, bool flipwait)
+{
+ // Disable interrupts in the critical section
+ __disable_irq();
+
+ Pixel* rgb;
+ float fr,fg,fb;
+ for (int i = 0; i < count; i++) {
+ rgb = colors++;
+ fr = (int)rgb->r;
+ fg = (int)rgb->g;
+ fb = (int)rgb->b;
+
+ if (normalize) {
+ float scale = 255.0f/(fr+fg+fb);
+ fr *= scale;
+ fg *= scale;
+ fb *= scale;
+ }
+
+ fr *= global_scale;
+ fg *= global_scale;
+ fb *= global_scale;
+
+ if (fr > 255) fr = 255;
+ if (fg > 255) fg = 255;
+ if (fb > 255) fb = 255;
+ if (fr < 0) fr = 0;
+ if (fg < 0) fg = 0;
+ if (fb < 0) fb = 0;
+
+ // Black magic to fix distorted timing
+ #ifdef __HAL_FLASH_INSTRUCTION_CACHE_DISABLE
+ __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
+ #endif
+
+ byte((int)fg);
+ byte((int)fr);
+ byte((int)fb);
+
+ #ifdef __HAL_FLASH_INSTRUCTION_CACHE_ENABLE
+ __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
+ #endif
+ }
+
+ __enable_irq();
+
+ if (flipwait) flip();
+}
+
+
+void NeoPixelOut::flip(void)
+{
+ wait_us(50);
+}