реклама на сайте
подробности

 
 
> STM32 Запуск DMA по внешнему событию без EXTI
Влад Р.
сообщение Jul 20 2016, 10:51
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Здравствуйте!
Собственно, возможно ли в STM32F0 запустить передачу посредством DMA по фронту/спаду сигнала на одном из выходов МК?
Если да, то как в таком случае необходимо сконфигурировать МК?
EXTI не годится. Как оценить время реакции (время между фронтом внешнего сигнала и началом передачи контроллером DMA)?
Посредством DMA будут передаваться данные с одного порта в/в на другой.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Влад Р.
сообщение Jul 22 2016, 12:40
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Написал тестовую программку под STM32F0Discovery, чтобы проверить метод. Возможно кому-то поможет с настройкой.
Пины платы PA8 и PA9, PA10 и PA11 попарно соединены джамперами. На пинах PA8 и PA10 ловлю фронты таймером TIM1 (1 и 3 каналы таймера соответственно). Пины PA10 и PA11 вручную устанавливаю/сбрасываю.
По захвату на каждом из каналов DMA копирует младший или старший байт порта GPIOB (в зависимости от "сработавшего" канала) в старший байт порта GPIOC. В младшем и старшем байтах порта GPIOB записаны такие значения, при копировании которых загорается синий или зеленый светодиоды.
CODE
#include "stm32f0xx.h"
#include <stdint.h>

int main(void)
{
//uint8_t port = 0x01;

RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_DMA1EN;
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;

GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9;
GPIOC->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9);
GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9);
GPIOC->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0;

GPIOA->AFR[1] |= (2 << ((8 - 8) << 2)) | (2 << ((10 - 8) << 2));
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR11;
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_11);
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR11);
GPIOA->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_0 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_0;

DMA1_Channel2->CNDTR = 1;
DMA1_Channel2->CPAR = (uint32_t)&GPIOC->ODR + 1;
DMA1_Channel2->CMAR = (uint32_t)&GPIOB->ODR;
DMA1_Channel2->CCR |= DMA_CCR_EN | DMA_CCR_DIR | DMA_CCR_CIRC | DMA_CCR_PL ; // из CMAR в CPAR, циклическая передача, размер данных - 8 бит

DMA1_Channel5->CNDTR = 1;
DMA1_Channel5->CPAR = (uint32_t)&GPIOC->ODR + 1;
DMA1_Channel5->CMAR = (uint32_t)&GPIOB->ODR + 1;
DMA1_Channel5->CCR |= DMA_CCR_EN | DMA_CCR_DIR | DMA_CCR_CIRC | DMA_CCR_PL; // из CMAR в CPAR, циклическая передача, размер данных - 8 бит

TIM1->CCMR1 |= TIM_CCMR1_CC1S_0; // Настраиваем канал 1 на вход без ремапа, фильтр отключен
TIM1->CCMR2 |= TIM_CCMR2_CC3S_0; // Настраиваем канал 3 на вход без ремапа, фильтр отключен
TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC3E; // Настраиваем каналы 1 и 3 на захват фронта и включаем их
TIM1->DIER |= TIM_DIER_CC1DE | TIM_DIER_CC3DE; // Захваты по каналам 1 и 3 сгенерируют запросы DMA

GPIOB->ODR = 0x0102;

for(;;) {
GPIOA->BSRR = GPIO_BSRR_BR_11 | GPIO_BSRR_BS_9;
for (int i = 0; i < 500; i++)
__NOP();
GPIOA->BSRR = GPIO_BSRR_BR_9 | GPIO_BSRR_BS_11;
for (int i = 0; i < 500; i++)
__NOP();
}
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 02:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016