Управляйте скоростью прямого доступа к памяти ARM Cortex M3/M4 к периферийным устройствам.

Я хочу передавать данные побайтно из ОЗУ в порт (выводы GPIO) на ARM Cortex M3 (и, возможно, в будущем M4).

Есть ли способ контролировать скорость относительно скорости шины?

то есть, если я запускаю M3 на частоте 100 МГц, могу ли я, например, использовать DMA на частоте 10 МГц?


person fadedbee    schedule 09.04.2015    source источник
comment
Cortex-M3 — это просто ядро ​​​​процессора — не зная, частью какого MCU является этот M3, никто не знает, какое у вас аппаратное обеспечение контроллера DMA и, следовательно, на что оно способно. Кроме того, вы говорите об записи в контроллер GPIO, происходящей на частоте 10 МГц, или об изменении данных на внешних выводах на частоте 10 МГц? Первое кажется немного странным, а для второго есть одно очевидное гетто-решение — просто напишите каждое слово 10 раз. Для этого, независимо от того, должны ли вы дублировать данные вручную или контроллер DMA может сделать это за вас, я возвращаюсь к первому пункту.   -  person Notlikethat    schedule 09.04.2015
comment
@Notlikethat: передача DMA занимает намного больше одного тактового цикла, и точное время не является детерминированным в полезном смысле.   -  person Pait    schedule 27.04.2015


Ответы (1)


Есть ли способ контролировать скорость относительно скорости шины?

Используйте таймер для запуска передачи DMA.

если я использую M3 на частоте 100 МГц, могу ли я, например, использовать DMA на частоте 10 МГц?

Зависит от реализации микроконтроллеров GPIO, DMA и таймера. Обычно это не периферийные устройства, предоставляемые ARM — поставщики реализуют их по-разному.

person Turbo J    schedule 09.04.2015
comment
Я хочу контролировать скорость передачи DMA. Пожалуйста, поправьте меня, но разве использование таймера для запуска передачи DMA не будет контролировать только ее начало? (Если только я не использую несколько 1-байтовых передач DMA, управляемых таймером, или это ваша точка зрения?) - person fadedbee; 14.04.2015
comment
В зависимости от вашего MCU, DMA может поддерживать постинкрементирование указателя памяти или периферийного устройства, так что после каждой транзакции указатель увеличивается на единицу. Таким образом, каждый раз, когда таймер запускает DMA, он будет передавать один байт/полуслово/слово в GPIO, а затем увеличивать указатель исходной памяти на единицу. Вы можете настроить его так, чтобы он останавливался после определенного количества байтов или переходил в циклический режим буфера. Как сказал Turbo J, все зависит от того, что поддерживает ваш конкретный микроконтроллер Cortex-M3. - person Tony K; 19.04.2015
comment
@chisdew Вам следует либо уточнить свой конкретный микроконтроллер, чтобы получить более подробный ответ, либо принять этот. - person Pait; 27.04.2015