[Home] [< Prev: Использование базовых таймеров (TIM6, TIM7)] [Next: Микроконтроллер + DAC как синтезатор сетки частот >]

DMA (прямой доступ к памяти)

Зачастую при выполнении программ, значительная часть процессорного времени затрачивается на копирование данных из одной области памяти в другую. Ещё с большими затратами связано обслуживание периферийных устройств, особенно когда требуется загрузку/чтение данных точно привязывать к определённым моментам времени или событиям.

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

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

Оглавление
Введение
Основные свойства DMA
Функциональное описание
   DMA транзакции
   Арбитр
   Каналы DMA
   Процедура конфигурирования канала
   Режим "из памяти в память"
   Размер данных, выравнивание и порядок байтов
   Взаимодействие с AHB-периферийными устройствами, которые не поддерживают операции записи байтов и полуслов
   Контроль ошибок
   Прерывания
   Схема использования каналов
Регистры DMA
   DMA_ISR (DMA interrupt status register)
   DMA_IFCR (DMA interrupt flag clear register)
   DMA_CCRx (DMA channel x configuration register)
   DMA_CNDTRx (DMA channel x number of data register)
   DMA_CPARx (DMA channel x peripheral address register)
   DMA_CMARx (DMA channel x memory address register)



Введение

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

Микроконтроллеры STM32F100xx имеют один или два контроллера DMA, которые предоставляют в наше распоряжение до 12 каналов DMA (7 каналов имеет DMA1 и 5 каналов - DMA2), каждый из которых выделен для обслуживания запросов на доступ к памяти от одного или нескольких периферийных устройств. DMA имеет устройство-арбитр, которое отвечает за учёт приоритетов при обработке запросов.

Основные возможности DMA

Функциональное описание

Контроллер DMA выполняет передачу данных с прямым доступом к памяти, разделяя системную шину для совместного использования с ядром Cortex-M3. DMA запрос может задержать доступ процессора к системной шине на несколько тактов в случае, если процессор и контроллер DMA адресуют одного и того же получателя данных (память или периферийное устройство). Шинная матрица реализует круговое планирование, что гарантирует, по меньшей мере, предоставление процессору половины полосы пропускания системной шины (для доступа как к памяти, так и к периферии).

На рис. 1 изображена блок-схема контроллера DMA1 микроконтроллеров семейств Low density Value Line, Medium density Value Line (к ним относятся микроконтроллеры STM32F100xx, имеющие до 128 Кб Flash-памяти).

Блок-схема DMA в микроконтроллерах STM32F100xx семейств low и medium-density Value Line Рис. 1

На рис. 2 изображена блок-схема контроллеров DMA1, DMA2. Отметим, что устройства DMA2, SPI3, UART4, UART5, TIM5 среди микроконтроллеров STM32F100xx имеются только в устройствах семейства High density Value Line (к ним относятся устройства, имеющие от 256 до 512 Кб Flash-памяти, это микроконтроллеры STM32F100xx, где xx=RC, RD, RE, VC, VD, VE, ZC, ZD, ZE).

Блок-схема DMA в микроконтроллерах STM32F100xx семейства high density Value Line Рис. 2

DMA транзакции

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

Если обобщить, каждая передача с использованием DMA состоит из трёх операций:

Арбитр

Арбитр координирует DMA запросы в соответствии с приоритетами каналов и запускает последовательность обращений к периферии/памяти для обработки первоочередного в данной ситуации запроса.

Приоритет определяется на программном и аппаратном уровнях:

Каналы DMA

Каждый канал может управлять DMA передачей между регистром периферийного устройства, расположенного по фиксированному адресу и памятью. Количество элементов данных (байт, полуслов или слов), которые должны быть переданы, задаётся программно и может быть от 0 до 65535. Регистр, содержащий количество элементов для пересылки, декрементируется после каждой пересылки.

Программируемый размер данных. Размер одного элемента (1, 2 или 4 байта) устанавливается независимо не только для каждого канала, но и отдельно для источника и приёмника данных в каждом канале - с помощью битовых полей PSIZE и MSIZE регистра DMA_CCRx.

Инкремент адреса. Текущий указатель на данные источника/приёмника может оставаться неизменным после выполнения DMA транзакции (что требуется при работе с периферийными устройствами, так как они имеют регистры с фиксированными адресами), но можно настроить DMA на автоматическое увеличение указателя после выполнения транзакции. Это делается с помощью битов PINC и MINC регистра DMA_CCRx. При установленном бите, содержимое соответствующего указателя периферии/памяти будет автоматически увеличиваться на 1, 2 или 4, в зависимости от заданного размера элемента данных, в результате чего указатель будет перемещаться на следующий элемент данных. Адреса, используемые во время первой передачи данных, задаются регистрами DMA_CPARx/DMA_CMARx. В процессе выполнения операций передачи, их значения остаются неизменными. Текущие значения адресов хранятся во внутренних регистрах микроконтроллера и недоступны программно.

Если канал сконфигурирован для работы в нециклическом режиме, DMA запросы по этому каналу не будут обслуживаться после выполнения последней передачи данных (когда регистр, содержащий количество элементов для пересылки достигает 0). Для загрузки нового количества пересылаемых элементов в регистр DMA_CNDTRx, необходимо предварительно отключить DMA канал. При отключении канала DMA, его регистры не сбрасываются (DMA_CCRx, DMA_CPARx and DMA_CMARx сохраняют значения, заданные в процессе предшествующего конфигурирования канала).

В циклическом режиме, после выполнения последней пересылки, в регистр DMA_CNDTRx автоматически загружается первоначально заданное значение, а внутренние регистры текущих адресов перезагружаются значениями базовых адресов из регистров DMA_CPARx/DMA_CMARx. Обслуживание DMA запросов продолжается.

Процедура конфигурирования канала

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

  1. Записать в DMA_CPARx адрес регистра периферийного устройства. Данные будут считываться или записываться по этому адресу после возникновения в периферийном устройстве события, генерирующего DMA запрос.
  2. Записать в DMA_CMARx адрес в памяти (или начальный адрес буфера в памяти). В ответ на каждый DMA запрос на этом канале, данные будут считываться с периферийного устройства и записываться по этому адресу, либо считываться по этому адресу и пересылаться в периферийное устройство.
  3. Задать общее количество пересылаемых элементов, записав требуемое значение в регистр DMA_CNDTRx. После каждой обработки DMA запроса на этом канале, значение регистра уменьшается на 1.
  4. С помощью битов PL[1:0] регистра DMA_CCRx настроить приоритет канала.
  5. Настроить направление пересылки данных, режим (циклический/нециклический), режим инкрементирования адреса периферии/памяти, размер элемента данных периферии/памяти, задать условия генерации прерывания DMA. Перечисленные настройки выполняются с помощью регистра DMA_CCRx.
  6. Активировать канал установкой бита EN (ENABLE) в регистре DMA_CCRx.

После включения канала, начнётся обслуживание DMA запросов от периферийного устройства, подключённого к каналу.

После того, как будет выполнена пересылка половины от заданного общего количества элементов, будет установлен флаг HTIF, а если установлен разрешающий прерывание бит HTIE, то произойдёт прерывание. Когда будет выполнена пересылка всех данных, будет установлен флаг TCIF и произойдёт прерывание, если оно разрешено установкой бита TCIE. При работе в нециклическом режиме, после пересылки заданного количества элементов, обслуживание DMA запросов для данного канала прекращается.

Если битом CIRC регистра DMA_CCRx включён циклический режим работы, то после завершения передачи данных регистр, содержащий количество элементов для пересылки перезагружается своим первоначальным значением и обслуживание запросов продолжается. Этот режим хорошо подходит для работы с кольцевыми буферами и непрерывными потоками данных (например, получение данных от ADC, работающего в режиме непрерывного преобразования).

Режим "из памяти в память"

DMA каналы могут также работать без запуска по запросу от периферии. Это происходит в режиме memory-to-memory, который включается установкой бита MEM2MEM в регистре DMA_CCRx. Если этот бит установлен, передача данных начинается сразу после программной установки бита включения EN в регистре DMA_CCRx.

Пересылка завершается при достижении регистром DMA_CNDTRx значения 0. Режим не может использоваться одновременно с циклическим режимом.

Размер данных, выравнивание и порядок байтов

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

Обозначения столбцов:
Src width - размер одного элемента данных источника в битах.
Dst Width - размер одного элемента данных приёмника в битах.
NDT (Number of data items to transfer) - количество элементов данных для пересылки в данном примере.
Src addr/data - адрес и данные источника (адрес даётся в виде смещения относительно базового значения в форме: @смещение).
Dst addr/data - адрес приёмника и данные, помещённые в него после завершения передачи.
Transfer operations - операции, выполняемые в процессе перемещения (что и откуда читается; что и откуда записывается), в результате которых получаем конечное содержимое приёмника.

Src
width
Dst
width
NDT Src
addr/data

Dst
addr/data

Transfer operations
8 8 4 @0x0 / B0
@0x1 / B1
@0x2 / B2
@0x3 / B3

@0x0 / B0
@0x1 / B1
@0x2 / B2
@0x3 / B3

1: READ B0[7:0] @0x0 then WRITE B0[7:0] @0x0
2: READ B1[7:0] @0x1 then WRITE B1[7:0] @0x1
3: READ B2[7:0] @0x2 then WRITE B2[7:0] @0x2
4: READ B3[7:0] @0x3 then WRITE B3[7:0] @0x3
8 16 4

@0x0 / B0
@0x1 / B1
@0x2 / B2
@0x3 / B3

@0x0 / 00B0
@0x2 / 00B1
@0x4 / 00B2
@0x6 / 00B3

1: READ B0[7:0] @0x0 then WRITE 00B0[15:0] @0x0
2: READ B1[7:0] @0x1 then WRITE 00B1[15:0] @0x2
3: READ B3[7:0] @0x2 then WRITE 00B2[15:0] @0x4
4: READ B4[7:0] @0x3 then WRITE 00B3[15:0] @0x6

8 32 4

@0x0 / B0
@0x1 / B1
@0x2 / B2
@0x3 / B3

@0x0 / 000000B0
@0x4 / 000000B1
@0x8 / 000000B2
@0xC / 000000B3

1: READ B0[7:0] @0x0 then WRITE 000000B0[31:0] @0x0
2: READ B1[7:0] @0x1 then WRITE 000000B1[31:0] @0x4
3: READ B3[7:0] @0x2 then WRITE 000000B2[31:0] @0x8
4: READ B4[7:0] @0x3 then WRITE 000000B3[31:0] @0xC

16 8 4

@0x0 / B1B0
@0x2 / B3B2
@0x4 / B5B4
@0x6 / B7B6

@0x0 / B0
@0x1 / B2
@0x2 / B4
@0x3 / B6

1: READ B1B0[15:0] @0x0 then WRITE B0[7:0] @0x0
2: READ B3B2[15:0] @0x2 then WRITE B2[7:0] @0x1
3: READ B5B4[15:0] @0x4 then WRITE B4[7:0] @0x2
4: READ B7B6[15:0] @0x6 then WRITE B6[7:0] @0x3

16 16 4

@0x0 / B1B0
@0x2 / B3B2
@0x4 / B5B4
@0x6 / B7B6

@0x0 / B1B0
@0x2 / B3B2
@0x4 / B5B4
@0x6 / B7B6

1: READ B1B0[15:0] @0x0 then WRITE B1B0[15:0] @0x0
2: READ B3B2[15:0] @0x2 then WRITE B3B2[15:0] @0x2
3: READ B5B4[15:0] @0x4 then WRITE B5B4[15:0] @0x4
4: READ B7B6[15:0] @0x6 then WRITE B7B6[15:0] @0x6

16 32 4

@0x0 / B1B0
@0x2 / B3B2
@0x4 / B5B4
@0x6 / B7B6

@0x0 / 0000B1B0
@0x4 / 0000B3B2
@0x8 / 0000B5B4
@0xC / 0000B7B6

1: READ B1B0[15:0] @0x0 then WRITE 0000B1B0[31:0] @0x0
2: READ B3B2[15:0] @0x2 then WRITE 0000B3B2[31:0] @0x4
3: READ B5B4[15:0] @0x4 then WRITE 0000B5B4[31:0] @0x8
4: READ B7B6[15:0] @0x6 then WRITE 0000B7B6[31:0] @0xC

32 8 4

@0x0 / B3B2B1B0
@0x4 / B7B6B5B4
@0x8 / BBBAB9B8
@0xC / BFBEBDBC

@0x0 / B0
@0x1 / B4
@0x2 / B8
@0x3 / BC

1: READ B3B2B1B0[31:0] @0x0 then WRITE B0[7:0] @0x0
2: READ B7B6B5B4[31:0] @0x4 then WRITE B4[7:0] @0x1
3: READ BBBAB9B8[31:0] @0x8 then WRITE B8[7:0] @0x2
4: READ BFBEBDBC[31:0] @0xC then WRITE BC[7:0] @0x3

32 16 4

@0x0 / B3B2B1B0
@0x4 / B7B6B5B4
@0x8 / BBBAB9B8
@0xC / BFBEBDBC

@0x0 / B1B0
@0x2 / B5B4
@0x4 / B9B8
@0x6 / BDBC

1: READ B3B2B1B0[31:0] @0x0 then WRITE B1B0[7:0] @0x0
2: READ B7B6B5B4[31:0] @0x4 then WRITE B5B4[7:0] @0x1
3: READ BBBAB9B8[31:0] @0x8 then WRITE B9B8[7:0] @0x2
4: READ BFBEBDBC[31:0] @0xC then WRITE BDBC[7:0] @0x3

32 32 4

@0x0 / B3B2B1B0
@0x4 / B7B6B5B4
@0x8 / BBBAB9B8
@0xC / BFBEBDBC

@0x0 / B3B2B1B0
@0x4 / B7B6B5B4
@0x8 / BBBAB9B8
@0xC / BFBEBDBC

1: READ B3B2B1B0[31:0] @0x0 then WRITE B3B2B1B0[31:0] @0x0
2: READ B7B6B5B4[31:0] @0x4 then WRITE B7B6B5B4[31:0] @0x4
3: READ BBBAB9B8[31:0] @0x8 then WRITE BBBAB9B8[31:0] @0x8
4: READ BFBEBDBC[31:0] @0xC then WRITE BFBEBDBC[31:0] @0xC

Взаимодействие с AHB-периферийными устройствами, которые не поддерживают операции записи байтов и полуслов

Когда DMA начинает операцию записи байта или полуслова в устройство на шине AHB, данные дублируются на неиспользуемых линиях шины HWDATA[31:0]. Так что, когда используется периферийное устройство на шине AHB, которое не поддерживает операций записи байт и полуслов (в том случае, если HSIZE не используется периферийным устройством) и не генерирует никаких ошибок, DMA записывает 32-битовые данные, как это показано в следующих примерах:
1) при записи полуслова 0xABCD, DMA устанавливает на шине HWDATA 0xABCDABCD и HSIZE=HalfWord;
2) при записи байта 0xAB, DMA устанавливает на шине HWDATA 0xABABABAB и HSIZE=Byte.

С учётом того, что AHB/APB мост является 32-битным подчинённым периферийным устройством на шине AHB, которое не учитывает HSIZE, любая операция с байтом или полусловом будет преобразована в 32-битовую операцию следующим образом:
AHB операция записи байта 0xB0 по адресу 0x0 (или 0x1, 0x2, 0x3) будет преобразована в APB операцию записи слова 0xB0B0B0B0 по адресу 0x0;
AHB операция записи полуслова 0xB1B0 по адресу 0x0 (или 0x2) будет преобразована в APB операцию записи слова 0xB1B0B1B0 по адресу 0x0.

Например, если требуется выполнить запись в APB backup регистр (16-битовый регистр с выравниванием адреса на 32-битовую границу), следует задать размер данных в источнике - памяти (MSIZE) равным 16 бит и размер данных в приёмнике - периферийном устройстве (PSIZE) равным 32 бита.

Контроль ошибок

Ошибка в процессе пересылки данных с использованием DMA может возникнуть в результате попытки чтения или записи по адресу из зарезервированного адресного пространства. В таких случаях, вызвавший ошибку канал DMA автоматически отключается за счёт аппаратного сброса бита EN в соответствующем этому каналу конфигурационном регистре DMA_CCRx. Устанавливается флаг ошибки передачи TEIF в регистре DMA_IFR и генерируется прерывание DMA, если это разрешено установкой бита TEIE в регистре DMA_CCRx.

Прерывания

Прерывания могут генерироваться в результате установки флага HTIF, TCIF или TEIF, т.е. после завершения пересылки половины данных, всех данных или в случае возникновения ошибки соответственно. Для того чтобы разрешить генерацию прерывания при установке того или иного флага, используются биты HTIE, TCIE и TEIE.

Каждый канал имеет свой собственный вектор прерывания, за одним исключением: в семействе микроконтроллеров "high-density value line" каналы 4 и 5 контроллера DMA2 используют один и тот же вектор.

Схема использования каналов

Количество DMA каналов ограничено, в связи с этим, каждый канал используется для подачи DMA запросов от нескольких периферийных устройств (сигналы от нескольких устройств на одном канале просто объединяются логической операцией ИЛИ). Поэтому одновременно только одно периферийное устройство на данном канале может использовать DMA. Для того чтобы иметь возможность включать/отключать использование функций DMA, каждое периферийное устройство с поддержкой прямого доступа в память имеет бит для активации/деактивации режима формирования запросов DMA. По умолчанию, после сброса микроконтроллера, формирование DMA запросов для всех периферийных устройств отключено.

На следующем рисунке изображена блок-схема, поясняющая отображение линий запроса DMA от периферийных устройств на каналы контроллера DMA1 (аналогичным образом организовано подключение устройств к каналам контроллера DMA2, если он имеется).

Подключение устройств к каналам DMA1 Рис. 3

Отображение запросов на каналы DMA от устройств TIM1_CH1, TIM1_CH2, а в микроконтроллерах семейства high-density value line также и TIM6_DAC1, TIM7_DAC2, зависит от настроек AFIO. Подробнее об этом можно почитать в разделе документации, посвящённом AFIO.

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

ПУ Канал 1 Канал 2 Канал 3 Канал 4 Канал 5 Канал 6 Канал 7
ADC1 ADC1            
SPI   SPI1_RX SPI1_TX SPI2_RX SPI2_TX    
USART   USART3_TX USART3_RX USART1_TX USART1_RX USART2_RX USART2_TX
I2C        I2C2_TX I2C2_RX I2C1_TX I2C1_RX
TIM1   TIM1_CH1 TIM1_CH2 TIM1_CH4
TIM1_TRIG
TIM1_COM
TIM1_UP TIM1_CH3
TIM1_CH2
TIM1_CH1
 
TIM2 TIM2_CH3 TIM2_UP     TIM2_CH1   TIM2_CH2
TIM2_CH4
TIM3   TIM3_CH3 TIM3_CH4
TIM3_UP
    TIM3_CH1
TIM3_TRIG
 
TIM4 TIM4_CH1     TIM4_CH2 TIM4_CH3   TIM4_UP
TIM6/
DAC Ch1
    TIM6_UP/
DAC_Channel1
       
TIM7/
DAC Ch2
      TIM7_UP/
DAC_Channel2
     
TIM15         TIM15_CH1
TIM15_UP
TIM15_TRIG
TIM15_COM
   
TIM16           TIM16_CH1
TIM16_UP
 
TIM17             TIM17_CH1
TIM17_UP

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

ПУ Канал 1 Канал 2 Канал 3 Канал 4 Канал 5
SPI3 SPI3_RX SPI3_TX      
UART4     UART4_RX   UART4_TX
UART5 UART5_TX     UART5_RX  
TIM5 TIM5_CH4
TIM5_TRIG
TIM5_CH3
TIM5_UP
  TIM5_CH2 TIM5_CH1
TIM6/
DAC_Ch1
    TIM6_UP/
DAC_Channel1
   
TIM7/
DAC_Ch2
      TIM7_UP/
DAC_Channel2
 

Регистры DMA

Доступ к регистрам можно выполнять как к байтам (8 бит), полусловам (16 бит) или словам (32 бита).

В используемых обозначениях под DMA подразумевается либо DMA1, либо DMA2, в зависимости от того, к регистру какого контроллера DMA мы хотим обратиться. В микроконтроллерах STM32F100xx семейств Low и Medium density Value Line имеется только DMA1 и всюду под DMA подразумевается DMA1.

Каждый канал DMA имеет либо свой регистр, либо своё битовое поле в общем регистре. Для обозначения номера канала будет использоваться символ "x", x=1..7 в случае DMA1 и x=1..5 для контроллера DMA2.


DMA_ISR (DMA interrupt status register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved TEIF7 HTIF7 TCIF7 GIF7 TEIF6 HTIF6 TCIF6 GIF6 TEIF5 HTIF5 TCIF5 GIF5  
r r r r r r r r r r r r  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
TEIF4 HTIF4 TCIF4 GIF4 TEIF3 HTIF3 TCIF3 GIF3 TEIF2 HTIF2 TCIF2 GIF2 TEIF1 HTIF1 TCIF1 GIF1  
r r r r r r r r r r r r r r r r  

Address offset: 0x00
Reset value: 0x0000 0000

Регистр состояния прерывания, содержит набор флагов (по 4 флага на канал DMA), которые устанавливаются аппаратно при наступлении соответствующего события. Установка любого из флагов может привести к генерации прерывания, если это разрешено. Сброс флагов осуществляется с помощью регистра DMA_IFCR (сброс необходим при обработке прерываний от DMA).

TEIFx: Channel x transfer error flag
Флаг ошибки передачи в канале x, этот бит устанавливается аппаратно. Сбрасывается записью 1 в соответствующий бит регистра DMA_IFCR.
0: Не было ошибок передачи в DMA канале x.
1: На канале x произошла ошибка при пересылке данных.

HTIFx: Channel x half transfer flag
Флаг завершения передачи половины данных в канале x, бит устанавливается аппаратно. Сбрасывается программно записью 1 в соответствующий бит регистра DMA_IFCR.
0: Не было события - завершения передачи половины от общего количества данных.
1: Было зафиксировано событие - завершение передачи половины данных.

TCIFx: Channel x transfer complete flag
Флаг завершения передачи в канале x, бит устанавливается аппаратно. Сбрасывается программно записью 1 в соответствующий бит регистра DMA_IFCR.
0: Не было зафиксировано события - завершения передачи данных.
1: Было зафиксировано событие - завершение передачи данных.

GIFx: Channel x global interrupt flag
Глобальный флаг прерывания в канале x, бит устанавливается аппаратно одновременно с установкой любого из флагов для данного канала: TEIFx, HTIFx или TCIFx. Сбрасывается программно записью 1 в соответствующий бит регистра DMA_IFCR.
0: Не происходило установки ни одного из флагов TEIFx, HTIFx или TCIFx на данном канале DMA.
1: Произошла установка одного из флагов TEIFx, HTIFx или TCIFx.


DMA_IFCR (DMA interrupt flag clear register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved CTEIF7 CHTIF7 CTCIF7 CGIF7 CTEIF6 CHTIF6 CTCIF6 CGIF6 CTEIF5 CHTIF5 CTCIF5 CGIF5  
w w w w w w w w w w w w  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
CTEIF4 CHTIF4 CTCIF4 CGIF4 CTEIF3 CHTIF3 CTCIF3 CGIF3 CTEIF2 CHTIF2 CTCIF2 CGIF2 CTEIF1 CHTIF1 CTCIF1 CGIF1  
w w w w w w w w w w w w w w w w  

Address offset: 0x04
Reset value: 0x0000 0000

Регистр сброса флагов прерывания. Биты данного регистра используются для программного сброса соответствующих битов в регистре флагов DMA_ISR путём записи в бит значения 1, запись в бит 0 не имеет никакого эффекта.

CTEIFx: Channel x transfer error clear
Сброс флага ошибки передачи в канале x.
0: Не имеет эффекта.
1: Сброс флага TEIFx в регистре DMA_ISR.

CHTIFx: Channel x half transfer clear
Сброс флага половинной передачи в канале x.
0: Не имеет эффекта.
1: Сброс флага HTIFx в регистре DMA_ISR.

CTCIFx: Channel x transfer complete clear
Сброс флага завершения передачи в канале x.
0: Не имеет эффекта.
1: Сброс флага TCIFx в регистре DMA_ISR.

CGIFx: Channel x global interrupt clear
Сброс флагов в канале x.
0: Не имеет эффекта.
1: Сброс всех флагов для канала x в регистре DMA_ISR (GIFx, TEIFx, HTIFx и TCIFx).


DMA_CCRx (DMA channel x configuration register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
 
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Res. MEM2
MEM
PL[1:0] MSIZE[1:0] PSIZE[1:0] MINC PINC CIRC DIR TEIE HTIE TCIE EN  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Address offset: 0x08+0d20*(x–1)
Reset value: 0x0000 0000

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

MEM2MEM: Memory to memory mode
Включение режима "memory to memory" (копирование данных из памяти в память). Бит устанавливается и сбрасывается программно.
0: Режим "memory to memory" отключён.
1: Режим включён.

PL[1:0]: Channel priority level
Уровень приоритета канала. Битовое поле задаётся программно и определяет уровень приоритета канала в соответствии со значениями:
00: низкий;
01: средний;
10: высокий;
11: очень высокий.

MSIZE[1:0]: Memory size
Размер элемента данных в памяти. Битовое поле задаётся программно и определяет размер одного элемента данных, записываемого в память или считываемого из памяти (зависит от выбранного направления передачи) за одну транзакцию:
00: 8 бит (передача по байтам);
01: 16 бит (передача по полусловам);
10: 32 бита (передача по словам);
11: зарезервировано (не используется).

PSIZE[1:0]: Peripheral size
Размер элемента данных для обмена с периферийным устройством. Битовое поле задаётся программно и определяет размер одного элемента данных, считываемого из регистра периферийного устройства или записываемого в него (в зависимости от выбранного направления передачи) за одну транзакцию:
00: 8 бит (передача по байтам);
01: 16 бит (передача по полусловам);
10: 32 бита (передача по словам);
11: зарезервировано (не используется).

MINC: Memory increment mode
Режим инкрементирования адреса в памяти. Этот бит устанавливается и сбрасывается программно.
0: Инкрементирование адреса отключено.
1: Инкрементирование адреса включено.

PINC: Peripheral increment mode
Режим инкрементирования адреса периферии. Бит устанавливается и сбрасывается программно.
0: Инкрементирование адреса отключено.
1: Инкрементирование адреса включено.

CIRC: Circular mode
Циклический режим. Бит устанавливается и сбрасывается программно.
0: Циклический режим отключён.
1: Циклический режим включён.

DIR: Data transfer direction
Направление передачи данных. Бит устанавливается и сбрасывается программно.
0: Чтение данных из периферийного устройства.
1: Чтение данных из памяти.

TEIE: Transfer error interrupt enable
Разрешение прерываний при возникновении ошибок передачи. Этот бит устанавливается и сбрасывается программно.
0: Генерация прерываний при возникновении ошибок передачи отключена.
1: Генерация прерываний при возникновении ошибок передачи включена.

HTIE: Half transfer interrupt enable
Разрешение прерываний при завершении передачи половины данных. Бит устанавливается и сбрасывается программно.
0: Генерация прерываний при завершении передачи половины данных отключена.
1: Генерация прерываний при завершении передачи половины данных включена.

TCIE: Transfer complete interrupt enable
Разрешение прерываний при завершении передачи данных. Бит устанавливается и сбрасывается программно.
0: Генерация прерываний при завершении передачи данных отключена.
1: Генерация прерываний при завершении передачи данных включена.

EN: Channel enable
Включение канала. Бит устанавливается и сбрасывается программно.
0: Канал отключён.
1: Канал включён.


DMA_CNDTRx (DMA channel x number of data register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16  
Reserved  
 
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
NDT  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Address offset: 0x0C+0d20*(x–1)
Reset value: 0x0000 0000

NDT[15:0]: Number of data to transfer
Количество элементов для передачи (общее количество транзакций), от 0 до 65535. В этот регистр можно записывать только при отключённом канале. После включения канала, регистр становится доступным только для чтения и содержит оставшееся количество элементов для передачи (или количество транзакций). Это количество в общем случае не равно объёму данных в байтах, т.к. размер одного элемента может быть более одного байта (может быть равным 2 или 4 байтам).

Содержимое регистра уменьшается на 1 после каждой DMA передачи (после каждой транзакции). Когда значение регистра достигает 0, передача останавливается (в нециклическом режиме) или регистр автоматически перезагружается первоначально записанным в него значением и передача продолжается (в циклическом режиме).

Если в регистр записано значение 0, транзакции не выполняются, независимо от того, включен DMA канал или нет.


DMA_CPARx (DMA channel x peripheral address register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
PA  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Address offset: 0x10+0d20*(x–1)
Reset value: 0x0000 0000

Не допускается запись в регистр при включённом данном канале DMA.

PA[31:0]: Peripheral address
Базовый адрес регистра периферийного устройства из которого выполняется чтение или в который производится запись. Если размер данных периферийного устройства установлен равным 16 бит (PSIZE: 01), доступ осуществляется с автоматическим выравниванием на полуслово (младший бит PA[0] игнорируется). Если размер данных периферийного устройства установлен равным 32 бита (PSIZE: 10), доступ осуществляется с автоматическим выравниванием на слово (два младших бита PA[1:0] игнорируются).


DMA_CMARx (DMA channel x memory address register)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
MA  
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw  

Address offset: 0x14+0d20*(x–1)
Reset value: 0x0000 0000

Не допускается запись в регистр при включённом данном канале DMA.

MA[31:0]: Memory address
Базовый адрес памяти, по которому выполняется запись или чтение. Если размер данных в памяти установлен равным 16 бит (MSIZE: 01), доступ осуществляется с автоматическим выравниванием на полуслово (младший бит MA[0] игнорируется). Если размер данных в памяти установлен равным 32 бита (MSIZE: 10), доступ осуществляется с автоматическим выравниванием на слово (два младших бита MA[1:0] игнорируются).

author: hamper; date: 2016-11-07
  @Mail.ru