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

Регистры DMA STM32F0

Регистры DMA STM32F0: флаги завершения, половины и ошибки по каналам, их сброс, настройка канала — направление, приращение адресов, размер данных, кольцевой режим, приоритет, — число передач и адреса.

DMA STM32F0 — канальный, как у STM32F1: у DMA1 пять или семь каналов, у STM32F09x есть ещё DMA2 на пять каналов. Каждый канал обслуживает закреплённые за ним запросы периферии; у STM32F03x–F07x часть запросов переносится на другой канал битами *_DMA_RMP в SYSCFG_CFGR1, у STM32F09x запрос каждого канала выбирается в регистре DMA_CSELR (RM0091, раздел 10.3).

Канал настраивают при EN = 0: адрес периферии в CPAR, адрес памяти в CMAR, число передач в CNDTR, затем CCR с направлением DIR, приращением MINC, размерами PSIZE и MSIZE и, если нужно, кольцевым режимом CIRC. Флаги сбрасываются записью 1 в DMA_IFCR.

ЭкземплярБазовый адресЕсть у
DMA10x4002 0000всех
DMA20x4002 0400STM32F091, STM32F098
DMA1_Channel10x4002 0008всех
DMA1_Channel20x4002 001Cвсех
DMA1_Channel30x4002 0030всех
DMA1_Channel40x4002 0044всех
DMA1_Channel50x4002 0058всех
DMA1_Channel60x4002 006CSTM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098
DMA1_Channel70x4002 0080STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098
DMA2_Channel10x4002 0408STM32F091, STM32F098
DMA2_Channel20x4002 041CSTM32F091, STM32F098
DMA2_Channel30x4002 0430STM32F091, STM32F098
DMA2_Channel40x4002 0444STM32F091, STM32F098
DMA2_Channel50x4002 0458STM32F091, STM32F098

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

РегистрСмещениеНазначениеПосле сброса
DMA_ISR0x00Флаги прерываний каналов0x0000 0000
DMA_IFCR0x04Сброс флагов каналов0x0000 0000
DMA_CSELR0xA8Выбор запросов каналов (STM32F09x)0x0000 0000
DMA_CCR0x00Настройка канала0x0000 0000
DMA_CNDTR0x04Число передач0x0000 0000
DMA_CPAR0x08Адрес периферии0x0000 0000
DMA_CMAR0x0CАдрес памяти0x0000 0000

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

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

Значение: 0x00000000

0000 0000 0000 0000 0000 0000 0000 0000

DMA1->ISR = 0x00000000;

DMA_ISR — флаги прерываний каналов

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

31302928272625242322212019181716
—TEIF7HTIF7TCIF7GIF7TEIF6HTIF6TCIF6GIF6TEIF5HTIF5TCIF5GIF5
1514131211109876543210
TEIF4HTIF4TCIF4GIF4TEIF3HTIF3TCIF3GIF3TEIF2HTIF2TCIF2GIF2TEIF1HTIF1TCIF1GIF1
  • TEIF7 (бит 27) — Ошибка передачи канала 7 (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • TEIF6 (бит 23) — Ошибка передачи канала 6 (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • HTIF7 (бит 26) — Передана половина данных канала 7 (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • HTIF6 (бит 22) — Передана половина данных канала 6 (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • TCIF7 (бит 25) — Передача канала 7 завершена (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • TCIF6 (бит 21) — Передача канала 6 завершена (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • GIF7 (бит 24) — Общий флаг канала 7: установлен любой из TCIF, HTIF, TEIF (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • GIF6 (бит 20) — Общий флаг канала 6: установлен любой из TCIF, HTIF, TEIF (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • TEIF1–TEIF5 (по биту на каждый y, положение — на карте битов) — Ошибка передачи канала y.
  • HTIF1–HTIF5 (по биту на каждый y, положение — на карте битов) — Передана половина данных канала y.
  • TCIF1–TCIF5 (по биту на каждый y, положение — на карте битов) — Передача канала y завершена.
  • GIF1–GIF5 (по биту на каждый y, положение — на карте битов) — Общий флаг канала y: установлен любой из TCIF, HTIF, TEIF.

DMA_IFCR — сброс флагов каналов

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

31302928272625242322212019181716
—CTEIF7CHTIF7CTCIF7CGIF7CTEIF6CHTIF6CTCIF6CGIF6CTEIF5CHTIF5CTCIF5CGIF5
1514131211109876543210
CTEIF4CHTIF4CTCIF4CGIF4CTEIF3CHTIF3CTCIF3CGIF3CTEIF2CHTIF2CTCIF2CGIF2CTEIF1CHTIF1CTCIF1CGIF1
  • CTEIF7 (бит 27) — Сброс флага TEIF7 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CTEIF6 (бит 23) — Сброс флага TEIF6 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CHTIF7 (бит 26) — Сброс флага HTIF7 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CHTIF6 (бит 22) — Сброс флага HTIF6 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CTCIF7 (бит 25) — Сброс флага TCIF7 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CTCIF6 (бит 21) — Сброс флага TCIF6 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CGIF7 (бит 24) — Сброс флага GIF7 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CGIF6 (бит 20) — Сброс флага GIF6 записью единицы (только у STM32F042, STM32F048, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098).
  • CTEIF1–CTEIF5 (по биту на каждый y, положение — на карте битов) — Сброс флага TEIFy записью единицы.
  • CHTIF1–CHTIF5 (по биту на каждый y, положение — на карте битов) — Сброс флага HTIFy записью единицы.
  • CTCIF1–CTCIF5 (по биту на каждый y, положение — на карте битов) — Сброс флага TCIFy записью единицы.
  • CGIF1–CGIF5 (по биту на каждый y, положение — на карте битов) — Сброс флага GIFy записью единицы.

DMA_CSELR — выбор запросов каналов (STM32F09x)

Смещение 0xA8, 32 бит, после сброса 0x0000 0000; регистр есть только у STM32F091, STM32F098. В коде: DMA1->CSELR.

31302928272625242322212019181716
—C7SC6SC5S
1514131211109876543210
C4SC3SC2SC1S
  • C7S (биты 27:24) — Номер запроса периферии для канала 7 (таблица в разделе 10.3.2 RM0091).
  • C6S (биты 23:20) — Номер запроса периферии для канала 6 (таблица в разделе 10.3.2 RM0091).
  • C5S (биты 19:16) — Номер запроса периферии для канала 5 (таблица в разделе 10.3.2 RM0091).
  • C4S (биты 15:12) — Номер запроса периферии для канала 4 (таблица в разделе 10.3.2 RM0091).
  • C3S (биты 11:8) — Номер запроса периферии для канала 3 (таблица в разделе 10.3.2 RM0091).
  • C2S (биты 7:4) — Номер запроса периферии для канала 2 (таблица в разделе 10.3.2 RM0091).
  • C1S (биты 3:0) — Номер запроса периферии для канала 1 (таблица в разделе 10.3.2 RM0091).

DMA_CCR — настройка канала

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

31302928272625242322212019181716
—
1514131211109876543210
—MEM2MEMPLMSIZEPSIZEMINCPINCCIRCDIRTEIEHTIETCIEEN
  • MEM2MEM (бит 14) — Режим память — память.
  • PL (биты 13:12) — Приоритет канала.
  • MSIZE (биты 11:10) — Размер данных в памяти.
  • PSIZE (биты 9:8) — Размер данных периферии.
  • MINC (бит 7) — Увеличение адреса памяти после каждой передачи.
  • PINC (бит 6) — Увеличение адреса периферии после каждой передачи.
  • CIRC (бит 5) — Кольцевой режим: после последней передачи счётчик перезагружается.
  • DIR (бит 4) — Направление передачи.
  • TEIE (бит 3) — Прерывание по ошибке передачи.
  • HTIE (бит 2) — Прерывание по передаче половины данных.
  • TCIE (бит 1) — Прерывание по завершении передачи.
  • EN (бит 0) — Включение канала.

DMA_CNDTR — число передач

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

31302928272625242322212019181716
—
1514131211109876543210
NDT
  • NDT (биты 15:0) — Число передач: 0…65535, уменьшается после каждой.

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

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

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

DMA_CMAR — адрес памяти

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

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

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

Какой канал DMA у USART1 RX на STM32F030?

Канал 3, а при USART1RX_DMA_RMP = 1 в SYSCFG_CFGR1 — канал 5. Таблица запросов по каналам — в разделе 10.3.2 RM0091.

Как запустить приём по DMA в кольцевом режиме?

CPAR = &USART1->RDR, CMAR = буфер, CNDTR = размер, CCR = MINC | CIRC | EN (DIR = 0 — из периферии). В USART установите CR3.DMAR. Текущую позицию даёт размер минус CNDTR.

Источники

  1. STMicroelectronics. RM0091: Reference manual (Rev 10) — раздел 10.6: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f0 v2.3.8: заголовки CMSIS stm32f031x6.h, stm32f038xx.h, stm32f042x6.h, stm32f048xx.h, stm32f051x8.h, stm32f058xx.h, stm32f071xb.h, stm32f072xb.h, stm32f078xx.h, stm32f091xc.h, stm32f098xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

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

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

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