Перейти к содержанию

Пакетная передача DMA (burst)

Контроллер DMA в STM32F4 может по каждому запросу передать не одно слово, а целую пачку — 4, 8 или 16 обменов подряд, не отпуская шину. Так меньше накладных расходов на арбитраж, но появляются правила по выравниванию и границам адресов. Разбираем по справочному руководству RM0090.

Обновлено Редакция GAW

Пакетная передача DMA (burst) — режим, в котором контроллер DMA по одному запросу выполняет несколько обменов подряд и всё это время не отдаёт шину другим ведущим. В STM32F4 пакет состоит из 4, 8 или 16 обменов (INCR4, INCR8, INCR16).

Как настраивается

В регистре DMA_SxCR два поля: MBURST — для порта памяти, PBURST — для порта периферии. Размер пакета — число обменов, а не байтов: пакет INCR4 из слов — это 16 байт, из байтов — 4 байта. RM0090 подчёркивает, что обмены одного пакета неделимы: передачи AHB заблокированы, и арбитр матрицы шин не отбирает шину у DMA, пока пакет не закончится.

Пакеты возможны только через FIFO потока — у каждого потока STM32F4 свой FIFO на 4 слова с порогом. В прямом режиме (без FIFO) поток делает только одиночные передачи.

Правила

  1. Выравнивание. Адреса в DMA_SxPAR и DMA_SxM0AR выбирают так, чтобы все обмены пакета были выровнены на свой размер.
  2. Граница 1 КБ. Пакет не должен пересекать границу 1 КБ: это минимальное адресное пространство одного ведомого на AHB. Иначе — ошибка шины, которую регистры DMA не покажут.
  3. Кольцевой режим. В кольцевом режиме число элементов DMA_SxNDTR должно быть кратно размеру пакета с учётом соотношения размеров данных. Пример из RM0090: INCR8 по памяти, MSIZE — байт, PSIZE — полуслово, значит NDTR кратно 8 · ½ = 4.

Когда выгодно

Пакеты уменьшают число арбитражей: шина захватывается один раз на 4–16 обменов. Это ускоряет большие пересылки — память в память, вывод на дисплей через FSMC, приём с быстрого интерфейса. Обратная сторона — DMA дольше занимает шину, и процессор или второй DMA ждут. Связанный режим — двойной буфер. У более простого DMA STM32F1 (RM0008) пакетных передач и FIFO нет: каждый запрос — одна передача. Подробнее о семействе — на странице STM32F4.

Частые вопросы

Зачем нужен пакетный режим DMA, если одиночные передачи тоже работают?

Пакетный режим уменьшает число арбитражей шины: вместо 16 отдельных запросов DMA получает шину один раз и делает 16 обменов подряд. Это выгодно при больших потоках данных — например, при выводе на дисплей или копировании памяти. Цена — DMA дольше держит шину, и другие ведущие ждут дольше.

Почему пакетная передача DMA не работает в прямом режиме?

В прямом режиме у потока нет FIFO, и каждый запрос периферии сразу превращается в одну передачу. Чтобы собрать пакет, данные нужно где-то накопить, поэтому RM0090 указывает, что в прямом режиме биты MBURST и PBURST задаются аппаратно и поток делает только одиночные передачи.

Что будет, если пакет пересечёт границу 1 КБ?

Произойдёт ошибка шины AHB, и, как предупреждает RM0090, регистры DMA её не покажут. Минимальное адресное пространство одного ведомого на AHB — 1 КБ, и пакет не должен его покидать. Поэтому буферы для пакетных передач выравнивают так, чтобы пакеты не пересекали границы 1 КБ.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 (June 2024) — разд. 10.2: инкрементные пакеты по 4, 8 или 16 обменов; разд. 10.3.11: размер пакета задают независимо для двух портов AHB битами MBURST[1:0] и PBURST[1:0] в DMA_SxCR; размер пакета — число обменов (beats), а не байтов; обмены пакета неделимы — передачи AHB заблокированы, арбитр матрицы не отбирает шину у DMA до конца пакета; при одиночном режиме каждый запрос — один обмен размером PSIZE, при пакетном — 4, 8 или 16 обменов; в прямом режиме (без FIFO) возможны только одиночные передачи; адреса должны быть выровнены на размер пакета; пакет не должен пересекать границу 1 КБ, иначе возникнет ошибка AHB, которую регистры DMA не покажут; разд. 10.3.12: у каждого потока свой FIFO на 4 слова с программируемым порогом
  2. STMicroelectronics. RM0008 Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx, Rev 21 (February 2021) — разд. 13.2: возможности DMA STM32F1 — 12 каналов, приоритеты, независимые размеры источника и приёмника (упаковка эмулируется), адреса выровнены на размер данных, кольцевой буфер, три флага событий, память — память, до 65 536 элементов; пакетных передач и FIFO в этом списке нет

Нашли ошибку?