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

DMA — прямой доступ к памяти

DMA — контроллер прямого доступа к памяти: он сам копирует данные между периферией и памятью, пока ядро занято другим. Так принимают поток байтов по UART, читают серию измерений АЦП или выводят изображение на дисплей без нагрузки на процессор.

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

DMA (direct memory access, прямой доступ к памяти) — блок микроконтроллера, который пересылает данные между периферией и памятью или между двумя областями памяти без участия процессора. Ядро только настраивает передачу: откуда, куда, сколько элементов и какого размера. Дальше по каждому запросу периферии — «принят байт», «готов результат АЦП» — DMA сам переносит очередной элемент и уменьшает счётчик. По завершении он выставляет флаг и может вызвать прерывание.

DMA в STM32

STM32F1STM32F4
КонтроллерыDMA1 — 7 каналов, у старших линеек DMA2 — 5 каналовDMA1 и DMA2 по 8 потоков
Запросы перифериизакреплены за каналамиу потока выбор из 8 запросов
Память — памятьестьтолько DMA2
FIFO и двойной буфернетесть

Счётчик передач — до 65 535 элементов. Флаги: половина передачи (HT), конец (TC), ошибка (TE). Каналы, потоки, таблицы запросов и примеры на регистрах разобраны в статье DMA в STM32.

Типичные применения

  • Приём UART в кольцевой буфер с обработкой по прерыванию простоя линии — подробнее в статье об UART в STM32.
  • Серия измерений АЦП по нескольким каналам в массив без участия ядра — в статье об АЦП STM32.
  • Вывод на дисплей и обмен по SPI большими блоками.

DMA делит шину с процессором, поэтому интенсивная пересылка может немного замедлять код, обращающийся к той же памяти.

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

Зачем нужен DMA, если есть прерывания?

Прерывание на каждый байт отнимает у ядра время на вход и выход из обработчика, и на высокой скорости обмена это становится заметной нагрузкой. DMA пересылает весь блок сам и вызывает прерывание только на половине и в конце передачи. Ядро в это время выполняет другую работу или спит.

Что такое кольцевой режим DMA?

Режим, в котором после последней передачи счётчик автоматически перезагружается и DMA начинает заполнять буфер сначала. Так непрерывно принимают данные UART или АЦП в кольцевой буфер: флаг половины передачи сообщает, что первую половину можно обрабатывать, флаг конца — вторую.

Может ли DMA STM32 работать с любой памятью?

Не с любой. У STM32F4 память CCM RAM доступна только процессору, и DMA до неё не достаёт; пересылку память — память умеет только DMA2. У STM32F1 запросы периферии жёстко закреплены за каналами DMA, у STM32F4 у потока выбирается один из восьми запросов. Таблицы запросов есть в руководствах RM0008 и RM0090.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx–STM32F107xx — гл. 13 — DMA: 7 каналов DMA1, 5 каналов DMA2, арбитр, кольцевой режим, память–память, флаги HT, TC, TE
  2. STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — гл. 10 — DMA: по 8 потоков у DMA1 и DMA2, выбор канала, FIFO, пакеты, двойной буфер; память–память только у DMA2; CCM RAM недоступна для DMA

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