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

Регистры DMA STM32F1

Регистры контроллеров DMA1 и DMA2 STM32F1: настройка канала в CCR, число передач в CNDTR, адреса периферии и памяти в CPAR и CMAR, флаги завершения, половины передачи и ошибок.

У STM32F1 контроллер DMA1 на 7 каналов, а у high-density, XL-density и connectivity line ещё DMA2 на 5 каналов. Запросы периферии закреплены за каналами: у DMA1 канал 1 — ADC1, канал 4 — USART1_TX, канал 5 — USART1_RX (таблица запросов DMA1 в RM0008, глава 13). Включает запрос сама периферия — например, бит DMAT в USART_CR3.

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

Флаги ISR — общий GIF, завершение TCIF, половина передачи HTIF и ошибка TEIF — сбрасываются записью единицы в соответствующий бит IFCR. Тактирование контроллеров включают биты DMA1EN и DMA2EN регистра RCC_AHBENR.

ЭкземплярБазовый адресЕсть у
DMA10x4002 0000всех
DMA20x4002 0400STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107
DMA1_Channel10x4002 0008всех
DMA1_Channel20x4002 001Cвсех
DMA1_Channel30x4002 0030всех
DMA1_Channel40x4002 0044всех
DMA1_Channel50x4002 0058всех
DMA1_Channel60x4002 006Cвсех
DMA1_Channel70x4002 0080всех
DMA2_Channel10x4002 0408STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107
DMA2_Channel20x4002 041CSTM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107
DMA2_Channel30x4002 0430STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107
DMA2_Channel40x4002 0444STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107
DMA2_Channel50x4002 0458STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107

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

РегистрСмещениеНазначениеПосле сброса
DMA_ISR0x00Флаги каналов0x0000 0000
DMA_IFCR0x04Сброс флагов каналов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
  • TEIF1–TEIF7 (по биту на каждый y, положение — на карте битов) — Ошибка передачи канала y.
  • HTIF1–HTIF7 (по биту на каждый y, положение — на карте битов) — Передана половина данных канала y.
  • TCIF1–TCIF7 (по биту на каждый y, положение — на карте битов) — Передача канала y завершена.
  • GIF1–GIF7 (по биту на каждый y, положение — на карте битов) — Общий флаг канала y: установлен любой из TCIF, HTIF, TEIF.

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

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

31302928272625242322212019181716
—CTEIF7CHTIF7CTCIF7CGIF7CTEIF6CHTIF6CTCIF6CGIF6CTEIF5CHTIF5CTCIF5CGIF5
1514131211109876543210
CTEIF4CHTIF4CTCIF4CGIF4CTEIF3CHTIF3CTCIF3CGIF3CTEIF2CHTIF2CTCIF2CGIF2CTEIF1CHTIF1CTCIF1CGIF1
  • CTEIF1–CTEIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага TEIFy записью единицы.
  • CHTIF1–CHTIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага HTIFy записью единицы.
  • CTCIF1–CTCIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага TCIFy записью единицы.
  • CGIF1–CGIF7 (по биту на каждый y, положение — на карте битов) — Сброс флага GIFy записью единицы.

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

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

31302928272625242322212019181716
—
1514131211109876543210
—MEM2MEMPLMSIZEPSIZEMINCPINCCIRCDIRTEIEHTIETCIEEN
  • MEM2MEM (бит 14) — Режим память — память.
  • PL (биты 13:12) — Приоритет канала.
    PLЗначение
    00Низкий
    01Средний
    10Высокий
    11Очень высокий
  • MSIZE (биты 11:10) — Размер данных в памяти.
    MSIZEЗначение
    008 бит
    0116 бит
    1032 бита
    11Зарезервировано
  • PSIZE (биты 9:8) — Размер данных периферии.
    PSIZEЗначение
    008 бит
    0116 бит
    1032 бита
    11Зарезервировано
  • MINC (бит 7) — Увеличение адреса памяти после каждой передачи.
  • PINC (бит 6) — Увеличение адреса периферии после каждой передачи.
  • CIRC (бит 5) — Кольцевой режим: после последней передачи счётчик перезагружается.
  • DIR (бит 4) — Направление передачи.
    DIRЗначение
    0Из периферии в память
    1Из памяти в периферию
  • 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) — Адрес в памяти.

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

Как отправить буфер в USART1 через DMA на STM32F103?

Используйте канал 4 DMA1: DMA1_Channel4->CPAR = (uint32_t)&USART1->DR, CMAR — адрес буфера, CNDTR — длина. В CCR — DIR = 1 (из памяти в периферию) и MINC = 1, размеры по 8 бит. Включите канал битом EN, а в USART1 — бит DMAT регистра CR3.

Как непрерывно забирать результаты АЦП в массив?

ADC1 обслуживает канал 1 DMA1. Запишите в CPAR адрес ADC1->DR, в CMAR — массив, в CNDTR — его длину; в CCR задайте PSIZE и MSIZE по 16 бит, MINC = 1 и CIRC = 1. Кольцевой режим перезапускает канал после последней передачи, а флаги HTIF и TCIF подсказывают, какую половину массива можно обрабатывать.

Как сбросить флаг завершения передачи?

Запишите единицу в бит CTCIFx регистра IFCR: DMA1->IFCR = DMA_IFCR_CTCIF4 для канала 4. Бит CGIFx сбрасывает сразу все флаги канала.

Источники

  1. STMicroelectronics. RM0008: Reference manual (Rev 21) — раздел 13.4: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f1 v4.3.5: заголовки CMSIS stm32f101x6.h, stm32f101xb.h, stm32f101xe.h, stm32f101xg.h, stm32f102x6.h, stm32f102xb.h, stm32f103x6.h, stm32f103xb.h, stm32f103xe.h, stm32f103xg.h, stm32f105xc.h, stm32f107xc.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

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

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

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