Raspberry: как работает ШИМ через DMA?

Я читал, что драйвер для «Software PWM» каким-то образом работает на PWM-HW и получает доступ ко всем GPIO без использования ЦП. Может кто-нибудь объяснить, как это работает? Есть ли в Raspberry Pi второй процессор, используемый для модуля PWM и PCM (есть ли схема блоков)?

Вопрос связан с отличным драйвером, который я часто использовал в своих роботах. .

Вот объяснение, которого я, к сожалению, не понимаю...

Драйвер работает, настраивая связанный список блоков управления DMA, причем последний из них связан с первым, поэтому после инициализации контроллер DMA непрерывно циклически повторяет цикл, и драйверу не нужно вмешиваться, за исключением случаев, когда необходимо изменить ширину импульса. . На данный период существует два блока управления прямым доступом к памяти; первый передает одно слово в регистр очистки вывода GPIO, а второй передает некоторое количество слов в PWM FIFO для генерации требуемого времени ширины импульса. Кроме того, с этими блоками управления перемежается один для каждого сконфигурированного сервопривода, который используется для установки выходного сигнала.

Хотя драйвер использует периферийное устройство PWM, он использует его только для передачи DMA, чтобы генерировать точные задержки».

Верно ли следующее понимание:

Контроллер DMA похож на второй процессор. Вы можете запустить код на нем. Таким образом, он используется здесь для управления всеми состояниями высокого/низкого уровня всех выводов Raspberry GPIO вместе с блоком PWM. Контроллер DMA делает это постоянно. Вероятно, в Raspberry имеется более одного DMA-контроллера, поэтому на скорость ОС Linux не сильно влияет отсутствие одного DMA-контроллера.

Я не понимаю, как именно DMA и PWM работают вместе.


person Jonny    schedule 19.05.2018    source источник


Ответы (1)


Я рекомендую читать исходный код RPIO вместе с ServoBlaster, поскольку он немного упрощен и может помочь в понимании. Также очень важно: руководство Broadcom BCM2835, содержащее все мелкие детали.

есть схема блоков?

Руководство содержит все функции, предлагаемые чипом (хотя, насколько я видел, не в виде блок-схемы).

Верно ли следующее понимание:

Контроллер DMA является частью основного чипа (Broadcom, хотя я думаю, что то же самое происходит и в настольных процессорах). Он не может точно запускать код, но может самостоятельно копировать память между периферийными устройствами, не потребляя время основного процессора. Контроллер прямого доступа к памяти имеет разные каналы, которые могут независимо копировать память и работать независимо от процессора.

Его можно настроить с помощью "блоков управления" ( Руководство BCM, стр. 40, 4.2.1.1): вы можете указать контроллеру DMA сначала скопировать память из A в B, затем из C в D и так далее.

не понимаю, как именно DMA и PWM работают вместе

DMA используется для отправки данных в PWM («Широко-импульсный модулятор», руководство BCM, стр. 138, глава 9), который потребляет данные и создает очень точную задержку. Интересно, что ШИМ-контроллер... используется не для генерации ШИМ-импульсов, а просто для ожидания.

Может кто-нибудь объяснить, как это работает?

В конечном счете, вы настраиваете значение контактов GPIO (или настройки генератора PWM или PCM) с помощью установка памяти по специальному адресу; память в этой области представляет периферийный configuration (руководство BCM, стр. 89, глава 6) .

Итак, идея такова: копировать 1 в память, которая управляет значением контакта GPIO, используя контроллер DMA; дождитесь ширины импульса; скопируйте 0 в значение вывода GPIO; подождите оставшуюся часть периода; петля. Поскольку это делает контроллер прямого доступа к памяти, он не потребляет циклы процессора.

Ключевым моментом здесь является возможность заставить DMA-контроллер «ждать» точное количество времени, и для этого RPIO и ServoBlaster используют ШИМ-контроллер в режиме FIFO (подобный функционал есть и у генератора PCM, но давайте придерживаться ШИМ) . Это означает, что ШИМ-контроллер будет «отправлять» считанные им данные из своей так называемой очереди FIFO, а затем останавливаться. Неважно, как оно «отправлено» (руководство BCM, стр. 139, 9.4 MSENi=0), ключевым моментом является то, что оно требует фиксированного количества времени. На самом деле, даже не важно, какой данные отправляются: контроллер DMA настроен на запись в очередь FIFO, а затем ждет, пока контроллер PWM закончит отправку данных, и это создает очень точную задержку.

Разрешение результирующего импульса определяется длительностью передачи ШИМ, которая зависит от частоты, на которой работает ШИМ-контроллер.

Пример

У нас есть максимальное разрешение 1 мс (задается задержкой ШИМ), и мы хотим иметь импульс с рабочим циклом 25% с частотой 125 Гц. Таким образом, период импульса составляет 8 мс. Выполненная операция DMA будет

  1. Установите вывод на 1 (DMA записывает в память GPIO)
  2. Подождите 1 мс (DMA записывает в PWM FIFO)
  3. Подождите 1 мс (DMA записывает в PWM FIFO)
  4. Установите вывод на 0 (DMA записывает в память GPIO)
  5. Подождите 1 мс (DMA записывает в PWM FIFO)
  6. ...повторите "Подождите 1 мс" еще 4 раза.
  7. Подождите 1 мс (DMA записывает в PWM FIFO) и вернитесь к 1.

Таким образом, потребуется как минимум 10 блоков управления DMA (8 инструкций ожидания, заданных периодом/задержкой, плюс 2 операции записи).

Примечание: в ServoBlaster и RPIO он потребляет ровно 16 блоков управления DMA, потому что (для большей точности) они всегда выполняют операцию "копирования памяти" перед "операцией ожидания". Операция «копирования памяти» — это всего лишь фиктивная операция, если только ей не нужно изменить значение вывода.

person Pietro Saccardi    schedule 28.10.2018