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, калибровка, датчик температуры, точность
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания