STM32 AD C DMA. Когда MCU сообщается об окончании нашей эры C? - PullRequest
1 голос
/ 27 марта 2020

Я использую AD C с DMA (STM32F4, ide STM32CubeIDE), и я думаю, что понимаю, как это работает, но все еще имею одну дилемму. Насколько я понимаю, MCU вызывается только после завершения передачи DMA, в основном MCU go в эту функцию, когда DMA AD C завершено

void HAL_ADC_ConvCpltCallback (ADC_HandleTypeDef * had c)

Это правильно?

Так что, если это правда, у меня следующая дилемма: например, adc_clock 10 МГц, время выборки 480 adc_cycles, 12-битное ad c разрешение. adc_sample_period = 1/10 МГц * (480 + 12 + 3) = 49,5 мкс. Это означает, что MCU будет go в HAL_ADC_ConvCpltCallback () каждые 49,5 мкс ??? На мой взгляд, это сложно, особенно в больших проектах. У кого-нибудь была идея, как решить эту «проблему»? Я хочу читать результаты AD C, например, каждые 1 мс, но также хочу внедрить DMA в AD C. Любая идея приветствуется

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Прочитайте документацию u C - не начинайте с функций " magi c" HAL.

1 мс между преобразованиями AD C абсолютно ничего , У меня есть много проектов, где я использую двойной или тройной режим AD C с результирующей частотой дискретизации 18MSPS.

Вообще говоря, если вы хотите плохой, медленный, неэффективный и работающий код "случайно" - используйте HAL. В противном случае изучите ваше оборудование и используйте регистры.

0 голосов
/ 02 апреля 2020

Вот как я решаю эту проблему: я меняю конфигурацию DMA. DMA был настроен для работы в циклическом режиме, это означает, что когда AD C fini sh одно преобразование данных хранилища DMA и MCU уведомляется через

void HAL_ADC_ConvCpltCallback (ADC_HandleTypeDef * has c)

В основном MCU был уведомлен каждые 49,5 мкс, и для моей цели это было слишком интенсивно (мне нужен результат AD C каждые 1 мс). Я создаю таймер, который используется для индикации AD C, когда необходимо запустить выборку, и с DMA в обычном режиме (AD C выполнит только 1 измерение), которые решают мою проблему. Каждые 1 мс получают результат от AD C. Так что фокус был в режимах DMA (круговой / нормальный режим).

...