Перейти к содержанию
    

Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания. Как это может быть? Разве DMA не может захватить шину в любой нужный ему момент времени? Или при обработке прерывания запрещаются не только другие прерывания, но и DMA?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin.

С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду. ЦАП внешний, будет висеть на FSMC. Контроллер заложил из серии STM32F200. Если верить описанию bus matrix, там DMA и процессор не должны друг другу мешать, тем более есть FIFO. Надеюсь, не разочаруюсь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать.

С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix, т.е. точно никому не мешает. А прерывания отличаются от опроса разве что наличием сохранения/загрузки контекста, вот тут утверждать не буду, но предположу, что блочное сохранение регистров может быть burst-ом на шине.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания. Как это может быть? Разве DMA не может захватить шину в любой нужный ему момент времени? Или при обработке прерывания запрещаются не только другие прерывания, но и DMA?

13.3 DMA functional description

The DMA controller performs direct memory transfer by sharing the system bus with the

Cortex™-M3 core. The DMA request may stop the CPU access to the system bus for some

bus cycles, when the CPU and DMA are targeting the same destination (memory or

peripheral). The bus matrix implements round-robin scheduling, thus ensuring at least half

of the system bus bandwidth (both to memory and peripheral) for the CPU.

Может дело в том что именно в прерывании идёт обращение к тому же куску адресного пространства (или шине), на которое претендует и ПДП. И поэтому только здесь происходит чередование.

Изменено пользователем Юрий_СВ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду.

10 MHz? И не пытайся.

Контроллер заложил из серии STM32F200.

200-й конечно побыстрее немного. Попробуй, нам расскажешь.

ЦАП внешний, будет висеть на FSMC.

А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой?

 

С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix

И правда - ведь ICode сделана отдельной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 MHz? И не пытайся.

Поясни.

 

200-й конечно побыстрее немного.

Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO.

 

А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой?

Время записи в GPIO неизвестно. Про FSMC гораздо больше ясности. Кроме того, FSMC не будет конфликтовать с другой периферией (см. схему bus matrix). Возможно, попробую и то, и другое.

ЦАП AD5424.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Время записи в GPIO неизвестно.

Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр)

Отличная новость! Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO.

Я пока знаю только то, что у него больше частота.

ЦАП AD5424.

Но это же всего 8 бит?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти.

А как сохранение регистров может этому помешать? Почему бы DMA не прервать этот процесс посередине?

 

какая частота ядра?

Обычная - 72 МГц

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кроме DMA использовать таймер дополнительно. ДМА будет писать в теневой регистр. По таймеру аппаратно будет запускаться DAC - данные из теневого регистра будут переноситься регистр DAC. Нужно реализовать небольшое отставание записи данных в DAC от запуска самого преобразования. Тогда сигнал будет выводится с отставанием почти в период, зато случайные небольшие задержки не будут влиять на результат - есть почти целый период, что бы выполнить эту операцию.

Если ЦАП внешний возможно придется организовать внешнюю защелку. Из защелки в DAC данные должны попадать по сигналу таймера (ШИМ).

Изменено пользователем Oleg Galizin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...