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

Коллеги, нужен совет.

 

Хочу с помощью имеющихся в МК К1986ВЕ92QI ЦАП и DMA генерировать синус 2 кГц.

Для своих целей я задействовал таймер 1. Когда происходит событие CNT=ARR, формируется запрос DMA, и DMA-контроллер должен очередное табличное значение функции отправить в ЦАП.

У контроллера DMA есть несколько режимов работы: основной, автозапрос, пинг-понг и др. Из документации не совсем ясна разница между ними, но в ходе экспериментов я выяснил, что в режимах основной и автозапрос при поступлении от таймера одиночного запроса, контроллер DMA пересылает подряд в ЦАП весь массив значений, чего мне не нужно... А вот в режиме пинг-понг в ответ на запрос происходит пересылка одного значения и декремент счетчика числа передач. В итоге я остановился на режиме пинг-понг, и всё работает, но есть одно "но", которое меня смущает...

По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

Например:

http://chipspace.ru/stm32-dac-3/

 

Кто-нибудь может сказать: можно ли на этом МК решить мою задачу без использования прерывания от DMA? Так чтобы синус формировалсяисключительноаппаратными средствами.

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


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

По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

В STM32 в настройках DMA есть специальный бит "CIRC" (Circular Mode), который как раз и отвечает за этот функционал. Ищите аналог у Вашего контроллера.

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


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

А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.

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


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

но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать.

STM32 тут никак не поможет.

 

чтобы синус формировалсяисключительноаппаратными средствами.

А зачем?

 

А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.

Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???

Ведь у ТС совсем другой МК.

 

PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать ;)

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


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

Не обязательно использовать прерывание, можно переинициализировать в фоне. Опрашиваете контроллер DMA на предмет активной структуры. Если используется альтернативная - настраиваем основную и наоборот. Без прерываний но не совсем аппаратно.

 

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


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

В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.

DMA_SineWave.rar

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


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

Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???

Ведь у ТС совсем другой МК.

Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.

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


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

Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.

И в тех МК что я перечислил, есть и ping-pong и передачи связным списком. Эти режимы можно использовать для того, что нужно ТС. И даже без прерываний.

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


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

В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.

 

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

 

А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать.

STM32 тут никак не поможет.

 

 

А зачем?

 

 

Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???

Ведь у ТС совсем другой МК.

 

PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать ;)

 

Ну, этот контроллер заявлялся как отдаленный аналог STM32...

Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше? понятно, что ПДП все равно занимает шину и может тормозить работу МК, но не хотелось бы тормозить его еще и прерываниями...

 

Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).

 

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


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

Ну, этот контроллер заявлялся как отдаленный аналог STM32...

Аналог в чём? Имеющий то же самое ядро Cortex-M4? Так таких аналогов - пруд пруди.

 

Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше?

Была-бы выше и что? Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём. С такой маленькой скоростью даже DMA излишне.

У меня сейчас на Tiva через DMA->SPI идут потоки до 15МБ/сек на 120МГц ядра и нормально - загрузка МК небольшая.

У Вас и других прерываний нигде не будет в ПО? Или Вас только прерывания от ЦАП не устраивают почему-то?

 

Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).

Если это так, тогда он должен соответствовать стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller".

А в семействе Tiva как раз такой контроллер и у Вас аналог не STM32, а Tiva (по DMA-периферии по-крайней мере).

И там есть передача свЯзным списком.

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


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

Имеющий то же самое ядро Cortex-M4?
Это М3.Но аналогов меньше не становится. Почему заявлен как анлог St для меня тоже загадка.

Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём.
Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.

Или Вас только прерывания от ЦАП не устраивают почему-то?
Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).

 

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


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

Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.

100 точек - это перебор. Имхо. Но даже 200КS/sec - не проблема для такого МК. Через DMA конечно.

 

Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).

Если там (как утверждает ТС) DMA-контроллер - стандартный ARM-овский, как в Tiva, то у меня в Tiva прерывания завершения DMA-транзакций генерируются не по вектору DMA (который да, один), а по вектору периферии, обслуживаемой этим каналом DMA.

Но даже если бы и по вектору DMA, сомневаюсь, что там у ТС десятки периферийных узлов обслуживаются DMA. Скорее всего - 2-3. Обслужить все запросы завершения в одном ISR тогда не проблема.

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


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

А почему никто не посоветовал обратиться за поддержкой к производителю? "Западло" что ли "побеспокоить" не заграничного - своего-родного "вендора"? Или отфутболит?

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


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

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

Стоит почитать форум на milandr.ru, довольно активный и описывается много тонкостей по этим контроллерам.

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


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

Ещё на хабре был цикл статей с общим названием "Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI".

Вот статья по Вашей теме. Остальные можно найти самому.

https://habrahabr.ru/post/255513/

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


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

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

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

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

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

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

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

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

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

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