Где DMA хранит значения ADC в STM32? - PullRequest
1 голос
/ 08 марта 2019

Я включил периферийное устройство DMA для передачи памяти для ADC1 в CubeMX и сгенерировал код.Однако я не совсем понимаю, куда будут записываться данные с АЦП?Должен ли я явно определить переменную для хранения этих данных?Как я могу получить данные в ISR канала DMA 1?

Ответы [ 4 ]

4 голосов
/ 08 марта 2019

DMA не управляет памятью и не выбирает действительный адрес для установки данных. Вообще говоря, DMA позволяет передавать данные без использования ЦП, но не более.


Микроконтроллеры STM32 обеспечивают передачу из:

  • память в память
  • память на периферию
  • периферия к памяти

Во всех из них разработчики должны знать о своей цели, чтобы настроить (помимо DMA) источник и места назначения, такие как адрес периферийных устройств, резервная память (и какой тип памяти) и т. Д. .


В вашем конкретном случае (отметьте RM , AN , docs и т. Д.), Главные акторы в АЦП переносятся в память (периферийное устройство в память) являются:

  • Источник: периферийное устройство АЦП, разработчик должен знать, где находится периферийное устройство АЦП, и настроить (кроме АЦП) DMA на основе параметров АЦП в качестве источника информации.
  • Назначение: память, разработчик должен зарезервировать кучу памяти (heap / stack / global / etc) и настроить DMA в соответствии с уже выделенным пространством памяти. Таким образом, DMA позволит вам устанавливать значения различными способами (в зависимости от устройства), такими как непрерывный кольцевой буфер, один цикл, буфер пинг-понга (stm32 использует термин «круговой двойной буфер») и т. Д.
  • Конфигурация DMA и ADC: существует огромное количество факторов, которые ради простоты я не собираюсь включать, обычно упрощенных HAL производителя (это зависит от вас, чтобы использовать его).
3 голосов
/ 08 марта 2019

Вы указываете драйверу АЦП HAL DMA, куда помещать образцы данных при запуске преобразования:

volatile uint32_t adcBuffer[SAMPLE_COUNT]; 
HAL_ADC_Start_DMA( &hadc, 
                   adcBuffer, 
                   SAMPLE_COUNT ); 

Обратите внимание, что некоторые детали STM32 имеют SRAM, разделенную на несколько шин, причем одна секция намного меньше, чем другие,При резервировании этого раздела для буферов DMA есть преимущества в производительности, поскольку это уменьшает конфликты шины при обычной выборке данных программного обеспечения.Поэтому вы можете захотеть настроить свой скрипт компоновщика для создания разделов и явного размещения буферов DMA в одном, исключая размещение там данных приложения.

2 голосов
/ 08 марта 2019

Если вы посмотрите документы и примеры HAL, вы найдете пример использования АЦП с DMA.

Короче говоря:

Для запуска преобразования вы используете функцию:

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);

Где pData - это ваша переменная / массив, куда DMA должен поместить данные.

1 голос
/ 08 марта 2019

DMA и uC ничего не знают о переменных.Периферийные устройства DMA имеют два регистра конфигурации, в которых хранятся адрес периферийного устройства и адрес памяти.Если вы начнете читать документацию по ОК вместо HAL, все сразу станет ясно

...