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: WS281X.cpp
- Revision:
- 6:5aff0da4b663
- Parent:
- 5:8e6835a94e10
- Child:
- 8:0617f524d67d
diff -r 8e6835a94e10 -r 5aff0da4b663 WS281X.cpp
--- 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];