777777 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания. Как это может быть? Разве DMA не может захватить шину в любой нужный ему момент времени? Или при обработке прерывания запрещаются не только другие прерывания, но и DMA? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin. С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду. ЦАП внешний, будет висеть на FSMC. Контроллер заложил из серии STM32F200. Если верить описанию bus matrix, там DMA и процессор не должны друг другу мешать, тем более есть FIFO. Надеюсь, не разочаруюсь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать. С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix, т.е. точно никому не мешает. А прерывания отличаются от опроса разве что наличием сохранения/загрузки контекста, вот тут утверждать не буду, но предположу, что блочное сохранение регистров может быть burst-ом на шине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буян 0 13 октября, 2011 Опубликовано 13 октября, 2011 (изменено) · Жалоба Выводится аналоговый сигнал в ЦАП с помощью 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. Может дело в том что именно в прерывании идёт обращение к тому же куску адресного пространства (или шине), на которое претендует и ПДП. И поэтому только здесь происходит чередование. Изменено 13 октября, 2011 пользователем Юрий_СВ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду. 10 MHz? И не пытайся. Контроллер заложил из серии STM32F200. 200-й конечно побыстрее немного. Попробуй, нам расскажешь. ЦАП внешний, будет висеть на FSMC. А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой? С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix И правда - ведь ICode сделана отдельной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба 10 MHz? И не пытайся. Поясни. 200-й конечно побыстрее немного. Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO. А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой? Время записи в GPIO неизвестно. Про FSMC гораздо больше ясности. Кроме того, FSMC не будет конфликтовать с другой периферией (см. схему bus matrix). Возможно, попробую и то, и другое. ЦАП AD5424. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Время записи в GPIO неизвестно. Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр) Отличная новость! Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 октября, 2011 Опубликовано 13 октября, 2011 · Жалоба Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO. Я пока знаю только то, что у него больше частота. ЦАП AD5424. Но это же всего 8 бит?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 15 октября, 2011 Опубликовано 15 октября, 2011 · Жалоба Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZiB 0 16 октября, 2011 Опубликовано 16 октября, 2011 · Жалоба какая частота ядра? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 17 октября, 2011 Опубликовано 17 октября, 2011 · Жалоба Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти. А как сохранение регистров может этому помешать? Почему бы DMA не прервать этот процесс посередине? какая частота ядра? Обычная - 72 МГц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Galizin 0 18 октября, 2011 Опубликовано 18 октября, 2011 (изменено) · Жалоба Может кроме DMA использовать таймер дополнительно. ДМА будет писать в теневой регистр. По таймеру аппаратно будет запускаться DAC - данные из теневого регистра будут переноситься регистр DAC. Нужно реализовать небольшое отставание записи данных в DAC от запуска самого преобразования. Тогда сигнал будет выводится с отставанием почти в период, зато случайные небольшие задержки не будут влиять на результат - есть почти целый период, что бы выполнить эту операцию. Если ЦАП внешний возможно придется организовать внешнюю защелку. Из защелки в DAC данные должны попадать по сигналу таймера (ШИМ). Изменено 18 октября, 2011 пользователем Oleg Galizin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться