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

DMA порт-память на STM32

Какой частоты выборок можно достичь при пересылках DMA порт-память на STM32 при условии что вся остальная периферия остановлена ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зависит от периферии, очевидно. От того, как "быстро" она готова и может поставлять и принимать данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

периферия - GPIO, 8 или 16-бит на макс.скорости

GPIO не может ставить запросы к DMA. Посмотрите документацию к процессору. Можно, конечно, сконфигурировать DMA в режим "память-память", где одной из "память" будет регистр порта. Если передавать, скажем, из "настоящей" памяти (flash/RAM) в этот регистр порта, то на выходах последнего действительно будут происходить изменения в виде "ногодрыгания". А что дальше с этим делать? Кто "оценит"? Или вопрос чисто теоретический? Тогда читайте, как тактируется DMA, и какая скорость транзакций отсюда получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GPIO не может ставить запросы к DMA.
запросы не нужны, нужно читать GPIOx_IDR в буфер (как пересылка память-память, ессно без инкремента адреса-источника) на макс.скорости
А что дальше с этим делать?
к порту будет подключен параллельный АЦП, с тактированием от HSE-PLL. Интересует сколько циклов уходит на одну пересылку GPIO-память.
Изменено пользователем ukpyr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересует сколько циклов уходит на одну пересылку GPIO-память.

Такое обычно в даташитах не пишут. Лучше измерить экспериментально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

запросы не нужны, нужно читать GPIOx_IDR в буфер (как пересылка память-память, ессно без инкремента адреса-ихточника) на макс.скоростик порту будет подключен параллельный АЦП, с тактированием от HSE-PLL. Интересует сколько циклов уходит на одну пересылку GPIO-память.

Что-то вроде "выборки цифрового сигнала" (digital sampling)? А что потом с кучей полученных данных делать, и самое главное - когда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то вроде "выборки цифрового сигнала"
сигнал с внешнего параллельного АЦП
А что потом с кучей полученных данных делать
обрабатывать/отображать/передавать в комп, сейчас это не важно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой частоты выборок можно достичь при пересылках DMA порт-память на STM32 при условии что вся остальная периферия остановлена ?

Провел эксперимент. Получается частота ровно 1 / 10 тактовой, т.е. при 8 МГц данные в порт льются 800КГц.

Код:

  unsigned int i;
  unsigned char buff1[256];

  RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
  GPIOA->CRL= GPIO_CRL_MODE3_1 | GPIO_CRL_MODE3_0 | 
              GPIO_CRL_MODE2_1 | GPIO_CRL_MODE2_0 | 
              GPIO_CRL_MODE1_1 | GPIO_CRL_MODE1_0 | 
              GPIO_CRL_MODE0_1 | GPIO_CRL_MODE0_0;

  for(i=0;i<256;i++)buff1[i]=i;

  RCC->AHBENR|=RCC_AHBENR_DMA1EN;

  DMA1_Channel1->CCR=DMA_CCR1_MEM2MEM | DMA_CCR1_PL_1 | DMA_CCR1_PL_0 | 
                     DMA_CCR1_PINC | DMA_CCR1_CIRC;
                 
  DMA1_Channel1->CNDTR = 256;
  DMA1_Channel1->CPAR = (uint32_t)buff1;
  DMA1_Channel1->CMAR = (uint32_t)&GPIOA->ODR;
  
  DMA1->IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CTCIF1 | DMA_IFCR_CTEIF1; 
  DMA1_Channel1->CCR|=DMA_CCR1_EN;

От размерности данных скорость не зависит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается частота ровно 1 / 10 тактовой
мда, удручает. Я надеялся уложиться хотя бы в 3..4 такта на выборку.

 

У Вас в настройках источник GPIOA->ODR. Попробуйте IDR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас в настройках источник GPIOA->ODR. Попробуйте IDR.

Это не источник, а приемник.

Как измерить скорость передачи именно периферия -> память - ума не приложу :-)

 

Добавлено: измерил. Результат совпадает. Ну может быть совсем чуточку быстрее:

  DMA1_Channel1->CCR=DMA_CCR1_MEM2MEM | DMA_CCR1_PL_1 | DMA_CCR1_PL_0 | 
                     DMA_CCR1_MINC | DMA_CCR1_TCIE;//    | DMA_CCR1_CIRC
                 
  DMA1_Channel1->CNDTR = 200;
  DMA1_Channel1->CMAR = (uint32_t)buff1;
  DMA1_Channel1->CPAR = (uint32_t)&GPIOA->IDR;
  
  DMA1->IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CTCIF1 | DMA_IFCR_CTEIF1; 
  
  GPIOA->ODR=1;
  
  DMA1_Channel1->CCR|=DMA_CCR1_EN;    
  while(! (DMA1->ISR & DMA_ISR_TCIF1));
  
  GPIOA->ODR=0;

Измеренная длина импульса PA0 = 228мкс / 200 = 877КГц,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVR/STM8 даст 8msps

У AVR вообще нету никакого DMA. Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты.

Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта

1) Включите оптимизацию (чтобы не грузил каждый раз адрес порта в регистр).

2) Разверните цикл хотя-бы на 4 итерации, чтобы не принимать в расчет время, уходящее на переход к началу цикла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...