|
Sinus 2kHz на К1986ВЕ92QI, Использование DMA+DAC |
|
|
|
Sep 6 2016, 19:46
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 7-04-08
Пользователь №: 36 555

|
Коллеги, нужен совет. Хочу с помощью имеющихся в МК К1986ВЕ92QI ЦАП и DMA генерировать синус 2 кГц. Для своих целей я задействовал таймер 1. Когда происходит событие CNT=ARR, формируется запрос DMA, и DMA-контроллер должен очередное табличное значение функции отправить в ЦАП. У контроллера DMA есть несколько режимов работы: основной, автозапрос, пинг-понг и др. Из документации не совсем ясна разница между ними, но в ходе экспериментов я выяснил, что в режимах основной и автозапрос при поступлении от таймера одиночного запроса, контроллер DMA пересылает подряд в ЦАП весь массив значений, чего мне не нужно... А вот в режиме пинг-понг в ответ на запрос происходит пересылка одного значения и декремент счетчика числа передач. В итоге я остановился на режиме пинг-понг, и всё работает, но есть одно "но", которое меня смущает... По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё... Например: http://chipspace.ru/stm32-dac-3/ Кто-нибудь может сказать: можно ли на этом МК решить мою задачу без использования прерывания от DMA? Так чтобы синус формировалсяисключительноаппаратными средствами.
|
|
|
|
|
Sep 7 2016, 03:25
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612

|
Цитата(Konrad @ Sep 6 2016, 23:46)  По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё... В STM32 в настройках DMA есть специальный бит "CIRC" (Circular Mode), который как раз и отвечает за этот функционал. Ищите аналог у Вашего контроллера.
|
|
|
|
|
Sep 7 2016, 06:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Konrad @ Sep 7 2016, 01:46)  но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё... А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать. STM32 тут никак не поможет. Цитата(Konrad @ Sep 7 2016, 01:46)  чтобы синус формировалсяисключительноаппаратными средствами. А зачем? Цитата(ViKo @ Sep 7 2016, 11:08)  А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае. Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку??? Ведь у ТС совсем другой МК. PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать
|
|
|
|
|
Sep 7 2016, 10:26
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 7-04-08
Пользователь №: 36 555

|
Цитата(HardEgor @ Sep 7 2016, 12:23)  В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора. Спасибо, проглядел. В этом примере прерывание тоже используется. Значит иначе никак. Цитата(jcxz @ Sep 7 2016, 10:34)  А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать. STM32 тут никак не поможет. А зачем? Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку??? Ведь у ТС совсем другой МК. PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать  Ну, этот контроллер заявлялся как отдаленный аналог STM32... Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше? понятно, что ПДП все равно занимает шину и может тормозить работу МК, но не хотелось бы тормозить его еще и прерываниями... Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).
|
|
|
|
|
Sep 7 2016, 11:21
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Konrad @ Sep 7 2016, 16:26)  Ну, этот контроллер заявлялся как отдаленный аналог STM32... Аналог в чём? Имеющий то же самое ядро Cortex-M4? Так таких аналогов - пруд пруди. Цитата(Konrad @ Sep 7 2016, 16:26)  Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше? Была-бы выше и что? Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём. С такой маленькой скоростью даже DMA излишне. У меня сейчас на Tiva через DMA->SPI идут потоки до 15МБ/сек на 120МГц ядра и нормально - загрузка МК небольшая. У Вас и других прерываний нигде не будет в ПО? Или Вас только прерывания от ЦАП не устраивают почему-то? Цитата(Konrad @ Sep 7 2016, 16:26)  Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод). Если это так, тогда он должен соответствовать стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller". А в семействе Tiva как раз такой контроллер и у Вас аналог не STM32, а Tiva (по DMA-периферии по-крайней мере). И там есть передача свЯзным списком.
|
|
|
|
|
Sep 7 2016, 12:22
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Цитата Имеющий то же самое ядро Cortex-M4? Это М3.Но аналогов меньше не становится. Почему заявлен как анлог St для меня тоже загадка. Цитата Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём. Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно. Цитата Или Вас только прерывания от ЦАП не устраивают почему-то? Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
Sep 7 2016, 12:46
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(редактор @ Sep 7 2016, 18:22)  Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно. 100 точек - это перебор. Имхо. Но даже 200КS/sec - не проблема для такого МК. Через DMA конечно. Цитата(редактор @ Sep 7 2016, 18:22)  Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения). Если там (как утверждает ТС) DMA-контроллер - стандартный ARM-овский, как в Tiva, то у меня в Tiva прерывания завершения DMA-транзакций генерируются не по вектору DMA (который да, один), а по вектору периферии, обслуживаемой этим каналом DMA. Но даже если бы и по вектору DMA, сомневаюсь, что там у ТС десятки периферийных узлов обслуживаются DMA. Скорее всего - 2-3. Обслужить все запросы завершения в одном ISR тогда не проблема.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|