led/README.md
2026-03-30 21:42:05 +03:00

2.8 KiB
Raw Permalink Blame History

STM32 WS2812 LED Control (TIM2 Interrupt)

📘 Описание

Данный проект демонстрирует управление адресной светодиодной лентой WS2812 с использованием таймера TIM2 на микроконтроллере STM32F407VET6.

При каждом срабатывании таймера: - переключается GPIO (индикатор работы) - гасится вся лента - зажигается один светодиод - цвет выбирается циклически - создаётся эффект "бегущего огня"


⚙️ Основная функция

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);

        for (int i = 0; i < LED_COUNT; i++)
        {
            setLED(i, 0, 0, 0);
        }

        setLED(pos,
               colors[pos % COLOR_COUNT][0],
               colors[pos % COLOR_COUNT][1],
               colors[pos % COLOR_COUNT][2]);

        WS2812_Send();

        pos++;
        if (pos >= LED_COUNT)
            pos = 0;
    }
}

🧠 Логика работы

  1. Проверка таймера (TIM2)
  2. Переключение пина (индикация)
  3. Очистка всех светодиодов
  4. Установка одного активного светодиода
  5. Отправка данных в WS2812
  6. Смещение позиции

🎯 Результат

Создаётся визуальный эффект: - один "бегущий" светодиод - автоматическая смена цветов - плавное зацикливание


🧩 Используемое оборудование

  • Микроконтроллер: STM32F407VET6 (Cortex-M4, 168 MHz)
  • Светодиодная лента: WS2812
  • Таймер: TIM2
  • GPIO: GPIOE PIN 15

🖼️ Плата разработки

https://giteadocker2.fvds.ru/pavel/led/src/branch/main/jz%20f407vet6.png


🚀 Примечания

  • Убедитесь, что таймер TIM2 настроен и запущен с прерыванием
  • WS2812 требует точного тайминга --- обычно используется DMA + PWM
  • Частота обновления зависит от настроек таймера