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

Регистры DMA STM32H7

Регистры DMA1 и DMA2 STM32H742/H743/H750/H753 и мультиплексора DMAMUX: флаги и настройка потоков, FIFO и пакеты, выбор запроса периферии для каждого потока, синхронизация и генераторы запросов.

Потоки DMA1 и DMA2 STM32H7 устроены как у STM32F4, но канала CHSEL нет: какой запрос периферии обслуживает поток, задаёт поле DMAREQ_ID регистра DMAMUX1_CxCR (каналы 0–7 — DMA1, 8–15 — DMA2; таблица 124 RM0433). DMAMUX умеет синхронизировать запросы и генерировать их сам (RM0433, разделы 15.5 и 17.6).

Буферы DMA должны лежать в памяти, доступной DMA1 и DMA2 (AXI SRAM, SRAM1–SRAM3), а не в DTCM. Кеш данных ядра очищайте перед передачей и делайте недействительным после приёма.

ЭкземплярБазовый адресЕсть у
DMA10x4002 0000всех
DMA20x4002 0400всех
DMA1_Stream00x4002 0010всех
DMA1_Stream10x4002 0028всех
DMA1_Stream20x4002 0040всех
DMA1_Stream30x4002 0058всех
DMA1_Stream40x4002 0070всех
DMA1_Stream50x4002 0088всех
DMA1_Stream60x4002 00A0всех
DMA1_Stream70x4002 00B8всех
DMA2_Stream00x4002 0410всех
DMA2_Stream10x4002 0428всех
DMA2_Stream20x4002 0440всех
DMA2_Stream30x4002 0458всех
DMA2_Stream40x4002 0470всех
DMA2_Stream50x4002 0488всех
DMA2_Stream60x4002 04A0всех
DMA2_Stream70x4002 04B8всех
DMAMUX10x4002 0800всех
DMAMUX1_Channel00x4002 0800всех
DMAMUX1_Channel10x4002 0804всех
DMAMUX1_Channel20x4002 0808всех
DMAMUX1_Channel30x4002 080Cвсех
DMAMUX1_Channel40x4002 0810всех
DMAMUX1_Channel50x4002 0814всех
DMAMUX1_Channel60x4002 0818всех
DMAMUX1_Channel70x4002 081Cвсех
DMAMUX1_Channel80x4002 0820всех
DMAMUX1_Channel90x4002 0824всех
DMAMUX1_Channel100x4002 0828всех
DMAMUX1_Channel110x4002 082Cвсех
DMAMUX1_Channel120x4002 0830всех
DMAMUX1_Channel130x4002 0834всех
DMAMUX1_Channel140x4002 0838всех
DMAMUX1_Channel150x4002 083Cвсех
DMAMUX20x5802 5800всех
DMAMUX2_Channel00x5802 5800всех
DMAMUX2_Channel10x5802 5804всех
DMAMUX2_Channel20x5802 5808всех
DMAMUX2_Channel30x5802 580Cвсех
DMAMUX2_Channel40x5802 5810всех
DMAMUX2_Channel50x5802 5814всех
DMAMUX2_Channel60x5802 5818всех
DMAMUX2_Channel70x5802 581Cвсех
DMAMUX1_ChannelStatus0x4002 0880всех
DMAMUX2_ChannelStatus0x5802 5880всех
DMAMUX1_RequestGenerator00x4002 0900всех
DMAMUX1_RequestGenerator10x4002 0904всех
DMAMUX1_RequestGenerator20x4002 0908всех
DMAMUX1_RequestGenerator30x4002 090Cвсех
DMAMUX1_RequestGenerator40x4002 0910всех
DMAMUX1_RequestGenerator50x4002 0914всех
DMAMUX1_RequestGenerator60x4002 0918всех
DMAMUX1_RequestGenerator70x4002 091Cвсех
DMAMUX2_RequestGenerator00x5802 5900всех
DMAMUX2_RequestGenerator10x5802 5904всех
DMAMUX2_RequestGenerator20x5802 5908всех
DMAMUX2_RequestGenerator30x5802 590Cвсех
DMAMUX2_RequestGenerator40x5802 5910всех
DMAMUX2_RequestGenerator50x5802 5914всех
DMAMUX2_RequestGenerator60x5802 5918всех
DMAMUX2_RequestGenerator70x5802 591Cвсех
DMAMUX1_RequestGenStatus0x4002 0940всех
DMAMUX2_RequestGenStatus0x5802 5940всех

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

РегистрСмещениеНазначениеПосле сброса
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
DMAMUX_CxCR0x00Запрос канала DMA и синхронизация0x0000 0000
DMAMUX_CSR0x00Флаги переполнения синхронизации0x0000 0000
DMAMUX_CFR0x04Сброс флагов переполнения синхронизации0x0000 0000
DMAMUX_RGxCR0x00Генератор запросов0x0000 0000
DMAMUX_RGSR0x00Флаги переполнения генераторов запросов0x0000 0000
DMAMUX_RGCFR0x04Сброс флагов генераторов запросов0x0000 0000

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

Выберите регистр и значения полей — конструктор покажет 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
—MBURSTPBURSTTRBUFFCTDBMPL
1514131211109876543210
PINCOSMSIZEPSIZEMINCPINCCIRCDIRPFCTRLTCIEHTIETEIEDMEIEEN
  • 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)
  • TRBUFF (бит 20) — Буферизуемые записи на шину (нужно для UART, USART и LPUART).
  • 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

DMAMUX_CxCR — запрос канала DMA и синхронизация

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

31302928272625242322212019181716
—SYNC_IDNBREQSPOLSE
1514131211109876543210
—EGESOIE—DMAREQ_ID
  • SYNC_ID (биты 28:24) — Сигнал синхронизации канала: биты 26:24 у DMAMUX1, 28:24 у DMAMUX2 (в заголовках CMSIS — 5 бит для обоих).
  • NBREQ (биты 23:19) — Число запросов после события синхронизации минус 1.
  • SPOL (биты 18:17) — Фронт сигнала синхронизации: нет, нарастающий, спадающий или оба.
  • SE (бит 16) — Включение синхронизации.
  • EGE (бит 9) — Выдача события после NBREQ + 1 запросов.
  • SOIE (бит 8) — Прерывание по переполнению синхронизации.
  • DMAREQ_ID (биты 6:0) — Номер запроса периферии для канала DMA: биты 6:0 у DMAMUX1 (таблица 124 RM0433), 4:0 у DMAMUX2; заголовки CMSIS задают 8 бит.

DMAMUX_CSR — флаги переполнения синхронизации

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

31302928272625242322212019181716
—
1514131211109876543210
SOF15SOF14SOF13SOF12SOF11SOF10SOF9SOF8SOF7SOF6SOF5SOF4SOF3SOF2SOF1SOF0
  • SOF0–SOF15 (по биту на каждый y, положение — на карте битов) — Переполнение синхронизации канала y.

DMAMUX_CFR — сброс флагов переполнения синхронизации

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

31302928272625242322212019181716
—
1514131211109876543210
CSOF15CSOF14CSOF13CSOF12CSOF11CSOF10CSOF9CSOF8CSOF7CSOF6CSOF5CSOF4CSOF3CSOF2CSOF1CSOF0
  • CSOF0–CSOF15 (по биту на каждый y, положение — на карте битов) — Сброс флага SOFy записью 1.
  • CSOF1 (бит 1) — Сброс флага SOF1 записью 1.

DMAMUX_RGxCR — генератор запросов

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

31302928272625242322212019181716
—GNBREQGPOLGE
1514131211109876543210
—OIE—SIG_ID
  • GNBREQ (биты 23:19) — Число запросов на одно событие минус 1.
  • GPOL (биты 18:17) — Фронт сигнала генератора: нет, нарастающий, спадающий или оба.
  • GE (бит 16) — Включение генератора запросов.
  • OIE (бит 8) — Прерывание по переполнению генератора.
  • SIG_ID (биты 4:0) — Сигнал, запускающий генератор запросов: биты 2:0 у DMAMUX1, 4:0 у DMAMUX2 (в заголовках CMSIS — 5 бит для обоих).

DMAMUX_RGSR — флаги переполнения генераторов запросов

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

31302928272625242322212019181716
—
1514131211109876543210
—OF7OF6OF5OF4OF3OF2OF1OF0
  • OF0–OF7 (по биту на каждый y, положение — на карте битов) — Переполнение генератора запросов y.

DMAMUX_RGCFR — сброс флагов генераторов запросов

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

31302928272625242322212019181716
—
1514131211109876543210
—COF7COF6COF5COF4COF3COF2COF1COF0
  • COF0–COF7 (по биту на каждый y, положение — на карте битов) — Сброс флага OFy записью 1.
  • COF1 (бит 1) — Сброс флага OF1 записью 1.

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

Почему DMA STM32H7 не работает с буфером в DTCM?

DMA1 и DMA2 не имеют доступа к DTCM: по умолчанию компоновщик кладёт туда переменные. Разместите буфер в AXI SRAM или SRAM1–SRAM3 (секцией в скрипте компоновщика) и учтите кеш данных.

Источники

  1. STMicroelectronics. RM0433: Reference manual (Rev 9) — раздел 15.5: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-h7 v1.10.7: заголовки CMSIS stm32h742xx.h, stm32h743xx.h, stm32h750xx.h, stm32h753xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

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

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

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