ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Какой частоты выборок можно достичь при пересылках DMA порт-память на STM32 при условии что вся остальная периферия остановлена ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Зависит от периферии, очевидно. От того, как "быстро" она готова и может поставлять и принимать данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба периферия - GPIO, 8 или 16-бит на макс.скорости Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба периферия - GPIO, 8 или 16-бит на макс.скорости GPIO не может ставить запросы к DMA. Посмотрите документацию к процессору. Можно, конечно, сконфигурировать DMA в режим "память-память", где одной из "память" будет регистр порта. Если передавать, скажем, из "настоящей" памяти (flash/RAM) в этот регистр порта, то на выходах последнего действительно будут происходить изменения в виде "ногодрыгания". А что дальше с этим делать? Кто "оценит"? Или вопрос чисто теоретический? Тогда читайте, как тактируется DMA, и какая скорость транзакций отсюда получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 (изменено) · Жалоба GPIO не может ставить запросы к DMA.запросы не нужны, нужно читать GPIOx_IDR в буфер (как пересылка память-память, ессно без инкремента адреса-источника) на макс.скоростиА что дальше с этим делать?к порту будет подключен параллельный АЦП, с тактированием от HSE-PLL. Интересует сколько циклов уходит на одну пересылку GPIO-память. Изменено 9 марта, 2011 пользователем ukpyr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Интересует сколько циклов уходит на одну пересылку GPIO-память. Такое обычно в даташитах не пишут. Лучше измерить экспериментально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба запросы не нужны, нужно читать GPIOx_IDR в буфер (как пересылка память-память, ессно без инкремента адреса-ихточника) на макс.скоростик порту будет подключен параллельный АЦП, с тактированием от HSE-PLL. Интересует сколько циклов уходит на одну пересылку GPIO-память. Что-то вроде "выборки цифрового сигнала" (digital sampling)? А что потом с кучей полученных данных делать, и самое главное - когда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Что-то вроде "выборки цифрового сигнала"сигнал с внешнего параллельного АЦПА что потом с кучей полученных данных делатьобрабатывать/отображать/передавать в комп, сейчас это не важно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Какой частоты выборок можно достичь при пересылках 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; От размерности данных скорость не зависит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба Получается частота ровно 1 / 10 тактовоймда, удручает. Я надеялся уложиться хотя бы в 3..4 такта на выборку. У Вас в настройках источник GPIOA->ODR. Попробуйте IDR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба У Вас в настройках источник 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КГц, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 9 марта, 2011 Опубликовано 9 марта, 2011 · Жалоба AVR/STM8 даст 8msps Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 10 марта, 2011 Опубликовано 10 марта, 2011 · Жалоба AVR/STM8 даст 8msps У AVR вообще нету никакого DMA. Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=A.N.G.E.R=- 0 10 марта, 2011 Опубликовано 10 марта, 2011 · Жалоба ...Если просто махать ногами, то и stm32 хорошо "поспеет", 1 / 4 от тактовой частоты. Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 10 марта, 2011 Опубликовано 10 марта, 2011 · Жалоба Хм... что-то больше 2МГц при PLL 24МГц не выходит при любых настройках скорости порта 1) Включите оптимизацию (чтобы не грузил каждый раз адрес порта в регистр). 2) Разверните цикл хотя-бы на 4 итерации, чтобы не принимать в расчет время, уходящее на переход к началу цикла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться