[i] Начальные сведения о DMA

ID статьи: 48250
Дата последнего изменения: 10.12.2025 10:01:32

DMA (Direct Memory Access) - это специализированный контроллер, предназначенный для пересылки данных без использования ядра микроконтроллера. Данный контроллер применяется в большинстве микроконтроллеров компании "Миландр". Использование DMA позволяет не тратить процессорное время на отслеживание готовности данных в периферийных блоках и их последующую пересылку. Ядро инициализирует DMA и переходит к выполнению других задач, пока не возникнет прерывание от DMA, сигнализирующее о том, что заданное количество данных было передано.

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

Например, с помощью контроллера DMA можно передавать массив данных из регистра данных АЦП в массив в ОЗУ, не требуя от ядра отслеживания окончания преобразования АЦП (т.е. готовности данных). В отличие от простого непрерывного копирования, при считывании измерений с АЦП данные нужно читать только по событию их готовности, так как преобразование занимает время. Затем, когда DMA завершит передачу заданного количества данных (цикл DMA), будет сформировано прерывание (сигнализирующее о завершении работы канала), и ядро сможет обработать весь полученный от АЦП массив данных.

Другой пример - передача данных по событию от таймера из заранее сформированного массива в регистр данных ЦАП. Это позволяет с помощью DMA организовать равномерный вывод сигнала на ЦАП. Форма выходного сигнала в этом случае описывается массивом, который указывается в качестве источника данных для DMA. Размер массива задаётся параметром "количество передаваемых данных". По окончании передачи массива возникает прерывание от DMA, указывающее на завершение цикла DMA.

Содержание

1. Функциональные возможности
2. Структура контроллера DMA
3. Каналы DMA
    3.1. Структуры управляющих данных канала и таблица структур
        3.1.1. Структура управляющих данных
        3.1.2. Таблица структур управляющих данных
    3.2. Источники запросов
        3.2.1. Особенности работы запросов с выключенными каналами
    3.3. Арбитраж и приоритет каналов
4. Типы циклов DMA
    4.1. Режим "стоп" (недействительный режим)
    4.2. Основной режим
    4.3. Авто-запрос
    4.4. Пинг-понг
    4.5. Работа с памятью в режиме "исполнение с изменением конфигурации"
    4.6. Работа с периферией в режиме "исполнение с изменением конфигурации"

1. Функциональные возможности

Как и при любой пересылке данных, для запуска обмена с использованием DMA необходимо задать следующие параметры:

После передачи очередной порции данных адреса источника и приемника данных могут либо инкрементироваться, либо оставаться фиксированными.

Поддерживаются следующие типы передач:

Разрядности данных приемника и передатчика должны быть равны и могут быть:

2. Структура контроллера DMA

Контроллер DMA состоит из 3 функциональных блоков:

3. Каналы DMA

3.1. Структуры управляющих данных канала и таблица структур

Каждому каналу DMA соответствуют определенные настройки. Эти настройки хранятся в структуре управляющих данных, состоящих из 4-х 32-битных полей. Все структуры для всех каналов образуют таблицу. Для каждого канала существуют две структуры управляющих данных: первичная и опциональная альтернативная. Использование альтернативной структуры зависимости от программных настроек и выбранного режима работы.

3.1.1. Структура управляющих данных

Структура (как основная, так и альтернативная) состоят из следующих слов:

Параметры цикла DMA канала находятся в слове Control. Это слово изменяется в процессе работы канала, и по нему можно определить, сколько данных осталось передать и завершен ли цикл.

Слово Control содержит следующие поля:

При начале обработки канала (в начале цикла DMA или блока из 2R передач) контроллер DMA читает конечные адреса источника и приемника данных и управляющее слово Control/channel_cfg.

Контроллер DMA вычисляет адрес текущей передачи из конечного адреса по формуле:

Addr = data_end_ptr - (n_minus_1 << src_inc), где src_inc - инкремент данных источника

После выполнения 2R или N передач контроллер сохраняет обновленное значение channel_cfg в системную память.

3.1.2. Таблица структур управляющих данных


Рисунок 1 – Карта памяти для 32-х каналов, включая альтернативную структуру

Все структуры управляющих данных каналов расположены в условной таблице последовательно: сначала 32 основных структуры для каналов с 0 по 31, затем, при использовании, 32 альтернативные структуры для каналов с 0 по 31. Аппаратно реализована работа со всеми 32 каналами, поэтому "сжать" таблицу (например, разместить структуру для канала 5 по относительному адресу 0x00 вместо 0x50, если каналы 0-4 не используются в ПО) невозможно.

Базовый адрес таблицы должен быть кратен общему размеру структуры управляющих данных канала.

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

Контроллеру DMA необходимо указать начальный адрес таблицы структур. Для этого используются регистры:

Достаточно записать адрес в CTRL_BASE_PTR; значение в регистре ALT_CTRL_BASE_PTR установится аппаратно на основе значения CTRL_BASE_PTR.

3.2. Источники запросов

Периферийные блоки могут запрашивать блочные и одиночные передачи от каналов, используя внутренние сигналы dma_req[С] и dma_sreq[С]. С - номер канала, то есть каждый канал имеет отдельные сигналы от периферии. Передача одного значения называется одиночной передачей, а передача 2R_power данных - блочной передачей.

Обработку одиночных запросов от dma_sreq[C] можно отключать/включать с помощью регистров CHNL_USEBURST_SET / CHNL_USEBURST_CLR. При отключенной обработке одиночных запросов dma_sreq[C] будут обрабатываться только запросы dma_req[C].

В большинстве микроконтроллеров сигналы dma_req[С] и dma_sreq[С] от определенных периферийных контроллеров жестко привязаны к номерам каналов DMA. Но есть версии контроллера DMA с разделением на "реальные" и "виртуальные" каналы (вследствие большого количества источников запросов). Виртуальные каналы содержат только запросы от периферийных блоков и их может быть больше 32. Реальных каналов со структурами управляющих данных остается 32, и виртуальные каналы назначаются на реальные, тем самым подключая источники запросов от периферийных блоков к каналам контроллера DMA. Версию контроллера с виртуальными каналами можно определить по наличию регистров назначения номера виртуального канала на реальный (CHMUX[x]). Такой контроллер DMA есть в микросхемах К1986ВЕ8Т и К1986ВК01x.

3.2.1. Особенности работы запросов с выключенными каналами

Некоторые периферийные блоки могут выставить запросы к DMA сразу после включения микроконтроллера. Если канал DMA, к которому поступил запрос, выключен, то контроллер DMA оповестит ядро, установив запрос прерывания (см. правила осуществления DMA передач при "запрещенных" каналах в спецификации микросхем, правило №19). Сигнал dma_done[C] устанавливается в логическую "1" и фиксируется в этом состоянии. Таким образом DMA информирует о запросах от периферии на неактивные каналы. В большинстве микросхем сигналы dma_done[C] от всех каналов объединены в одни общий, поэтому идентифицировать какой-либо другой работающий канал. Если данный механизм оповещения не требуется, то его можно отключить. Для этого необходимо:

  1. Запретить обработку запросов по dma_req[C] и dma_sreq[C] во всех каналах DMA, кроме требуемых, установив соответствующие биты в регистре CHNL_REQ_MASK_SET;
  2. Разрешить работу всех каналов DMA, установив все биты в регистре CHNL_ENABLE_SET;
  3. Разрешить работу контроллера DMA путём установки бита master_enable в регистре DMA_CFG;
  4. Сбросить отложенное прерывание от DMA.

3.3. Арбитраж и приоритет каналов

Каналы DMA осуществляют пересылку данных последовательно. Одновременно передачи может осуществлять только один канал.

"Одновременное" исполнение нескольких задач (работа нескольких каналов) обеспечивается за счет арбитража активных каналов и попеременного осуществления передач каналами. В настройках каждого канала количество передач до арбитража задает параметр R_power. Количество передач до арбитража может быть задано меньшим, чем полный цикл обмена канала DMA. Значение этого параметра является степенью 2, т.е. возможны 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 и 1024 непрерывные передачи, которые не могут быть прерваны процедурой арбитража.

Например, необходимо передать 100 значений из массива в массив. Если установить R_power = 6, то контроллер DMA выполняет передачи активного канала до осуществления 64 (26) передач. Затем выполняется процедура арбитража:

Канал с номером 0 имеет наивысший приоритет по умолчанию. Приоритет снижается с увеличением номера канала. При выборе значения R_power необходимо учитывать, что слишком большое значение ускорит выполнение одного канала, но может ухудшить отзывчивость системы на запросы других каналов.

На рисунке 2 показана структурная схема работы каналов DMA с осуществлением арбитража.


Рисунок 2 – Структурная схема работы каналов DMA с осуществлением арбитража

Пояснения к рисунку 2:

4. Типы циклов DMA

В контроллере DMA реализованы следующие типы циклов:

4.1. Режим "стоп" (недействительный режим)

После окончания цикла DMA контроллер устанавливает тип цикла в недействительный режим для предотвращения повтора выполненного цикла DMA.

При поступлении запроса (программного или от периферийного блока) к выключенному каналу (канал выключается после завершения работы) контроллер DMA выставит запрос прерывания.

4.2. Основной режим

Контроллер работает только с основной или альтернативной (в зависимости от программных настроек) структурой управляющих данных канала. После разрешения работы канала и получения запроса цикл DMA выглядит следующим образом:

1) Контроллер выполняет 2R передач и обновляет число передач в цикле DMA в слове channel_cfg. Если число оставшихся передач равно 0, контроллер переходит к шагу 3, иначе - к шагу 2.

2) Осуществление арбитража:

3) Контроллер устанавливает dma_done[C] в состояние "1" на один такт сигнала hclk. Это указывает процессору на завершение цикла DMA. Режим работы в слове channel_cfg обновляется на "стоп".

Поскольку сигнал dma_done[C] (запрос прерывания) активен только один такт, прерывание в микроконтроллере должно быть сконфигурировано так, чтобы его не пропустить. Эта особенность важна для микросхем MDR1206(A)FI, MDR1215LGI — в контроллере прерываний CLIC прерывание от DMA следует настраивать по фронту, а не по уровню, во избежание пропусков.

4.3. Авто-запрос

Может использоваться для передачи большого количества данных по однократному запросу. Цикл DMA аналогичен основному режиму, за исключением того, что на этапе 2 контроллер автоматически формирует новый запрос на обработку для текущего канала, если он становится самым приоритетным в ходе арбитража. Это позволяет продолжить передачу без необходимости получения внешних запросов.

4.4. Пинг-понг

Контроллер выполняет циклы DMA как в основном режиме, но попеременно используя основную и альтернативную структуры (сначала одну, потом, после завершения с ней цикла, другую) до тех пор, пока не считает структуру с режимом "стоп", после чего запретит работу канала. После завершения цикла с каждой структурой контроллер выставляет dma_done[С] - по этому сигналу (по прерыванию) можно обновить режим работы и число передач в цикле DMA в отработавшей структуре, пока контроллер работает со второй структурой.


Рисунок 3 – Пример работы DMA в режиме "пинг-понг"

4.5. Работа с памятью в режиме "исполнение с изменением конфигурации"

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

Контроллер, получив начальный запрос на обработку, выполняет 4 передачи DMA, используя первичную структуру управляющих данных. Эти 4 передачи копируют новую задачу (структуру из 4 слов, аналогичную структуре канала) из памяти в альтернативную структуру управляющих данных. Затем осуществляется арбитраж, формируется авто-запрос, и контроллер начинает цикл DMA, используя уже альтернативную структуру (т.е. выполняет саму задачу). После завершения работы процесс повторяется: контроллер снова использует первичную структуру для копирования следующей задачи в альтернативную. Контроллер продолжает выполнять циклы DMA, меняя структуры управляющих данных, пока не произойдет одно из следующих условий:

После исполнения контроллером всех запланированных передач с использованием первичной структуры он делает эти управляющие данные "неправильными" путем установки cycle_ctrl в 3'b000.

Контроллер устанавливает флаг dma_done[C] в этом режиме только тогда, когда передача завершается с использованием основного цикла (после выполнения последней альтернативной задачи).


Рисунок 4 – Пример работы DMA с памятью в режиме "Исполнением с изменением конфигурации"

4.6. Работа с периферией в режиме "исполнение с изменением конфигурации"

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


Рисунок 5 – Пример работы DMA с периферией в режиме "Исполнением с изменением конфигурации"

Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55