23 palSetPadMode(WS2812_PORT, WS2812_PIN, PAL_MODE_ALTERNATE(1));
25 static const PWMConfig ws2812_pwm_config = {
27 .period = WS2812_PWM_PERIOD,
30 [0] = {.mode = WS2812_TIM_CH == 0 ? PWM_OUTPUT_ACTIVE_HIGH : PWM_OUTPUT_DISABLED, .callback = NULL},
31 [1] = {.mode = WS2812_TIM_CH == 1 ? PWM_OUTPUT_ACTIVE_HIGH : PWM_OUTPUT_DISABLED, .callback = NULL},
32 [2] = {.mode = WS2812_TIM_CH == 2 ? PWM_OUTPUT_ACTIVE_HIGH : PWM_OUTPUT_DISABLED, .callback = NULL},
33 [3] = {.mode = WS2812_TIM_CH == 3 ? PWM_OUTPUT_ACTIVE_HIGH : PWM_OUTPUT_DISABLED, .callback = NULL},
40 const stm32_dma_stream_t *dma = dmaStreamAlloc(WS2812_DMA_STREAM, 10, NULL, NULL);
41 dmaStreamSetPeripheral(dma, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_TIM_CH]));
43 dmaStreamSetTransactionSize(dma, WS2812_BUFLEN);
46 STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) |
47 STM32_DMA_CR_DIR_M2P |
48 STM32_DMA_CR_PSIZE_WORD |
49 STM32_DMA_CR_MSIZE_WORD |
56 pwmStart(&
PWMD1, &ws2812_pwm_config);
57 pwmEnableChannel(&
PWMD1, WS2812_TIM_CH, 0);
134 for (uint32_t num = 0; num < WS2812_LED_N; num++)
139 led.
red = (uint8_t)(led.
red * brightness);
140 led.
green = (uint8_t)(led.
green * brightness);
141 led.
blue = (uint8_t)(led.
blue * brightness);
144 WS2812_TIM_BUF[pos++] = ((led.
green & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
145 WS2812_TIM_BUF[pos++] = ((led.
green & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
146 WS2812_TIM_BUF[pos++] = ((led.
green & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
147 WS2812_TIM_BUF[pos++] = ((led.
green & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
148 WS2812_TIM_BUF[pos++] = ((led.
green & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
149 WS2812_TIM_BUF[pos++] = ((led.
green & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
150 WS2812_TIM_BUF[pos++] = ((led.
green & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
151 WS2812_TIM_BUF[pos++] = ((led.
green & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
154 WS2812_TIM_BUF[pos++] = ((led.
red & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
155 WS2812_TIM_BUF[pos++] = ((led.
red & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
156 WS2812_TIM_BUF[pos++] = ((led.
red & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
157 WS2812_TIM_BUF[pos++] = ((led.
red & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
158 WS2812_TIM_BUF[pos++] = ((led.
red & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
159 WS2812_TIM_BUF[pos++] = ((led.
red & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
160 WS2812_TIM_BUF[pos++] = ((led.
red & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
161 WS2812_TIM_BUF[pos++] = ((led.
red & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
164 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
165 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
166 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
167 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
168 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
169 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
170 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
171 WS2812_TIM_BUF[pos++] = ((led.
blue & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;