Проблема з GPIO на високих частотах

Пробую тут запустити адресну світлодіодну стрічку на WS2812 (https://cdn-shop.adafruit.com/datasheets/WS2812.pdf).

Там дані передаються на стрічку як PWM на частоті 800кГц (1.25мкс на період).

Гуглиться купка статей на цю тему, де все ± просто робиться через таймер в PWM режимі з DMA.

Проблема виникає в тому, що на виході сигнал виходить … якийсь явно не той.

Наприклад, пробую передавати 0xFF. На осцилографі щось таке: image
Тобто, чомусь лише 5 періодів замість 8. При цьому кожен раз там щось інше: може бути 5, може 4, може 6, можуть бути довші імпульси, можуть бути коротші.

Думав, що криво налаштований таймер. Але якщо prescaler поставити в 100 замість 0, всі 8 імпульсів виглядають як треба:

Тобто, сигнал рветься саме на більш високих частотах.

Що встиг спробувати:

  • сіпати GPIO на процесорі, без таймера
  • ставити різні варіанти Maximum Output Speed на GPIO
  • використовувати різні таймери, різної розрядності, на різних GPIO
  • думав, може осцилограф глючить (він досить простий: Hantek6022BE), але на 2Мгц з Master Clock Output, наче, ± норм … лиш інколи спотворює якийсь імпульс.
  • перезапускав контроллер з відключеним дебагером
  • думав, що мож DMA не встигає … спробував зробити просто PWM з таймером.
    На 800кГц виглядає так (а мали б бути однакові імпульси десь в пів періода):

    На 8кГц так:

В архіві проект для Nucleo на F446RE з самим простим налаштуванням (що дає передостанній графік на PB6):

  • 180 МГц
  • TIM4 з prescaler 0, імпульсом в півперіода та ARR 113
  • PB6 з VeryHigh Maximum output speed
    F446re-ws2812.zip (963.4 KB)

Відчувається, що тут щось очевидне працює не так, адже по datasheet GPIO тут мали б видавати до 90МГц.

Буду вдячний за підказку.

1 Like

можна сказати, що розібрався сам …

  • були проблеми з тим, що на “осцилографі” я бачив не зовсім те, що є насправді
  • для DMA я виділив буфер в стеку, який потім успішно забився шлаком
  • чомусь треба було включити OutputComparePreload, хоча для роботи з DMA, це здавалося б і не обов’язково мало б бути
1 Like