DMA (Direct Memory Access) — технология прямого доступа к памяти. Эта технология позволяет быстро и без использования центрального процессора пересылать данные из одной области памяти в другую. При этом для такой пересылки вместо ЦП используется свой специальный контроллер, который называется контроллером DMA.
Контроллер DMA работает независимо от ЦП и параллельно с ним. Таким образом использование DMA позволяет экономить ресурсы ЦП, который во время операций пересылки данных с помощью DMA может заниматься какими-то другими полезными делами.
Несмотря на то, что ЦП и DMA работают независимо друг от друга, DMA может приостанавливать доступ ЦП к системной шине на несколько тактов в случаях когда они оба пытаются обратиться к одним и тем же адресам памяти.
В микроконтроллеры stm32 может быть встроено до 2-х контроллеров DMA — DMA1 и DMA2. Они имеют следующие особенности:
- 12 независимо конфигурируемых каналов: 7 для DMA1 и 5 для DMA2
- Возможность использования в качестве источника или приёмника данных Flash, SRAM и периферийных модулей, подключенных к шинам APB1, APB2 и AHB
- Аппаратный запрос от каждого периферийного модуля подключен к одному из 12 каналов
- Возможность генерации программного запроса по каждому каналу
- Приоритеты между запросами от разных каналов одного контроллера DMA настраиваются программно и могут иметь 4 уровня: very high, high, medium, low. В случае, если для двух каналов установлен одинаковый приоритет, более приоритетным считается канал с меньшим номером
- Независимая установка размера порции данных для источника и приёмника (байт, 16-битное полуслово или 32-битное слово)
- Поддержка кольцевого буфера (когда данные пишутся в буфер по кругу)
- Возможности передачи данных из памяти в память, из памяти в периферию, из периферии в память или из периферии в периферию
- 3 флага событий (Half Transfer, Transfer Complete и Transfer Error) логически объединённых в один запрос прерывания для каждого канала
- Программируемое количество передаваемых данных (количество порций) — до 65535 (то есть если данные передавать 32-битными словами, то максимум можно передать 65535*4 = 262140 байт, — почти 256 кбайт)
Карта запросов модуля DMA1:
Direct Memory Access — DMA — Simplified Explanation
Карта запросов модуля DMA2:
Как вообще работает DMA? Всё происходит следующим образом:
- В периферийном модуле происходит событие, по которому через определённый для этого периферийного модуля канал генерируется запрос к DMA (генерация запроса к DMA должна быть разрешена в настройках самого периферийного модуля)
- Контроллер DMA обрабатывает пришедший запрос в соответствии с настройками и установленным приоритетом канала, через который пришёл запрос
- Как только контроллер DMA получает доступ к периферии (выполняет передачу одной единицы информации) — он посылает сгенерировавшему запрос периферийному модулю сигнал подтверждения
- При получении сигнала подтверждения периферийный модуль снимает свой запрос
- Как только периферийный модуль снимает свой запрос — DMA контроллер отменяет сигнал подтверждения
- Если есть ещё запросы от периферии — начинает обрабатываться следующий запрос (опять же в соответствии с установленным приоритетом)
Сама передача данных состоит из трех шагов:
Как создать DLNA подключение на телевизоре. Домашнее облако из смартфона, ПК и NAS-сервера
- Загрузка данных из регистра периферии или из памяти по адресу, записанному во внутреннем регистре текущего адреса источника (этот регистр программно недоступен). Начальный адрес, используемый для первой передачи, прописывается в регистр DMA_CPARx или в регистр DMA_CMARx (в зависимости от направления передачи)
- Сохранение загруженных данных в регистре периферии или в памяти по адресу, указанному во внутреннем регистре текущего адреса приёмника (этот регистр программно недоступен). Начальный адрес, используемый для первой передачи, прописывается в регистр DMA_CPARx или в регистр DMA_CMARx (в зависимости от направления передачи)
- уменьшение значения регистра-счётчика DMA_CNDTRx, который содержит количество оставшихся транзакций
В зависимости от настроек, после каждой транзакции модуль DMA может автоматически инкрементировать адреса источника и/или приёмника. Эта возможность настраивается для источника и приёмника независимо друг от друга установкой/сбросом битов PINC и MINC в регистре DMA_CCRx. Причём, в зависимости от установленных для источника и приёмника размеров порции данных адрес автоматически инкрементируется на 1, 2 или 4.
Если канал сконфигурированв нормальном режиме, то после обнуления счётчика транзакций новые запросы к DMA обслуживаться не будут. Чтобы включить обслуживание новых запросов — нужно сначала программно взвести счётчик (записать в регистр DMA_CNDTRx новое значение). Сделать это можно только предварительно выключив соответствующий канал DMA (при выключении канала его настройки не сбрасываются).
В кольцевом режиме (circular mode) значение счётчика автоматически устанавливается к начальному значению после выполнения последней запланированной транзакции (то есть после достижения нуля). Одновременно с этим адреса внутренних регистров текущих адресов сбрасываются к начальным адресам, прописанным в регистрах DMA_CPARx, DMA_CMARx. Кольцевой режим можно включить/выключить установкой/сбросом бита CIRC регистра DMA_CCRx.
Режим пересылки данных из памяти в память выбирается установкой бита MEM2MEM в регистре DMA_CCRx. В этом режиме контроллер DMA начинает выполнять передачу данных сразу после включения канала установкой бита EN регистра DMA_CCRx, то есть не дожидаясь внешнего аппаратного запроса. Не знаю зачем этому режиму дали такое название, я бы лучше назвал его режимом без внешнего триггера, поскольку фактически в этом режиме вы можете как и раньше пересылать данные не только из памяти в память, но и из памяти в регистры периферии, и из регистров периферии в память, и из регистров в регистры, просто теперь каждая транзакция запускается не по событию от периферии, а автоматически, пока не обнулится счётчик (или вообще бесконечно, если для канала выбран кольцевой режим).
DMA_ISR — регистр статуса прерываний. Биты этого регистра содержат флаги событий для каждого канала. Они доступны только для чтения, а сбрасываются записью 1 в соответствующий бит регистра DMA_IFCR.
- GIFx: глобальный флаг прерывания для канала x (x=1..7). Устанавливается в 1 аппаратно в случае возникновения одного из прерываний TE, HT или TC. Сбрасывается программно, записью единицы в соответствующий бит регистра DMA_IFCR.
- TCIFx: флаг окончания передачи. Устанавливается в 1 аппаратно после обнуления счётчика передаваемых данных. Сбрасывается программно, записью единицы в соответствующий бит регистра DMA_IFCR.
- HTIFx: флаг окончания передачи половины данных. Устанавливается в 1 аппаратно после отправки половины запланированных данных (когда счётчик уменьшается наполовину). Сбрасывается программно, записью единицы в соответствующий бит регистра DMA_IFCR.
- TEIFx: флаг ошибки передачи. Устанавливается в 1 аппаратно при возникновении ошибок передачи (при попытках работы с физически нереализованными или зарезервированными адресами памяти). Сбрасывается программно, записью единицы в соответствующий бит регистра DMA_IFCR.
DMA_IFCR — регистр сброса флагов статуса прерываний. Установка битов этого регистра приводит к сбросу флагов прерываний в регистре DMA_ISR. Биты регистра DMA_IFCR доступны только для записи.
- CGIFx: установка этого бита в 1 приводит к сбросу флагов GIFx, TCIFx, HTIFx и TEIFx (x=1..7 — номер канала) в регистре DMA_ISR
- CTCIFx: установка этого бита в 1 приводит к сбросу флага TCIFx (x=1..7 — номер канала) в регистре DMA_ISR
- CHTIFx: установка этого бита в 1 приводит к сбросу флага HTIFx (x=1..7 — номер канала) в регистре DMA_ISR
- CTEIFx: установка этого бита в 1 приводит к сбросу флага TEIFx (x=1..7 — номер канала) в регистре DMA_ISR.
DMA_CCRx — регистры настройки каналов (x=1..7 — номер канала).
- EN: включение/выключение канала
- TCIE: разрешение(1)/запрет(0) прерывания по событию TC (переданы все данные, счётчик обнулился)
- HTIE: разрешение(1)/запрет(0) прерывания по событию HT (передана половина данных, счётчик уменьшился наполовину)
- TEIE: разрешение прерывания по событию TE (ошибка передачи)
- DIR: направление передачи данных. 0 — читать из периферии (и писать в память), 1 — читать из памяти (и писать в периферию)
- CIRC: включение/выключение циклического режима передачи (1 — circular mode, 0 — normal mode)
- PINC: включает(1)/выключает(0) инкрементирование адреса периферии после каждой транзакции
- MINC: включает(1)/выключает(0) инкрементирование адреса памяти после каждой транзакции
- PSIZE[1:0]: определение размера единицы данных для периферии. Может принимать следующие значения:
- 00: 8 бит
- 01: 16 бит
- 10: 32 бита
- 11: зарезервировано
- 00: 8 бит
- 01: 16 бит
- 10: 32 бита
- 11: зарезервировано
- 00: Low (низкий)
- 01: Medium (средний)
- 10: High (высокий)
- 11: Very high (очень высокий)
DMA_CNDTRx — регистры-счётчики (x=1..7 — номер канала). В младшие 16 бит этих регистров прописывается количество данных для передачи (то есть сколько транзакций нужно выполнить с соответствующим каналом). Каждый из этих регистров обладает следующими особенностями:
- Значение в регистр можно прописать только когда соответствующий канал выключен
- После включения канала регистр становится недоступен для записи
- Значение в регистре автоматически декрементируется после каждой транзакции
- После того, как значение регистра станет равным нулю — новые запросы к DMA от соответствующего канала перестают обслуживаться
- Если для соответствующего канала установлен циклический режим передачи, то после обнуления регистра в него автоматически загружается начальное значение
DMA_CPARx — регистры адреса (x=1..7 — номер канала). Здесь содержатся начальные адреса регистров периферии в которую или из которой нужно передавать данные по запросу от соответствующего канала. Доступ автоматически выравнивается на границу полуслова или слова, в зависимости от установленного для периферии размера порции данных (достигается игнорированием одного или двух младших бит регистра адреса). Регистры не могут быть перезаписаны пока соответствующий канал включен.
DMA_CMARx — регистры адреса (x=1..7 — номер канала). Здесь содержатся начальные адреса областей памяти в которую или из которой нужно передавать данные по запросу от соответствующего канала. Доступ автоматически выравнивается на границу полуслова или слова, в зависимости от установленного для памяти размера порции данных (достигается игнорированием одного или двух младших бит регистра адреса). Регистры не могут быть перезаписаны пока соответствующий канал включен.
Для модуля DMA2 существуют точно такие же регистры, только x в них может принимать значения 1..5, а не 1..7 (поскольку в DMA2, в отличии от DMA1, всего 5 каналов, а не 7).
Работать с DMA достаточно просто. Всё, что от Вас требуется — это настроить соответствующий канал и далее только обрабатывать события (которых как мы помним для канала всего 3) или прерывания от них, а также, возможно, взводить счётчик передаваемых данных.
Как обрабатывать события и прерывания — решать только Вам, а вот порядок настройки канала приведён ниже:
- Установить в регистре DMA_CPARx (x — номер канала) начальный адрес регистра периферии в которую/из которой будут передаваться данные
- Установить в регистре DMA_CMARx (x — номер канала) начальный адрес области памяти в которую/из которой будут передаваться данные
- Прописать в регистре DMA_CRDTRx (x — номер канала) количество передаваемых данных (количество транзакций)
- Установить в регистре DMA_CCRx (x — номер канала) приоритет настраиваемого канала (биты PL[0:1]), направление передачи данных, режим (circular/normal), отметить нужно или не нужно инкрементировать адреса периферии и памяти после каждой транзакции, установить размеры порций данных для периферии и для памяти, а также настроить прерывания
- Включить канал, установив в 1 бит EN регситра DMA_CCRx (x — номер канала)
- Ну и конечно нужно не забыть разрешить слать запросы к DMA в настройках самого периферийного модуля.
В библиотеке StdPeriph настройку канала можно выполнить одной функцией — DMA_Init, для включения/выключения используется функция DMA_Cmd.
Примеры работы с DMA приводить не буду, их можно посмотреть в примерах работы с другими модулями (например, в примерах работы с UART или ADC), так что на этом всё.
- Часть 1. Установка MDK, создание проекта, основы Keil uVision
- Часть 2. Команды и директивы ассемблера, структура и синтаксис программы. Первая программа для STM32
- Часть 3. Карта памяти контроллеров STM32, методы работы с памятью
- Часть 4. Регистры, старт и режимы работы контроллеров STM32
- Часть 5. Как залить прошивку в контроллер
- Часть 6. Настройка системы тактирования
- Часть 7. Работа с портами ввода-вывода
- Часть 8. Процедуры на ассемблере для STM32
- Часть 9. Система прерываний
- Часть 10. CMSIS, использование стандартных библиотек и функций
- Часть 11. Подключение и использование драйверов из пакета StdPeriph
- Часть 12. Работа с модулями USART и UART.
- Часть 13. Работа с модулями ADC
- Часть 14. Использование DMA
- Часть 15. Таймеры. Глава 1 — Введение. Простейшие таймеры
- Часть 15. Таймеры. Глава 2 — Таймеры общего назначения TIM9 — TIM14
- Часть 15. Таймеры. Глава 3 — Таймеры общего назначения TIM2 — TIM5
- Часть 15. Таймеры. Глава 4 — Продвинутые таймеры TIM1, TIM8
- Часть 16. Создание устройства USB HID в Keil uVision при помощи библиотечного компонента USB
- Приложение 1. Набор инструкций THUMB-2 и особенности их использования
- Приложение 2. Таблица векторов прерываний для семейств STM32F101, STM32F102, STM32F103
- Приложение 3. Драйвера и функции библиотеки StdPeriph
Понравилась статья? Поделись с друзьями!
Источник: radiohlam.ru
DMA, как периферийные устройства подключаются друг к другу и к ОЗУ
Модули DMA присутствуют во всех типах оборудования, это одна из основных частей для связи периферийных устройств друг с другом и с основной памятью. В то время как IOMMU отвечает за управление адресацией, именно модуль DMA выполняет работу по передаче данных из памяти напрямую на периферийное устройство. Мы объясняем, как работают эти устройства и различные типы.
На заре домашних вычислений приводов DMA не существовало, поэтому, когда периферийным устройствам приходилось взаимодействовать с Оперативная память они сделали это двумя разными способами:
- Некоторые процессоры имели вывод HALT, который при получении сигнала останавливал свою активность, чтобы восстановить его в той же точке позже.
- Были случаи, когда доступ к оперативной памяти был зажат между процессором и периферийными устройствами.
Поэтому необходимо было добавить контроллеры прямого доступа к памяти или DMA , чтобы облегчить работу при передаче данных.
Работа модуля прямого доступа к памяти
День защиты детей: �.
Please enable JavaScript
Блок DMA работает следующим образом:
- Адрес памяти указывается в источнике
- Указан объем передаваемых данных.
- В качестве места назначения указывается адрес памяти.
- Данные передаются из одной памяти в другую.
Диски DMA в основном используются для предоставления периферийным устройствам доступа к системной оперативной памяти , Но также используется для передачи данных из системной RAM в локальную RAM различных периферийных устройств, таких как VRAM. . Они делают это без необходимости какого-либо процессора передавать данные из одной памяти в другую, что позволяет посвятить себя выполнению других задач.
Каналы связи
Контроллер DMA может иметь несколько разных каналов , это потому что это возможна одновременная отправка нескольких отправлений с разными пунктами отправления и назначения , Более того, Каналы DMA используются для прямой связи процессора с его сопроцессорами, а не только для доступа к памяти.
Например. Панель изменения размера PCI Express, на которой AMDПамять Smart Access основана на модуле DMA, который ЦП напрямую с VRAM.
То же самое и с двумя видеокартами, будь то с двумя чипами на одной плате или на двух разных картах, где Crossfire взаимодействует с AMD и SLI с NVIDIA все еще модули DMA подключены друг к другу.
Режимы работы модуля прямого доступа к памяти
Имейте в виду, что диск DMA может работать одним из следующих способов, с обоими или всеми тремя одновременно, это будет зависеть от того, как он был разработан для передачи данных.
- В режиме серийной съемки: В этом режиме модуль DMA отправляет прерывание, которое парализует использование памяти процессором, которое остается в состоянии паузы, пока модуль DMA не завершит передачу.
- Циклический режим кражи: Для каждых x переданных байтов привод DMA возвращает процессору доступ к памяти. В отличие от предыдущего случая, он не требует, чтобы процессор долгое время простаивал.
- Прозрачный режим: В этом режиме модуль DMA передает данные только тогда, когда ЦП выполняет инструкцию, не требующую доступа к памяти.
Они не только служат для передачи данных
Одна из вещей, которые позволяют модули DMA заключается в изменении характера передаваемых данных , например, мы можем иметь сжатые данные в источнике и распаковывать их в месте назначения и даже декодировать медиаформат.
Поскольку то, что делает модуль DMA, — это передача блока данных от источника к месту назначения, тогда он может иметь ускоритель или фиксированный функциональный модуль, который манипулирует информацией. . Это чрезвычайно полезно при декодировании мультимедийных данных, например следующих:
- Форматы изображений, такие как JPEG, GIF. PNG.
- Музыкальные форматы, такие как MP3, OGG и т. Д.
- Видеоформаты всех видов.
- Форматы сжатия файлов, такие как: Zlib, 7z и т. Д.
Модули прямого доступа к памяти также заботятся о внутренней коммуникации
Некоторые ускорители и сопроцессоры не используют память системы и даже свою собственную память, находящуюся внутри процессора и их память внутри него. , эти единицы нужен интерфейс DMA, который позволяет им отправлять и получать данные . В некоторых конкретных случаях им назначаются каналы из основного прямого доступа к памяти процессора, которому они помогают.
Это особенно используется, когда у нас есть оперативная память для блокнота. , который представляет собой тип ОЗУ, который находится внутри процессора и имеет путь к данным, отличный от ОЗУ. Большинству сопроцессоров и ускорителей назначается блокнотная память для локального использования, где единственный способ получить доступ к ней — через определенные каналы DMA.
Источник: itigic.com
Dma что это такое в телевизоре
Дорогие читатели! Редакция сайта iXBT.com обращается к вам с просьбой отключить блокировку рекламы на нашем сайте.
Редакция сайта iXBT.com обращается к вам с просьбой отключить блокировку рекламы на нашем сайте.
Дело в том, что деньги, которые мы получаем от показа рекламных баннеров, позволяют нам писать статьи и новости, проводить тестирования, разрабатывать методики, закупать специализированное оборудование и поддерживать в рабочем состоянии серверы, чтобы форум и другие проекты работали быстро и без сбоев.