Files
RingClock/Core/Src/ws2812_drv.c
2026-03-25 19:06:44 +01:00

73 lines
1.3 KiB
C

/*
* ws2812.c
*
* Created on: Mar 25, 2026
* Author: ewars
*/
#include <ws2812_drv.h>
#include "stm32f1xx_hal.h"
extern htim2;
static void set_byte(uint32_t pos, uint8_t value);
uint8_t pwm_reset[RESET_LEN] = {0};
uint8_t pwm_full = 90;
uint8_t ledStripBuffer[RESET_LEN + LED_N * 24 + 1] = {0};
void ws2812_Init(void){
for(uint32_t i = 0; i < LED_N * 24; i++){
ledStripBuffer[RESET_LEN + i] = PWM_ONE;
}
ledStripBuffer[RESET_LEN + LED_N * 24] = pwm_full;
ws2812_update();
}
void ws2812_update(void){
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, ledStripBuffer, sizeof(ledStripBuffer));
}
void ws2812_set_colour(uint8_t led, uint8_t red, uint8_t green, uint8_t blue){
if(led < LED_N){
set_byte(RESET_LEN + 24 * led, green);
set_byte(RESET_LEN + 24 * led + 8, red);
set_byte(RESET_LEN + 24 * led + 16, blue);
}
}
void ws2812_reset(void){
for(uint8_t i = 0; i < LED_N; i++){
ws2812_set_colour(i, 0, 0, 0);
}
}
static void set_byte(uint32_t pos, uint8_t value)
{
int i;
for (i = 0; i < 8; i++) {
if (value & 0x80) {
ledStripBuffer[pos + i] = PWM_ONE;
} else {
ledStripBuffer[pos + i] = PWM_ZERO;
}
value <<= 1;
}
}
void ws2812_wait(void){
while(HAL_TIM_GetChannelState(&htim2, TIM_CHANNEL_1)){}
}