Регистры 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.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| DMA1 | 0x4002 6000 | всех |
| DMA2 | 0x4002 6400 | всех |
| DMA1_Stream0 | 0x4002 6010 | всех |
| DMA1_Stream1 | 0x4002 6028 | всех |
| DMA1_Stream2 | 0x4002 6040 | всех |
| DMA1_Stream3 | 0x4002 6058 | всех |
| DMA1_Stream4 | 0x4002 6070 | всех |
| DMA1_Stream5 | 0x4002 6088 | всех |
| DMA1_Stream6 | 0x4002 60A0 | всех |
| DMA1_Stream7 | 0x4002 60B8 | всех |
| DMA2_Stream0 | 0x4002 6410 | всех |
| DMA2_Stream1 | 0x4002 6428 | всех |
| DMA2_Stream2 | 0x4002 6440 | всех |
| DMA2_Stream3 | 0x4002 6458 | всех |
| DMA2_Stream4 | 0x4002 6470 | всех |
| DMA2_Stream5 | 0x4002 6488 | всех |
| DMA2_Stream6 | 0x4002 64A0 | всех |
| DMA2_Stream7 | 0x4002 64B8 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| DMA_LISR | 0x00 | Флаги потоков 0–3 | 0x0000 0000 |
| DMA_HISR | 0x04 | Флаги потоков 4–7 | 0x0000 0000 |
| DMA_LIFCR | 0x08 | Сброс флагов потоков 0–3 | 0x0000 0000 |
| DMA_HIFCR | 0x0C | Сброс флагов потоков 4–7 | 0x0000 0000 |
| DMA_SxCR | 0x00 | Настройка потока | 0x0000 0000 |
| DMA_SxNDT | 0x04 | Число передач потока | 0x0000 0000 |
| DMA_SxPAR | 0x08 | Адрес периферии | 0x0000 0000 |
| DMA_SxM0AR | 0x0C | Адрес памяти 0 | 0x0000 0000 |
| DMA_SxM1AR | 0x10 | Адрес памяти 1 (двойной буфер) | 0x0000 0000 |
| DMA_SxFCR | 0x14 | Настройка 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TCIF3 | HTIF3 | TEIF3 | DMEIF3 | — | FEIF3 | TCIF2 | HTIF2 | TEIF2 | DMEIF2 | — | FEIF2 | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TCIF1 | HTIF1 | TEIF1 | DMEIF1 | — | FEIF1 | TCIF0 | HTIF0 | TEIF0 | DMEIF0 | — | 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TCIF7 | HTIF7 | TEIF7 | DMEIF7 | — | FEIF7 | TCIF6 | HTIF6 | TEIF6 | DMEIF6 | — | FEIF6 | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TCIF5 | HTIF5 | TEIF5 | DMEIF5 | — | FEIF5 | TCIF4 | HTIF4 | TEIF4 | DMEIF4 | — | 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CTCIF3 | CHTIF3 | CTEIF3 | CDMEIF3 | — | CFEIF3 | CTCIF2 | CHTIF2 | CTEIF2 | CDMEIF2 | — | CFEIF2 | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CTCIF1 | CHTIF1 | CTEIF1 | CDMEIF1 | — | CFEIF1 | CTCIF0 | CHTIF0 | CTEIF0 | CDMEIF0 | — | 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CTCIF7 | CHTIF7 | CTEIF7 | CDMEIF7 | — | CFEIF7 | CTCIF6 | CHTIF6 | CTEIF6 | CDMEIF6 | — | CFEIF6 | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CTCIF5 | CHTIF5 | CTEIF5 | CDMEIF5 | — | CFEIF5 | CTCIF4 | CHTIF4 | CTEIF4 | CDMEIF4 | — | 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CHSEL | MBURST | PBURST | ACK | CT | DBM | PL | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PINCOS | MSIZE | PSIZE | MINC | PINC | CIRC | DIR | PFCTRL | TCIE | HTIE | TEIE | DMEIE | EN | |||
- 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 Значение 00 8 бит 01 16 бит 10 32 бита 11 Зарезервировано - PSIZE (биты 12:11) — Размер данных периферии.
PSIZE Значение 00 8 бит 01 16 бит 10 32 бита 11 Зарезервировано - MINC (бит 10) — Увеличение адреса памяти после каждой передачи.
- PINC (бит 9) — Увеличение адреса периферии после каждой передачи.
- CIRC (бит 8) — Кольцевой режим: после последней передачи счётчик перезагружается.
- DIR (биты 7:6) — Направление передачи.
DIR Значение 00 Из периферии в память 01 Из памяти в периферию 10 Из памяти в память (только DMA2) 11 Зарезервировано - PFCTRL (бит 5) — Кто управляет числом передач: DMA или периферия.
PFCTRL Значение 0 DMA 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.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PA | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PA | |||||||||||||||
- PA (биты 31:0) — Адрес регистра периферии.
DMA_SxM0AR — адрес памяти 0
Смещение 0x0C, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->M0AR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| M0A | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| M0A | |||||||||||||||
- M0A (биты 31:0) — Адрес памяти 0.
DMA_SxM1AR — адрес памяти 1 (двойной буфер)
Смещение 0x10, 32 бит, после сброса 0x0000 0000. В коде: DMA1_Stream0->M1AR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| M1A | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| M1A | |||||||||||||||
- M1A (биты 31:0) — Адрес памяти 1 для режима двойного буфера.
DMA_SxFCR — настройка FIFO потока
Смещение 0x14, 32 бит, после сброса 0x0000 0021. В коде: DMA1_Stream0->FCR.
| 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 |
| — | FEIE | — | FS | DMDIS | FTH | ||||||||||
- FEIE (бит 7) — Прерывание по ошибке FIFO.
- FS (биты 5:3) — Заполнение FIFO (только чтение).
FS Значение 000 Меньше 1/4 001 От 1/4 до 1/2 010 От 1/2 до 3/4 011 От 3/4 до полного 100 FIFO пуст 101 FIFO полон - DMDIS (бит 2) — Выключение прямого режима: передачи через FIFO.
DMDIS Значение 0 Прямой режим 1 Через FIFO - FTH (биты 1:0) — Порог заполнения FIFO.
FTH Значение 00 1/4 FIFO 01 1/2 FIFO 10 3/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 заполняет один буфер, программа обрабатывает другой — удобно для АЦП, звука и камеры.
Источники
- STMicroelectronics. RM0090: Reference manual (Rev 22) — раздел 10.5: описание регистров, назначение полей и значения после сброса
- 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
- Все регистры STM32F4Блоки периферии и заголовки CMSIS
- RCC — сброс и тактированиеRCC_CR, RCC_PLLCFGR, RCC_CFGR, RCC_CIR, RCC_AHB1RSTR, RCC_AHB2RSTR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_PMC, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — контроллер внешних прерываний и событийEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USART и UARTUSART_SR, USART_DR, USART_BRR, USART_CR1, USART_CR2, USART_CR3
- SPI — интерфейсы SPI и I2SSPI_CR1, SPI_CR2, SPI_SR, SPI_DR, SPI_CRCPR, SPI_RXCRCR
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_DR, I2C_SR1
- TIM — таймерыTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- ADC — аналого-цифровые преобразователиADC_SR, ADC_CR1, ADC_CR2, ADC_SMPR1, ADC_SMPR2, ADC_JOFR1
- IWDG — независимый сторожевой таймерIWDG_KR, IWDG_PR, IWDG_RLR, IWDG_SR
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — блок вычисления CRCCRC_DR, CRC_IDR, CRC_CR
- DBGMCU — регистры отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ