Программирование STM32. Часть 11: Копирование массивов через DMA

В этой короткой части мы рассмотрим режим MEM2MEM и научится с помощью DMA копировать одну область памяти в другую. Все примеры, как и всегда, для микроконтроллера stm32f103c8. Предыдущая статья здесь, все статьи цикла можно посмотреть тут: http://dimoon.ru/category/obuchalka/stm32f1.

Режим MEM2MEM имеет три особенности в сравнении с обычным режимом работы DMA, когда мы отправляем какие-либо данные в периферию или принимаем что-либо из нее:

  1. Режим MEM2MEM не требует каких-либо запросов от периферийных модулей. После включения канала DMA процесс передачи начинается сразу.
  2. В регистр адреса памяти DMA_CMARx и регистр адреса периферии DMA_CPARx заносятся адреса областей памяти.
  3. Нельзя одновременно использовать режим MEM2MEM и кольцевой режим CIRC.

Итак, поехали! Для MEM2MEM передачи можно использовать любой свободный канал DMA, для примеры выберем 1-й. Создадим 2 массива data[] и buff[]:

Через DMA будем data[] копировать в buff[]. Инициализируем массивы вот таким образом:

Не забываем включить тактирование DMA1 и на всякий случай отключить выбранный нами канал DMA:

Настройка регистров передачи:

Настройка канала DMA:

Обращаю внимание на направление передачи данных. Так как в регистр адреса памяти мы занесли адрес массива, который собираемся копировать, то направление передачи у нас из «памяти» в «периферию». Ну и еще в сравнении с «обычным» режимом работы канала DMA, тут мы используем и инкремент адреса памяти, и инкремент адреса периферии.

Запустить процесс можно вот такой строчкой:

Полный код функции:

Если посмотреть в отладчике IAR-а значения массивов data[] и buff[], то перед запуском DMA-копирования они имели вот такие значения:

а после завершения процесса вот такие:

Все работает! 🙂

Стоит отметить, что если вместо

сделать вот так:

и в инициализации канала DMA убрать DMA_CCR_DIR:

То все будет работать точно так же.

На этом пока все, продолжение следует! 😉

Продолжение.

Метки: , , , . Закладка Постоянная ссылка.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *