TLIGHT_PRODUCTS / WS281X
Revision:
6:5aff0da4b663
Parent:
5:8e6835a94e10
Child:
8:0617f524d67d
--- a/WS281X.cpp	Fri Jul 29 04:22:53 2016 +0000
+++ b/WS281X.cpp	Mon Aug 01 08:16:52 2016 +0000
@@ -19,7 +19,9 @@
  */
 
 #include "WS281X.h"
+#if defined(TARGET_STM)
 #include "pinmap.h"
+#endif
 
 // TARGET_STM32F7
 // TARGET_DISCO_F746NG
@@ -59,31 +61,40 @@
 }
 
 #if defined(TARGET_STM)
+/**
+ * Configure pin pull-up/pull-down/OpenDrain
+ * typedef enum {
+ *     PullNone  = 0,
+ *     PullUp    = 1,
+ *     PullDown  = 2,
+ *     OpenDrain = 3,
+ *     PullDefault = PullNone
+ * } PinMode;
+ */
 void WS281X::pin_mode_ex(PinName pin, PinMode mode)
 {
+    int port_index = STM_PORT(pin);
+    int pin_index = STM_PIN(pin);
+    int offset = pin_index << 1;
+    GPIO_TypeDef * port_reg = ((GPIO_TypeDef *) (GPIOA_BASE + (port_index << 10)));
+
+    // Configure pull-up/pull-down resistors
+    uint32_t pupd = (uint32_t)mode & 3;
+    if (pupd > 2)
+        pupd = 0; // Open-drain = No pull-up/No pull-down
+
     if (mode == OpenDrain)
     {
-        int port_index = STM_PORT(pin);
-        int pin_index = STM_PIN(pin);
-        int offset = pin_index << 1;
-
-        GPIO_TypeDef * port_reg = ((GPIO_TypeDef *) (GPIOA_BASE + (port_index << 10)));
-//        if (mode == OpenDrain)
-        {
-            port_reg->PUPDR &= ~(0x3 << offset);
-            port_reg->OTYPER |= 1 << pin_index;
-        }
-    #if 0
-        else
-        {
-            port_reg->OTYPER &= ~(1 << pin_index);
-            port_reg->PUPDR &= ~(0x3 << offset);
-            port_reg->PUPDR |= mode_ << offset;
-        }
-    #endif
+        port_reg->PUPDR &= ~(0x3 << offset);    // Open-drain = No pull-up/No pull-down
+        port_reg->OTYPER |= 1 << pin_index;
     }
     else
-        pin_mode(pin, mode);
+    {
+        port_reg->OTYPER &= ~(1 << pin_index);
+//      pin_mode(pin, mode);
+        port_reg->PUPDR &= ~(0x3 << offset);
+        port_reg->PUPDR |= (mode & 0x03) << offset;
+    }
 }
 #endif
 
@@ -92,47 +103,13 @@
     _rgbOrder = rgbOrder;
     switch(_rgbOrder)
     {
-        case RGB:
-            _1st = 0;
-            _2nd = 1;
-            _3rd = 2;
-            break;
-
-        case RBG:
-            _1st = 0;
-            _2nd = 2;
-            _3rd = 1;
-            break;
-
-        case GRB:
-            _1st = 1;
-            _2nd = 0;
-            _3rd = 2;
-            break;
-
-        case GBR:
-            _1st = 2;
-            _2nd = 0;
-            _3rd = 1;
-            break;
-
-        case BRG:
-            _1st = 1;
-            _2nd = 2;
-            _3rd = 0;
-            break;
-
-        case BGR:
-            _1st = 2;
-            _2nd = 1;
-            _3rd = 0;
-            break;
-
-        default:
-            _1st = 0;
-            _2nd = 1;
-            _3rd = 2;
-            break;
+        case RGB:   _1st = 0; _2nd = 1; _3rd = 2; break;
+        case RBG:   _1st = 0; _2nd = 2; _3rd = 1; break;
+        case GRB:   _1st = 1; _2nd = 0; _3rd = 2; break;
+        case GBR:   _1st = 2; _2nd = 0; _3rd = 1; break;
+        case BRG:   _1st = 1; _2nd = 2; _3rd = 0; break;
+        case BGR:   _1st = 2; _2nd = 1; _3rd = 0; break;
+        default:    _1st = 0; _2nd = 1; _3rd = 2; break;
     }
 }
 
@@ -174,8 +151,25 @@
 #define DELAY_NEXT()    do{ _nop8(); }while(0)
 #endif
 
+#if defined(TARGET_NUCLEO_F446RE)
+// NUCLEO-F446RE (180MHz)
+#define USE_DELAYFUNC   1
+#define T0H             (18)
+#define T0L             (58-T0H)
+#define T1H             (40)
+#define T1L             (58-T1H)
+
+#define DELAY_T0H()     _delay(T0H)
+#define DELAY_T1H()     _delay(T1H-T0H)
+#define DELAY_TLOW()    _delay(T1L)
+#define DELAY_TLOW2()   //DELAY_TLOW()
+#define DELAY_SPACE()   _delay(T1L-2)
+#define DELAY_NEXT()    _delay(16)
+#endif
+
 #if defined(TARGET_NUCLEO_F746ZG)
 // NUCLEO-F746ZG (216MHz)
+#define USE_DELAYFUNC   1
 #define T0H             (35)
 #define T0L             (130-T0H)
 #define T1H             (75)
@@ -191,22 +185,23 @@
 
 #if defined(TARGET_DISCO_F746NG)
 // TARGET_DISCO_F746NG (216MHz)
+#define USE_DELAYFUNC   1
 #define T0H             (35)
-#define T0L             (110-T0H)
-#define T1H             (75)
-#define T1L             (110-T1H)
+#define T0L             (125-T0H)
+#define T1H             (90)
+#define T1L             (125-T1H)
 
 #define DELAY_T0H()     _delay(T0H)
 #define DELAY_T1H()     _delay(T1H-T0H)
 #define DELAY_TLOW()    _delay(T1L)
 #define DELAY_TLOW2()   //DELAY_TLOW()
-#define DELAY_SPACE()   _delay(T1L+5)
-#define DELAY_NEXT()    _delay(50)
+#define DELAY_SPACE()   _delay(T1L-5)
+#define DELAY_NEXT()    _delay(40)
 #endif
 
-#if defined(TARGET_STM32F7)
-inline __attribute__((always_inline))
-void WS281X::_delay(int value)
+#if defined(USE_DELAYFUNC) && (USE_DELAYFUNC != 0)
+static inline __attribute__((always_inline))
+void _delay(int value)
 {
     do { __nop(); } while (--value);
 }
@@ -217,6 +212,7 @@
 {
     do
     {
+#if 1
     // bit7
         *reg_set = mask[0];
         DELAY_T0H();
@@ -248,6 +244,7 @@
         DELAY_T1H();
         *reg_clr = mask[0];
         DELAY_TLOW();
+#endif
 
     // bit3
         *reg_set = mask[0];