|
DMA порт-память на STM32, какой скорости можно достичь |
|
|
|
Mar 9 2011, 11:13
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(ukpyr @ Mar 9 2011, 10:47)  периферия - GPIO, 8 или 16-бит на макс.скорости GPIO не может ставить запросы к DMA. Посмотрите документацию к процессору. Можно, конечно, сконфигурировать DMA в режим "память-память", где одной из "память" будет регистр порта. Если передавать, скажем, из "настоящей" памяти (flash/RAM) в этот регистр порта, то на выходах последнего действительно будут происходить изменения в виде "ногодрыгания". А что дальше с этим делать? Кто "оценит"? Или вопрос чисто теоретический? Тогда читайте, как тактируется DMA, и какая скорость транзакций отсюда получается.
|
|
|
|
|
Mar 9 2011, 11:36
|
Профессионал
    
Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347

|
Цитата GPIO не может ставить запросы к DMA. запросы не нужны, нужно читать GPIOx_IDR в буфер (как пересылка память-память, ессно без инкремента адреса-источника) на макс.скорости Цитата А что дальше с этим делать? к порту будет подключен параллельный АЦП, с тактированием от HSE-PLL. Интересует сколько циклов уходит на одну пересылку GPIO-память.
Сообщение отредактировал ukpyr - Mar 9 2011, 11:37
|
|
|
|
|
Mar 9 2011, 14:41
|
Профессионал
    
Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347

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

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(ukpyr @ Mar 9 2011, 12:00)  Какой частоты выборок можно достичь при пересылках 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; От размерности данных скорость не зависит
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Mar 9 2011, 19:00
|
Профессионал
    
Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347

|
Цитата Получается частота ровно 1 / 10 тактовой мда, удручает. Я надеялся уложиться хотя бы в 3..4 такта на выборку. У Вас в настройках источник GPIOA->ODR. Попробуйте IDR.
|
|
|
|
|
Mar 9 2011, 19:19
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(ukpyr @ Mar 10 2011, 00:00)  У Вас в настройках источник 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КГц,
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Mar 10 2011, 05:12
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(ukpyr @ Mar 10 2011, 01:38)  AVR/STM8 даст 8msps У AVR вообще нету никакого DMA. Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты.
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Mar 10 2011, 06:27
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 140

|
Цитата(InsolentS @ Mar 10 2011, 09:12)  ...Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты. Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта
|
|
|
|
|
Mar 10 2011, 07:23
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(-=A.N.G.E.R=- @ Mar 10 2011, 11:27)  Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта 1) Включите оптимизацию (чтобы не грузил каждый раз адрес порта в регистр). 2) Разверните цикл хотя-бы на 4 итерации, чтобы не принимать в расчет время, уходящее на переход к началу цикла.
--------------------
Курильщик даташитов со стажем
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|