remove DMA from ws2812
This commit is contained in:
parent
f22ffd6816
commit
2328012e48
1 changed files with 9 additions and 19 deletions
|
|
@ -11,11 +11,9 @@
|
|||
#include "boards/pico_boards.h"
|
||||
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/dma.h"
|
||||
|
||||
static PIO pio = pio0;
|
||||
static int sm = 0;
|
||||
static int dma_ch = 1;
|
||||
static PIO pio = pio0;
|
||||
static int sm = 0;
|
||||
|
||||
static int ws2812_init(void) {
|
||||
sm = pio_manager_get_empty_sm(pio);
|
||||
|
|
@ -32,15 +30,6 @@ static int ws2812_init(void) {
|
|||
|
||||
ws2812_program_init(pio, sm, offset, RGB_DI_PIN, 800000, false);
|
||||
|
||||
dma_channel_config conf = dma_channel_get_default_config(dma_ch);
|
||||
|
||||
channel_config_set_read_increment(&conf, true);
|
||||
channel_config_set_write_increment(&conf, false);
|
||||
channel_config_set_transfer_data_size(&conf, DMA_SIZE_32);
|
||||
channel_config_set_dreq(&conf, pio_get_dreq(pio, sm, true));
|
||||
|
||||
dma_channel_set_config(dma_ch, &conf, false);
|
||||
dma_channel_set_write_addr(dma_ch, &pio->txf[sm], false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -54,13 +43,14 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t leddata[RGBLED_NUM];
|
||||
__interrupt_disable__();
|
||||
|
||||
for (int i = 0; i < number_of_leds; i++) {
|
||||
leddata[i] = (((uint32_t)ledarray[i].g) << 24) |
|
||||
(((uint32_t)ledarray[i].r) << 16) |
|
||||
((uint32_t)ledarray[i].b << 8);
|
||||
pio_sm_put_blocking(pio, sm,
|
||||
(((uint32_t)ledarray[i].r) << 16) |
|
||||
(((uint32_t)ledarray[i].g) << 24) |
|
||||
((uint32_t)ledarray[i].b << 8));
|
||||
}
|
||||
|
||||
dma_channel_transfer_from_buffer_now(dma_ch, leddata, number_of_leds);
|
||||
dma_channel_wait_for_finish_blocking(dma_ch);
|
||||
__interrupt_enable__(NULL);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue