DMA — прямой доступ к памяти
DMA — контроллер прямого доступа к памяти: он сам копирует данные между периферией и памятью, пока ядро занято другим. Так принимают поток байтов по UART, читают серию измерений АЦП или выводят изображение на дисплей без нагрузки на процессор.
Обновлено Редакция GAW
DMA (direct memory access, прямой доступ к памяти) — блок микроконтроллера, который пересылает данные между периферией и памятью или между двумя областями памяти без участия процессора. Ядро только настраивает передачу: откуда, куда, сколько элементов и какого размера. Дальше по каждому запросу периферии — «принят байт», «готов результат АЦП» — DMA сам переносит очередной элемент и уменьшает счётчик. По завершении он выставляет флаг и может вызвать прерывание.
DMA в STM32
| STM32F1 | STM32F4 | |
|---|---|---|
| Контроллеры | 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.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx–STM32F107xx — гл. 13 — DMA: 7 каналов DMA1, 5 каналов DMA2, арбитр, кольцевой режим, память–память, флаги HT, TC, TE
- 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
Нашли ошибку? ·
Смотрите также
- DMA STM32Каналы и потоки, запросы периферии, кольцо, двойной буфер, FIFO, флаги, примеры
- UART STM32BRR и OVER8, допуск по частоте, флаги, прерывания, DMA с IDLE, полудуплекс, RS-485
- АЦП STM32Группы каналов, режимы, триггеры, DMA, калибровка, датчик температуры, точность
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания
- Барьер памятиГраница, через которую нельзя переставлять обращения к памяти
- CCM RAM (память ядра)ОЗУ, подключённое к ядру напрямую, без доступа для DMA
- GDMA ESP32Общие каналы DMA для периферии ESP32-C3 и S3, списки дескрипторов
- Режим сканирования АЦПРежим АЦП STM32, в котором он сам обходит заданный список каналов
- Пакетная передача DMA (burst)Несколько обменов DMA подряд по одному запросу без отдачи шины другим ведущим
- Кольцевой режим DMAРежим DMA с автоматической перезагрузкой счётчика: буфер заполняется по кругу
- Двойной буфер DMAРежим DMA с двумя адресами памяти, которые меняются местами в конце каждой передачи
- Когерентность кэша (cache coherency)Согласование кэша ядра с памятью, в которую пишет DMA
- DMAMUX (мультиплексор запросов DMA)Мультиплексор, который подключает любой запрос периферии к любому каналу DMA
- MDMA (master DMA)Контроллер DMA STM32H7 на шине AXI с доступом к TCM и FIFO на 256 позиций
- BDMA (basic DMA)8-канальный DMA домена D3 STM32H7 для SRAM4 и периферии D3
- DMA2D (Chrom-ART Accelerator)DMA для заливки, копирования, преобразования формата и смешивания изображений