Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

GPIO+DMA stm32f429

Пт янв 26, 2018 20:49:47

Всем привет! Столкнулся с задачей скоростного считывания ног порта. Завёл всё через DMA, копируют по одному младшему байта в массив с инкрементом. Проц работает на заявленной максимуме (180 МГц).
Но, вот беда, получилось только раскачать на 50 МГц, хотя в даташите пишут, что можно до 90 считывать.
Подскажите, можно ли настройками поднять скорость считывания я повыше?
Или же придётся камень менять?
Добавлю, что раскачал в режиме оверклока до 240 МГц, скорость считывания поднялась примерно до 66.
Заранее спасибо!

Re: GPIO+DMA stm32f429

Пт янв 26, 2018 21:06:55

С GPIO меньше 4 тактов не получишь, быстрее только через DCMI, побайтно можно за 2 такта забирать, больше - за 3.

Re: GPIO+DMA stm32f429

Пт янв 26, 2018 22:02:45

Но 2 такта - это 45 МГц, а я несколько раз проверял - ровно 50 получается. Может, это ограничение GPIO?
UPD: 4 такта
Последний раз редактировалось allplayer Пт янв 26, 2018 22:47:42, всего редактировалось 1 раз.

Re: GPIO+DMA stm32f429

Пт янв 26, 2018 22:19:43

Хм, на всякий случай проверил на F429 и неожиданно получил 3 такта, хотя для F407 тот же код дает 4. Это странно, ведь у них даже RM один...

Re: GPIO+DMA stm32f429

Пт янв 26, 2018 23:19:21

Хм, на всякий случай проверил на F429 и неожиданно получил 3 такта, хотя для F407 тот же код дает 4. Это странно, ведь у них даже RM один...

3 такта на DMA+GPIO?
Или же с DCMI?

Re: GPIO+DMA stm32f429

Пт янв 26, 2018 23:24:30

3 такта на DMA+GPIO?
Или же с DCMI?

DMA+GPIO.

ps. Это если после запуска DMA мк усыплять командой __WFI(), иначе будет 4 такта, а на F407 было 4 и с WFI.

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 07:22:26

На сайте производителя написано:
Up to 164 fast I/Os up to 90 MHz

До 164 быстрых ИОшек со скоростью до 90 МГц.
Что производитель имеет ввиду? В каком режиме получить 90 МГц?

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 10:05:40

До 164 быстрых ИОшек со скоростью до 90 МГц.
Что производитель имеет ввиду? В каком режиме получить 90 МГц?

Можешь на ассме написать, выводишь константы сохраненные в регистрах в порт, тогда по идее должно быть 2 такта, а если из массива выводить, то уже 4.

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 10:13:39

Мне бы хотелось получить чтение порта (8 бит) со скоростью 90 мегасемплов (2 такта), вывести в оверклок и поднять считывание до 100 мегасемплов. Но это получится провернуть только для записи в одну переменную. Если мне нужно пихать в массив, то придется инкрементировать адрес (еще +2 такта=4), я всё правильно понял?

А если запараллелить 2 порта, получится ли настроить GPIO и DMA так, чтобы сдвиг между считыванием данных был 2 такта и я смог каждый четный байт массива записывать из порта GPIOA, а каждый нечетный с порта GPIOB, например?

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 10:25:53

Мне бы хотелось получить чтение порта (8 бит) со скоростью 90 мегасемплов (2 такта), вывести в оверклок и поднять считывание до 100 мегасемплов. Но это получится провернуть только для записи в одну переменную. Если мне нужно пихать в массив, то придется инкрементировать адрес (еще +2 такта=4), я всё правильно понял?

Инкремент адреса - это мелочи, главное каждое значение прочитанное в регистр придется сохранять еще и в памяти.

А если запараллелить 2 порта, получится ли настроить GPIO и DMA так, чтобы сдвиг между считыванием данных был 2 такта и я смог каждый четный байт массива записывать из порта GPIOA, а каждый нечетный с порта GPIOB, например?

Нет. И зачем вообще такое делать, если порты 16-ти битные и можно обойтись одним? Читай за 3 такта 16 бит, даже в таком случае можно получить 100 MSPS если разогнать мк до 300 MHz, а у меня он на них работает. По крайней мере 90 MSPS ты таким образом получишь точно. Если достаточно 8 бит, то бери DCMI...

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 10:38:26

Мне бы хотелось получить чтение порта (8 бит) со скоростью 90 мегасемплов (2 такта), вывести в оверклок и поднять считывание до 100 мегасемплов. Но это получится провернуть только для записи в одну переменную. Если мне нужно пихать в массив, то придется инкрементировать адрес (еще +2 такта=4), я всё правильно понял?

Инкремент адреса - это мелочи, главное каждое значение прочитанное в регистр придется сохранять еще и в памяти.

А если запараллелить 2 порта, получится ли настроить GPIO и DMA так, чтобы сдвиг между считыванием данных был 2 такта и я смог каждый четный байт массива записывать из порта GPIOA, а каждый нечетный с порта GPIOB, например?

Нет. И зачем вообще такое делать, если порты 16-ти битные и можно обойтись одним? Читай за 3 такта 16 бит, даже в таком случае можно получить 100 MSPS если разогнать мк до 300 MHz, а у меня он на них работает. По крайней мере 90 MSPS ты таким образом получишь точно. Если достаточно 8 бит, то бери DCMI...


Я уже читаю инфу по DCMI. Подтолкните, пожалуйста, с чего лучше начать?
Я так понимаю, что в режиме DCMI мне придется подцепить и внешнее тактирование?

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 10:54:28

Я уже читаю инфу по DCMI. Подтолкните, пожалуйста, с чего лучше начать?
Я так понимаю, что в режиме DCMI мне придется подцепить и внешнее тактирование?

DCMI очень простой, там всего один CR для настройки и, насколько я помню, для 8 бит в нем достаточно только бит разрешения захвата включить. 90 MHz придется самому генерить, потом еще для старта нужно короткий импульс на вход VSYNC подать. И усыплять мк тоже придется, на таких скоростях любая активность добавляет тормоза.

Re: GPIO+DMA stm32f429

Сб янв 27, 2018 23:07:29

Если мне нужно пихать в массив, то придется инкрементировать адрес (еще +2 такта=4), я всё правильно понял?

Программно не получится: нужна как минимум одна инструкция чтения памяти (GPIO) - это два такта, и одна - записи в ОЗУ - ещё 2 такта. Даже с многословными инструкциями - никак.

А если запараллелить 2 порта, получится ли настроить GPIO и DMA так, чтобы сдвиг между считыванием данных был 2 такта и я смог каждый четный байт массива записывать из порта GPIOA, а каждый нечетный с порта GPIOB, например?

Можно попробовать. Только зачем разные порты если оба DMA-канала можно натравить на один GPIO?
Генерить сигналы событий к DMA от таймеров со сдвигом 2 такта.
Хотя всё это ненадёжно очень.
Лучше взять LPC43xx - у него есть порт SGPIO, он штатно работает на частоте до 204МГц. Без всяких оверклоков.
И при этом у SGPIO имеется FIFO. И до 16 входных линий.

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 09:21:42

Я перечитал на форуме много сообщений на тему самодельных осциллографов на базе stm32f4, где используют 100 МГц-й АЦП, успешно с него считывают, при этом успевая еще и на экран графики вывести. Но, вот беда, не смог я увидеть, каким образом идет считывание. И генерации на 100 МГц я нигде не увидел :dont_know:

Кстати, да: Прикупил генератор на 50 МГц (больше просто не было в наличии). И при тактировании в 150 МГц получил как раз 50М измерений в секунду через DCMI без режимов спячки.
В принципе, если проц не помрёт от оверклока 180->300 МГц, то и нормально будет :)))

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 10:39:07

Кстати, да: Прикупил генератор на 50 МГц (больше просто не было в наличии). И при тактировании в 150 МГц получил как раз 50М измерений в секунду через DCMI без режимов спячки.
В принципе, если проц не помрёт от оверклока 180->300 МГц, то и нормально будет :)))

Мк усыпляют еще и чтобы от помех избавиться, да и что ты будешь делать непосредственно во время оцифровки?

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 11:13:24

STM32F446 разогнан до 240 мГц.
DCMI через DMA работает до 120мГц стабильно.
Клок для АЦП Port A8 OUT MCO.
На 60 мГц и ниже тактирование по таймеру.

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 11:21:04

Клок для АЦП Port A8 OUT MCO.
На 60 мГц и ниже тактирование по таймеру.

А для чего MCO, если таймер и так может F/2 выдавать?

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 11:45:12

Reflector:
На таймере сразу не получилось. Макс. 60 мГц при Prescaler = 0 и Period = 1 (TIM1)
Не стал дальше копать и подключил MCO.

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 12:44:58

На таймере сразу не получилось. Макс. 60 мГц при Prescaler = 0 и Period = 1 (TIM1)
Не стал дальше копать и подключил MCO.

У меня генераторы сконфигурированы как ШИМы, но, естественно, так можно генерить и меандр. Для F/2 нужны ARR и CCR равные 1/1, для F/4 - 3/2 и т.д.... А если таймер настроить в режиме инверсии, тогда минимальная частота уже действительно будет F/4. Естественно нужно выбирать быстрые таймеры сидящие на APB2 или для APB1 ставить делитель 2, хотя практика показывает можно спокойно везде ставить 1 :)

Re: GPIO+DMA stm32f429

Вс янв 28, 2018 14:52:24

Кстати, да: Прикупил генератор на 50 МГц (больше просто не было в наличии). И при тактировании в 150 МГц получил как раз 50М измерений в секунду через DCMI без режимов спячки.
В принципе, если проц не помрёт от оверклока 180->300 МГц, то и нормально будет :)))

Мк усыпляют еще и чтобы от помех избавиться, да и что ты будешь делать непосредственно во время оцифровки?


Разве могут быть помехи, если у меня внешний АЦП продавливает ноги порта?

Добавлено after 17 minutes 16 seconds:
Кстати, да: Прикупил генератор на 50 МГц (больше просто не было в наличии). И при тактировании в 150 МГц получил как раз 50М измерений в секунду через DCMI без режимов спячки.
В принципе, если проц не помрёт от оверклока 180->300 МГц, то и нормально будет :)))

Мк усыпляют еще и чтобы от помех избавиться, да и что ты будешь делать непосредственно во время оцифровки?


Мне надо начать оцифровку и подать 2 независимых импульса (дернуть друг за другом 2 ноги) длительностью 100нс. А потом можно и поспать :hunger:
Ответить