3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,865
|
||||||
1 | ||||||
АЦП + DMA01.10.2019, 14:35. Показов 2500. Ответов 10
Начал разбираться с АЦП в контроллерах. Естественно, возможность один раз задать список каналов для оцифровки, пнуть модуль и заниматься своими делами, пока DMA гоняет байты, не оставила равнодушным.
Запустить оба этих модуля удалось, даже удалось их связать друг с другом. Но есть несколько непонятных моментов. Вот код main, там куча самописных макросов для удобства настройки, но функционал у них простой. Сам код работает.
Почему окончание преобразование детектируется только по DMA, но не по флагам самого АЦП? Если раскомментировать ожидание флага ADC_SR_EOC, программа на нем и зависает. Можно ли запустить цикл оцифровки повторно каким-то более простым способом? Потому что сброс флага ADC_CR2_DMA и тут же его установка выглядит как-то костыльно.
0
|
01.10.2019, 14:35 | |
Ответы с готовыми решениями:
10
Как связать таймер с АЦП и АЦП с DMA? stm32 SPI+DMA или I2C внешнее АЦП Чтение внешнего АЦП по SPI DMA по таймеру (HAL) АЦП STM32 в режиме DMA не заполняет буфер при работе в free RTOS |
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
01.10.2019, 17:09 | 3 |
COKPOWEHEU, вы не указали серию контроллера, но я думаю у stm32 все имеют бит CONT в регистре CR2 у ADC.
Я обычно делаю связку SCAN + CONT + DMA(circular) + DMA прерывания. Таким образом у нас секция будет оцифровываться и раскладываться в массив, а по окончанию секции она, как и DMA пойдет по второму кругу. Можно настроить два прерывания DMA: на Half Transfer и На Transfer Complete, тогда будет некое подобие кольцевого буффера, по первому прерыванию забираем первую половину, по второму вторую. Можно одно прерывание сделать только Transfer Complete и в нем переназначить адрес буффера куда писать следующую оцифровку. Добавлено через 10 минут Действительно флаг EOC триггерит DMA, при этом флаг EOC очищается при чтении из DR, таким образом DMA само чистит этот флаг хардварно и вы его не отловите.
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,865
|
|
01.10.2019, 17:16 [ТС] | 4 |
Ох блин точно. Причем в тегах указал stm32l151, а в заголовке забыл.
В моем случае нужен именно ручной запуск и одиночный проход по каналам. Если интересно, предполагается опрос нескольких фотодиодов при кратковременной засветке. То есть включили свет, сняли значения, выключили, уснули. Вроде бы немного не так: в моей конфигурации флаг ADC_SR_EOC означает конец всей серии оцифровок (а не каждой отдельной), значит пинать DMA на предмет очередной порции не может. Да и потом, не снимает же DMA флаги у АЦП. Добавлено через 1 минуту триггерить не триггерит, а вот на счет пускания флага наверное вы (и ValeryS, конечно) правы.
0
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
01.10.2019, 17:26 | 5 |
COKPOWEHEU,
Как раз EOC триггерит DMA так как DR единственный на все измерения, DMA должен забрать данные пока они не перетерлись следующим каналом. Тогда и смысл DMA? Если вы все равно все включаете вручную и ждете флагов (читай , блочите поток)? Я бы сделал так: АЦП можно настроить на запуск по внешнему триггеру - включение света. Настроили секцию АЦП, которую будете оцифровывать (без CONT), настроили DMA на circular mode в буффер размером по количеству каналов с прерывание по окончинию. В прерывании выставляете флаг который опрашиваете в основном цикле. Свет включился - дернул АЦП он оцифровал секцию - DMA все разложил и дернул флаг. В это время ядро спокойно крутится в основном цикле опрашивая флаг.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
|
|
01.10.2019, 17:28 | 6 |
насчет элек не знаю, а вот у F103 с которыми я работаю, есть два режима DMA циклический, когда он постоянно долбит по кругу, и однократный записал массив и остановился, как раз как ты описывал
наверно и у l151 есть что то подобное
0
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
01.10.2019, 17:30 | 7 |
Триггеры есть разные, можно от внутренних таймеров, можно от EXTI.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,865
|
|
02.10.2019, 10:10 [ТС] | 8 |
В том, что не нужно дергать флаги ручками. Ну и возможность что-то еще посчитать пока АЦП крутится.
Мой код именно так и работает. Я ж не спрашивал как сделать в принципе, меня только два частных вопроса интересовало: куда теряется EOC (уже ответили что его DMA съедает) и можно ли не дергать связку DMA+ADC, а только пнуть кого-то одного чтобы запустился по-новой.
0
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|||||||||||||||||||||
02.10.2019, 11:42 | 9 | ||||||||||||||||||||
COKPOWEHEU,
Да, это понятно. Меня смутила фраза
Я подумал вы хотите каждый канал вручную дергать и ждать EOC и при этом DMA использовать. Вообще надо искать ошибки инициализации, ибо бит ADC_CR2_DMA выставляется один раз при инициализации связки и больше не должен трогаться. Могу накинуть пример как у меня связка работает:
0
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
02.10.2019, 11:56 | 10 |
COKPOWEHEU, На самом деле, заглянул в RM на L151 и понял, что достаточно сильные отличия от F1 серии, так что не все так однозначно.
Кажется нашел в чем может быть проблема: Посмотрите бит DDS в регистре CR2. Насколько я понял, если он сброшен, то надо передергивать связку, после N транзакций DMA которые вы настроили, если установлен то вроде не надо. Действительно особенность этой линейки видимо.
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,865
|
|
02.10.2019, 13:18 [ТС] | 11 |
Пробовал его ставить, но никакого эффекта не увидел. Да толком и не понял для чего он нужен. Разве что если ядро сильно медленное и не успевает за АЦП... сейчас проверю.
Добавлено через 10 минут Нет, от слишком низкой скорости он тоже не помогает Проверял на делителе АЦП 1:1 (по идее, 16 МГц тактовая, то есть ~1M sps. Хотя время выборки максимальное, тогда наверное 40k sps) и тактировании ядра от MSI (2 МГц) Что интересно, если каналов меньше 18, то проблем не возникает. И от времени выборки это не зависит... совсем странно. Добавлено через 3 минуты А, вот оно как. Проверил - действительно работает. Спасибо.
0
|
02.10.2019, 13:18 | |
02.10.2019, 13:18 | |
Помогаю со студенческими работами здесь
11
stm32f407+ADC+DMA. Проблема с DMA STM32F4Discovery - ADC DMA и FSMC DMA USART2(RX+IDLE+DMA)+USART3(TX DMA) ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет? Алгоритм работы с ацп АЦП STM32F103 DMA в STM32 DMA DAC Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |