Перейти к содержанию

Регистры DMA STM32F4

Регистры DMA1 и DMA2 STM32F4: потоки 0–7 с выбором канала запроса, направление и размеры данных, кольцевой режим и двойной буфер, FIFO и пакетные передачи, флаги в LISR и HISR.

У STM32F4 два контроллера, DMA1 и DMA2, по 8 потоков. Каждый поток выбирает один из 8 каналов запроса полем CHSEL — так к одному потоку подключаются разные периферийные блоки (таблицы запросов в RM0090, раздел 10.3.3). Передачи память — память выполняет только DMA2.

Поток настраивают при EN = 0: адреса в PAR и M0AR, число передач в NDTR, в CR — канал CHSEL, направление DIR, размеры, увеличение адресов, приоритет. У каждого потока FIFO на 4 слова: в прямом режиме (DMDIS = 0) данные проходят сразу, с FIFO (DMDIS = 1) — пакетами по порогу FTH. Режим двойного буфера DBM переключает M0AR и M1AR после каждого прохода.

Флаги потоков 0–3 находятся в LISR, 4–7 — в HISR и сбрасываются записью единицы в LIFCR и HIFCR; перед включением потока его флаги нужно сбросить. Бит 20 DMA_SxCR в RM0090 зарезервирован — макрос DMA_SxCR_ACK есть только в заголовке CMSIS.

ЭкземплярБазовый адресЕсть у
DMA10x4002 6000всех
DMA20x4002 6400всех
DMA1_Stream00x4002 6010всех
DMA1_Stream10x4002 6028всех
DMA1_Stream20x4002 6040всех
DMA1_Stream30x4002 6058всех
DMA1_Stream40x4002 6070всех
DMA1_Stream50x4002 6088всех
DMA1_Stream60x4002 60A0всех
DMA1_Stream70x4002 60B8всех
DMA2_Stream00x4002 6410всех
DMA2_Stream10x4002 6428всех
DMA2_Stream20x4002 6440всех
DMA2_Stream30x4002 6458всех
DMA2_Stream40x4002 6470всех
DMA2_Stream50x4002 6488всех
DMA2_Stream60x4002 64A0всех
DMA2_Stream70x4002 64B8всех

Регистры блока

РегистрСмещениеНазначениеПосле сброса
DMA_LISR0x00Флаги потоков 0–30x0000 0000
DMA_HISR0x04Флаги потоков 4–70x0000 0000
DMA_LIFCR0x08Сброс флагов потоков 0–30x0000 0000
DMA_HIFCR0x0CСброс флагов потоков 4–70x0000 0000
DMA_SxCR0x00Настройка потока0x0000 0000
DMA_SxNDT0x04Число передач потока0x0000 0000
DMA_SxPAR0x08Адрес периферии0x0000 0000
DMA_SxM0AR0x0CАдрес памяти 00x0000 0000
DMA_SxM1AR0x10Адрес памяти 1 (двойной буфер)0x0000 0000
DMA_SxFCR0x14Настройка FIFO потока0x0000 0021

Конструктор значения

Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.

Значение: 0x00000000

0000 0000 0000 0000 0000 0000 0000 0000

DMA1->LISR = 0x00000000;

DMA_LISR — флаги потоков 0–3

Смещение 0x00, 32 бит, после сброса 0x0000 0000. В коде: DMA1->LISR.

31302928272625242322212019181716
—TCIF3HTIF3TEIF3DMEIF3—FEIF3TCIF2HTIF2TEIF2DMEIF2—FEIF2
1514131211109876543210
—TCIF1HTIF1TEIF1DMEIF1—FEIF1TCIF0HTIF0TEIF0DMEIF0—FEIF0
  • TCIF0–TCIF3 (по биту на каждый y, положение — на карте битов) — Передача потока y завершена.
  • HTIF0–HTIF3 (по биту на каждый y, положение — на карте битов) — Передана половина данных потока y.
  • TEIF0–TEIF3 (по биту на каждый y, положение — на карте битов) — Ошибка передачи потока y.
  • DMEIF0–DMEIF3 (по биту на каждый y, положение — на карте битов) — Ошибка прямого режима потока y.
  • FEIF0–FEIF3 (по биту на каждый y, положение — на карте битов) — Ошибка FIFO потока y.

DMA_HISR — флаги потоков 4–7

Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: DMA1->HISR.

31302928272625242322212019181716
—TCIF7HTIF7TEIF7DMEIF7—FEIF7TCIF6HTIF6TEIF6DMEIF6—FEIF6
1514131211109876543210
—TCIF5HTIF5TEIF5DMEIF5—FEIF5TCIF4HTIF4TEIF4DMEIF4—FEIF4
  • TCIF4–TCIF7 (по биту на каждый y, положение — на карте битов) — Передача потока y завершена.
  • HTIF4–HTIF7 (по биту на каждый y, положение — на карте битов) — Передана половина данных потока y.
  • TEIF4–TEIF7 (по биту на каждый y, положение — на карте битов) — Ошибка передачи потока y.
  • DMEIF4–DMEIF7 (по биту на каждый y, положение — на карте битов) — Ошибка прямого режима потока y.
  • FEIF4–FEIF7 (по биту на каждый y, положение — на карте битов) — Ошибка FIFO потока y.

DMA_LIFCR — сброс флагов потоков 0–3

Смещение 0x08, 32 бит, после сброса 0x0000 0000. В коде: DMA1->LIFCR.

31302928272625242322212019181716
—CTCIF3CHTIF3CTEIF3CDMEIF3—CFEIF3CTCIF2CHTIF2CTEIF2CDMEIF2—CFEIF2
1514131211109876543210
—CTCIF1CHTIF1CTEIF1CDMEIF1—CFEIF1CTCIF0CHTIF0CTEIF0CDMEIF0—CFEIF0
  • CTCIF0–CTCIF3 (по биту на каждый y, положение — на карте битов) — Сброс флага TCIFy записью единицы.
  • CHTIF0–CHTIF3 (по биту на каждый y, положение — на карте битов) — Сброс флага HTIFy записью единицы.
  • CTEIF0–CTEIF3 (по биту на каждый y, положение — на карте битов) — Сброс флага TEIFy записью единицы.
  • CDMEIF0–CDMEIF3 (по биту на каждый y, положение — на карте битов) — Сброс флага DMEIFy записью единицы.
  • CFEIF0–CFEIF3 (по биту на каждый y, положение — на карте битов) — Сброс флага FEIFy записью единицы.

DMA_HIFCR — сброс флагов потоков 4–7

Смещение 0x0C, 32 бит, после сброса 0x0000 0000. В коде: DMA1->HIFCR.

31302928272625242322212019181716
—CTCIF7CHTIF7CTEIF7CDMEIF7—CFEIF7CTCIF6CHTIF6CTEIF6CDMEIF6—CFEIF6
1514131211109876543210
—CTCIF5CHTIF5CTEIF5CDMEIF5—CFEIF5CTCIF4CHTIF4CTEIF4CDMEIF4—CFEIF4
  • CTCIF4–CTCIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага TCIFy записью единицы.
  • CHTIF4–CHTIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага HTIFy записью единицы.
  • CTEIF4–CTEIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага TEIFy записью единицы.
  • CDMEIF4–CDMEIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага DMEIFy записью единицы.
  • CFEIF4–CFEIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага FEIFy записью единицы.

DMA_SxCR — настройка потока

Смещение 0x00, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->CR.

31302928272625242322212019181716
—CHSELMBURSTPBURSTACKCTDBMPL
1514131211109876543210
PINCOSMSIZEPSIZEMINCPINCCIRCDIRPFCTRLTCIEHTIETEIEDMEIEEN
  • CHSEL (биты 27:25) — Канал запроса, который обслуживает поток.
    CHSELЗначение
    000Канал 0
    001Канал 1
    010Канал 2
    011Канал 3
    100Канал 4
    101Канал 5
    110Канал 6
    111Канал 7
  • MBURST (биты 24:23) — Пакетные передачи со стороны памяти.
    MBURSTЗначение
    00Одиночные передачи
    01Пакет из 4 передач (INCR4)
    10Пакет из 8 передач (INCR8)
    11Пакет из 16 передач (INCR16)
  • PBURST (биты 22:21) — Пакетные передачи со стороны периферии.
    PBURSTЗначение
    00Одиночные передачи
    01Пакет из 4 передач (INCR4)
    10Пакет из 8 передач (INCR8)
    11Пакет из 16 передач (INCR16)
  • ACK (бит 20) — По RM0090 бит зарезервирован; макрос есть только в заголовке CMSIS.
  • CT (бит 19) — Текущая память в режиме двойного буфера.
    CTЗначение
    0Память 0 (M0AR)
    1Память 1 (M1AR)
  • DBM (бит 18) — Режим двойного буфера: смена памяти после каждого прохода.
  • PL (биты 17:16) — Приоритет потока.
    PLЗначение
    00Низкий
    01Средний
    10Высокий
    11Очень высокий
  • PINCOS (бит 15) — Шаг увеличения адреса периферии: по PSIZE или 4 байта.
    PINCOSЗначение
    0По размеру PSIZE
    1Всегда 4 байта
  • MSIZE (биты 14:13) — Размер данных в памяти.
    MSIZEЗначение
    008 бит
    0116 бит
    1032 бита
    11Зарезервировано
  • PSIZE (биты 12:11) — Размер данных периферии.
    PSIZEЗначение
    008 бит
    0116 бит
    1032 бита
    11Зарезервировано
  • MINC (бит 10) — Увеличение адреса памяти после каждой передачи.
  • PINC (бит 9) — Увеличение адреса периферии после каждой передачи.
  • CIRC (бит 8) — Кольцевой режим: после последней передачи счётчик перезагружается.
  • DIR (биты 7:6) — Направление передачи.
    DIRЗначение
    00Из периферии в память
    01Из памяти в периферию
    10Из памяти в память (только DMA2)
    11Зарезервировано
  • PFCTRL (бит 5) — Кто управляет числом передач: DMA или периферия.
    PFCTRLЗначение
    0DMA
    1Периферия
  • TCIE (бит 4) — Прерывание по завершении передачи.
  • HTIE (бит 3) — Прерывание по передаче половины данных.
  • TEIE (бит 2) — Прерывание по ошибке передачи.
  • DMEIE (бит 1) — Прерывание по ошибке прямого режима.
  • EN (бит 0) — Включение потока; сбрасывается аппаратно по окончании передачи и при ошибке.

DMA_SxNDT — число передач потока

Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->NDTR.

Регистр данных: значение занимает его целиком.

DMA_SxPAR — адрес периферии

Смещение 0x08, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->PAR.

31302928272625242322212019181716
PA
1514131211109876543210
PA
  • PA (биты 31:0) — Адрес регистра периферии.

DMA_SxM0AR — адрес памяти 0

Смещение 0x0C, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->M0AR.

31302928272625242322212019181716
M0A
1514131211109876543210
M0A
  • M0A (биты 31:0) — Адрес памяти 0.

DMA_SxM1AR — адрес памяти 1 (двойной буфер)

Смещение 0x10, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->M1AR.

31302928272625242322212019181716
M1A
1514131211109876543210
M1A
  • M1A (биты 31:0) — Адрес памяти 1 для режима двойного буфера.

DMA_SxFCR — настройка FIFO потока

Смещение 0x14, 32 бит, после сброса 0x0000 0021. В коде: DMA1_Stream0->FCR.

31302928272625242322212019181716
—
1514131211109876543210
—FEIE—FSDMDISFTH
  • FEIE (бит 7) — Прерывание по ошибке FIFO.
  • FS (биты 5:3) — Заполнение FIFO (только чтение).
    FSЗначение
    000Меньше 1/4
    001От 1/4 до 1/2
    010От 1/2 до 3/4
    011От 3/4 до полного
    100FIFO пуст
    101FIFO полон
  • DMDIS (бит 2) — Выключение прямого режима: передачи через FIFO.
    DMDISЗначение
    0Прямой режим
    1Через FIFO
  • FTH (биты 1:0) — Порог заполнения FIFO.
    FTHЗначение
    001/4 FIFO
    011/2 FIFO
    103/4 FIFO
    11Полный FIFO

Частые вопросы

Какой поток DMA у USART1 на STM32F407?

По таблице запросов DMA2 в RM0090: USART1_TX — поток 7, канал 4; USART1_RX — поток 2 или 5, канал 4. Канал записывают в поле CHSEL регистра DMA2_Stream7->CR.

Почему поток DMA не запускается?

Частые причины: не сброшены флаги потока в LISR или HISR, регистры потока писались при EN = 1, порог FIFO FTH не согласован с размером пакета MBURST — тогда EN сбрасывается аппаратно. Проверьте и тактирование: DMA1EN и DMA2EN в RCC_AHB1ENR.

Зачем нужен режим двойного буфера?

При DBM = 1 поток по очереди пишет в буферы по адресам M0AR и M1AR, а бит CT показывает текущий. Пока DMA заполняет один буфер, программа обрабатывает другой — удобно для АЦП, звука и камеры.

Источники

  1. STMicroelectronics. RM0090: Reference manual (Rev 22) — раздел 10.5: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f4 v2.6.11: заголовки CMSIS stm32f405xx.h, stm32f407xx.h, stm32f415xx.h, stm32f417xx.h, stm32f427xx.h, stm32f429xx.h, stm32f437xx.h, stm32f439xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

Нашли ошибку в регистрах?

Другие регистры STM32F4

Калькуляторы и статьи