Прямой доступ к памяти (англ. DMA – Direct Memory Access) представляет собой механизм,
позволяющий периферийным устройствам напрямую, без использования центрального процессора,
обращаться к оперативной памяти или памяти программ. Поскольку для сокращенного обозначения
наибольшей популярностью пользуется английская аббревиатура DMA, то и мы также будем
использовать ее. Использование DMA позволяет существенно разгрузить центральный процессор, не
отвлекая его на взаимодействие с периферийными устройствами. Блок использует контроллер DMA
для получения массива заданного размера от входящего тракта периферийного устройства и
формирует выходной массив заданного размера. Но так же может использоваться для копирования
областей памяти микроконтроллера. Блок обращается к функции DMA_BASE() находящейся в
dma.h проекта шаблона сборки кода. Функция может быть изменена
пользователем.
Входы
- Dev_init – определяет последовательность включения блока в
работу используется после настройки периферийного устройства;
- sort_block – необходим для определения порядка сортировки
блока.
Выходы
- ready – значение 1, заданный массив заполнен;
- Uint32_tBuf – возвращает массив со значениями полученными от
периферийного устройства.
Свойства:
- Адрес приемника\источника данных – addr - Адрес регистра данных
периферийного устройства АЦП. По умолчанию - 0x40088018 (АЦП1);
- Канал DMA – Chanal - Канал DMA. По умолчанию - 8;
- Размер выходного массива – SIZE - Размер массива выходного
буфера. По умолчанию - 32;
- Автоувеличение адреса для источника – DMA_SourceIncSize -
Автоматическое увеличение адреса источника. По умолчанию - DMA_SourceIncNo;
- Автоувеличение адреса для приемника – DMA_DestIncSize -
Автоматическое увеличение адреса приемника. По умолчанию - DMA_DestIncWord;
- Размер посылки – DMA_MemoryDataSize - Размер элемента массива.
По умолчанию - Word;
- Использовать прерывание – Intr - После завершения цикла DMA
возникает прерывание, для продолжения работы необходимо пери инициализировать контроллер
DMA, после чего контроллер DMA будет готов к следующему циклу работы. В результате
получение данных будет проходить в асинхронном режиме. По умолчанию - нет;
- Запрос к DMA – Request - Если устройству не определен канал
DMA, то можно выбрать свободный и для того, что бы происходило выполнения цикла DMA в
момент обращения к блоку, а не асинхронно, как в варианте, когда используем пере
инициализацию в обработчике прерывания, можно реализовать запрос к каналу. По умолчанию
- нет.
Примечание: В случае если устройству назначен канал и мы хотим получать результаты работы блока при
обращении к нему, то не стоит использовать ни режим прерывания, ни режим запроса, пере
инициализация будет происходить в момент обращения к блоку простым обращением к функции
DMA_Init(). В случае если устройству не выделен канал DMA, а мы хотим
выполнения цикла в момент обращения к блоку то следует выбрать режим Request, в этом случае
после обращения к функции DMA_Init(), будет произведено обращение к функции
Request() и произойдет цикл работы контроллера DMA.