ST содержит некоторые замечания по применению, в которых говорится об эмуляции параллельной шины с использованием DMA для GPIO. Я ценю это, но это не отвечает на важные вопросы. Я просматриваю справочное руководство и, похоже, не могу выяснить, что меня беспокоит.
Меня больше всего беспокоит дрожание. В справочном руководстве неоднократно указывается, что при запуске DMA (например, таймером) контроллер DMA считывает память и передает значение на периферийное устройство. Это может быть хорошо с периферийными устройствами, которые имеют свой собственный FIFO. Там, когда в FIFO есть свободное место, DMA срабатывает и заполняет FIFO. Это, вероятно, произойдет до того, как FIFO станет пустым.
Но с GPIO, если каналы DMA не имеют самого FIFO, данные не будут готовы, когда сработает таймер, и их нужно будет извлечь из SRAM. , Таким образом, между срабатыванием таймера и значением, фактически поступающим в выходной регистр GPIO, может пройти некоторое время. Это может быть измеримо, если смотреть на выходной сигнал таймера и выводы GPIO. Контроллер DMA должен конкурировать за доступ к SRAM с запущенной программой, поэтому некоторые действия программы могут увеличить дрожание.
Может быть, это колоссальный упущение с моей стороны, но справочное руководство ST не дает Кажется, упомянуть FIFO как часть DMA. Если это так, то это может привести к джиттеру, который может повлиять на производительность на более высоких частотах.
Мне нужно синхронно переключать 3-4 контакта на тактовую частоту от 100 кГц до 1 МГц. Я рассматриваю DMA для GPIO, а также злоупотребляю контроллером QuadSPI. В настоящее время я тестирую на STM32L4, но я также рассматриваю STM32F4 или даже F1.