STM32F103C8T6 - Timer DMA GPIO
Запись от locm размещена 06.03.2018 в 23:58
Показов 22119
Комментарии 5
|
У модуля DMA довольно простая задача - копировать данные из одного места в другое с заданными настройками. Запустить копирование можно несколькими способами, как программно, так и аппаратно событием от периферии. Сейчас пойдет речь о запуске DMA по событию от таймера. Для примера сделаем полностью аппаратную "мигалку светодиодом" подключенную к порту PC13. Код.
В функции Config сперва настраивается порт PC13 для работы на выход. Далее второй канал модуля DMA1 конфигурируется таким образом чтобы при запуске каждой транзакции DMA, данные копировались из массива DmaBuff в регистр ODR порта GPIOC. Работа производится циклически и как только будет достигнут конец массива, копирование начнется сначала. После настраивается таймер TIM2 таким образом чтобы он переполнялся раз в секунду и разрешается генерация события от переполнения. Затем разрешается запуск транзакций DMA от события переполнения таймера TIM2 и разрешаются работа второго канала модуля DMA1 и таймера. После всех этих действий, таймер начинает работать и генерировать события каждую секунду, от которого запускается работа DMA и копирование данных из массива в порт. Вот таким довольно простым методом можно сделать полностью аппаратную "мигалку светодиодом". Светодиод мигает, а процессор занимается своими делами. Но у этого метода есть существенный недостаток - запись в регистр ODR влияет на весь порт, а не на отдельные выходы. Чтобы избавится от этого недостатка, нужно использовать вместо ODR, регистр BSRR. Это 32-ух битный регистр, в котором старшие 16 бит используются установки логического 0 на выводах порта, а младшие 16 бит - для установки логической 1. Такой метод позволяет изменять состояние одного или нескольких выводов порта не затрагивая остальные. Для этого в код нужно внести небольшие изменения. Объявление массива.
Подобным методом можно не только выводить данные в порт, но и считывать из него, что позволит аппаратно реализовать работу например с 1-Wire, DHT22 и др устройствами. Программа тестировалась на "китайской" плате. | |||||||||||||||
Размещено в Микроконтроллеры
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 5
Комментарии
-
Если можно намекните как это сделать
желательно по внешнему прерыванию...Запись от Khludenkov размещена 12.03.2018 в 09:01
-
Необходимо заменить адрес регистра ODR, на IDR.
Указать что источник данных - периферия, заменив DMA_DIR_PeripheralDST на DMA_DIR_PeripheralSRC.
Дальнейшие действия зависят от того что в итоге нужно получить. Возможно таймер в режиме захвата совместно с DMA лучше подойдет для этой задачи.Запись от locm размещена 12.03.2018 в 16:26
-
Спасибо!
Т.е. можно сделать тактирование таймера от внешнего вывода и на каждый его такт делать прерывание...Запись от Khludenkov размещена 13.03.2018 в 08:53
-
Напишите (лучше на форуме в разделе микроконтроллеров) максимально подробно что требуется. Потому что при такой постановке вопроса, наиболее подходящим будет внешние прерывание (без использования таймера).Запись от locm размещена 13.03.2018 в 13:23
-
Запись от Khludenkov размещена 13.03.2018 в 15:19


