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.
Revision 5:2c3b76ea0b40, committed 2015-06-13
- Comitter:
- Ned Konz
- Date:
- Sat Jun 13 00:18:32 2015 -0700
- Parent:
- 4:990838718b51
- Commit message:
- Worked out flapping and color animation
Changed in this revision
| WS2811.cpp | Show annotated file Show diff for this revision Revisions of this file |
| WS2811.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/WS2811.cpp Fri Jun 12 20:13:15 2015 -0700
+++ b/WS2811.cpp Sat Jun 13 00:18:32 2015 -0700
@@ -39,7 +39,8 @@
#define tpm_period NSEC_TO_TICKS(CLK_NSEC)
#define tpm_p0_period NSEC_TO_TICKS(250)
#define tpm_p1_period NSEC_TO_TICKS(650)
-#define guardtime_period USEC_TO_TICKS(55) /* guardtime minimum 50 usec. */
+#define guardtime_us 55
+#define guardtime_period USEC_TO_TICKS(guardtime_us) /* guardtime minimum 50 usec. */
enum DMA_MUX_SRC {
DMA_MUX_SRC_TPM0_CH_0 = 24,
@@ -58,10 +59,11 @@
template <unsigned MAX_LEDS_PER_STRIP>
void WS2811<MAX_LEDS_PER_STRIP>::wait_for_dma_done()
{
-#if 0
- while (dma_done < 3)
- wait_us(100);
-#endif
+ if ((DMA0->DMA[DMA_CHAN_1_LOW].DSR_BCR & DMA_DSR_BCR_BSY_MASK) == 0)
+ return;
+ while ((DMA0->DMA[DMA_CHAN_1_LOW].DSR_BCR & DMA_DSR_BCR_BSY_MASK))
+ __WFI();
+ wait_us(guardtime_us);
}
// class static
@@ -200,9 +202,6 @@
// set TPM0 channel 1 for 0.7 usec (±150nsec) (1 code)
// 1.25 usec * 2/3 = 833 nsec
tpm->CONTROLS[1].CnV = tpm_p1_period;
-
- NVIC_SetVector(TPM0_IRQn, (uint32_t)&TPM0_IRQHandler);
- NVIC_EnableIRQ(TPM0_IRQn);
}
// class static
@@ -212,7 +211,6 @@
if (!initialized) hw_init();
wait_for_dma_done();
- dma_done = 0;
DMA_Type volatile * dma = DMA0;
TPM_Type volatile *tpm = TPM0;
@@ -310,27 +308,7 @@
tpm->SC = TPM_SC_TOF_MASK; // reset TOF flag; disable internal clocking
- dma_done++;
-
SET_DEBUG;
-
-#if 0
- // set TPM0 to interrrupt after guardtime
- tpm->MOD = guardtime_period - 1; // 48MHz * 55 usec
- tpm->CNT = 0;
- tpm->SC = TPM_SC_PS(0) // 48MHz / 1 = 48MHz clock
- | TPM_SC_TOIE_MASK // enable interrupts
- | TPM_SC_CMOD(1); // and internal clocking
-#endif
-
-}
-
-extern "C" void TPM0_IRQHandler()
-{
- TPM0->SC = 0; // disable internal clocking
- TPM0->SC = TPM_SC_TOF_MASK;
- RESET_DEBUG;
- dma_done = 3;
}
#endif
--- a/WS2811.h Fri Jun 12 20:13:15 2015 -0700
+++ b/WS2811.h Sat Jun 13 00:18:32 2015 -0700
@@ -61,26 +61,27 @@
template <unsigned MAX_LEDS_PER_STRIP>
class WS2811 : public LedStrip
{
-public:
+public:
WS2811(unsigned n, unsigned pinNumber)
: LedStrip(n)
, pinMask(1U << pinNumber)
{
enabledPins |= pinMask;
- initialized = false;
+ initialized = false;
}
virtual void show()
{
uint16_t i, n = numPixels(); // 3 bytes per LED
uint8_t *p = pixels;
-
- for (i=0; i<n; i++ ) {
+
+ for (i=0; i<n; i++ )
+ {
writePixel(i, p);
p += 3;
}
}
-
+
virtual void begin()
{
blank();
@@ -90,7 +91,7 @@
virtual void blank()
{
std::memset(pixels, 0x00, numPixelBytes());
-
+
std::memset(dmaData.dmaWords, 0x00, sizeof(dmaData.dmaWords));
}
@@ -116,7 +117,8 @@
static void writeByte(uint8_t byte, uint32_t mask, uint32_t *dest)
{
- for (uint8_t bm = 0x80; bm; bm >>= 1) {
+ for (uint8_t bm = 0x80; bm; bm >>= 1)
+ {
// MSBit first
if (byte & bm)
*dest |= mask;
@@ -132,23 +134,24 @@
static void dma_init();
static void tpm_init();
static void dma_data_init();
-
+
friend void TPM0_IRQHandler();
-
- static const unsigned DMA_LEADING_ZEROS = 2;
- static const unsigned BITS_PER_RGB = 24;
+
+ static const unsigned DMA_LEADING_ZEROS = 2;
+ static const unsigned BITS_PER_RGB = 24;
static const unsigned DMA_TRAILING_ZEROS = 1;
- struct DMALayout {
+ struct DMALayout
+ {
uint32_t start_t1_low[ DMA_LEADING_ZEROS ];
uint32_t dmaWords[ BITS_PER_RGB * MAX_LEDS_PER_STRIP ];
uint32_t trailing_zeros_1[ DMA_TRAILING_ZEROS ];
-
+
uint32_t start_t0_high[ DMA_LEADING_ZEROS - 1 ];
uint32_t allOnes[ BITS_PER_RGB * MAX_LEDS_PER_STRIP ];
uint32_t trailing_zeros_2[ DMA_TRAILING_ZEROS + 1 ];
};
-
+
static DMALayout dmaData;
};
Generic WS2811/WS2812