Simple neopixel (WS2812) library, tuned for stm32 (L432) at 80 MHz Should be compatible with any stm32, different clock speed may require timing adjustments in neopixel.c

Dependents:   Nucleo_neopixel_ovgu Nucleo_neopixel_ovgu1 Nucleo_neopixel_ovgu3

Fork of NeoPixel by Ondřej Hruška

neopixel.cpp

Committer:
Hinz
Date:
2017-12-11
Revision:
1:037882a8e193
Parent:
0:a81364d9a67b

File content as of revision 1:037882a8e193:

#include "mbed.h"
#include "neopixel.h"

NeoPixel::NeoPixel(PinName pin, int n) : DigitalOut(pin)
{
        _pixels = (Pixel*)malloc(n*sizeof(Pixel));
        memset(_pixels, 0, n*sizeof(Pixel)); 
        _npixels = n;
}

// The timing should be approximately 800ns/300ns, 300ns/800ns
void NeoPixel::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 < 6; j++) __nop();
            
            gpio_write(&gpio, 0);
            for(int j = 0; j < 2; j++) __nop();
        }
        else {
            // zero
            for(int j = 0; j < 2; j++) __nop();
            
            gpio_write(&gpio, 0);
            for(int j = 0; j < 5; j++) __nop();
        }

        byte = byte << 1; // shift to next bit
    }
    
}

void NeoPixel::show(void)
{
    // Disable interrupts in the critical section
    __disable_irq();
 
   for (int i = 0; i < _npixels; i++) {
        // Black magic to fix distorted timing
        #ifdef __HAL_FLASH_INSTRUCTION_CACHE_DISABLE
        __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
        #endif
        
        byte((_pixels+i)->g);
        byte((_pixels+i)->r);
        byte((_pixels+i)->b);
        
        #ifdef __HAL_FLASH_INSTRUCTION_CACHE_ENABLE
        __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
        #endif
    }

    __enable_irq();
    wait_us(50);    
}


void NeoPixel::setColor(int i, uint32_t color)
{
    if ((i>=0) && (i<_npixels))
        (_pixels+i)->hex = color;
}


void NeoPixel::clear(void)
{
    for (int i=0; i<_npixels; i++)
        (_pixels+i)->hex = 0;
}