Наиболее полученным криком помощи, который я получаю от многих людей, является использование DMA с ADC для непрерывного преобразования аналоговых входов датчиков. Поэтому я принял решение поделиться необходимыми шагами, чтобы настроить его (а также избежать дублирования моего ответа каждый раз).Я воспользуюсь проектом STM32Cube, чтобы сделать его легким, и я признаю, что у вас уже есть программное обеспечение stm32cubemx и установленная Прошивка Stm32cubef4. Если все в порядке, давайте начнем, то и для других людей они могут следовать ссылки для установки инструмента и прошивки.
Откройте инструмент STM32CubeMX и нажмите на "новый проект" я выбрал из списка микроконтроллер STM32F439BITx. Вы можете выбрать свой собственный, если вы используете определенную доску. Я думаю, что все АЦП в микроконтроллерах STM32 имеют эту функцию.
После этого Сформируйте представление Pinout инструмента, разверните ADC peripheral и выберите три внутренних канала (Temperature / Vref и Vbat ). Вы можете выбрать свой собственный, но я использовал эти три канала в качестве демонстрации в этом уроке.
Во втором случае все, что у вас есть, - это подключение аналоговых входов к контактам каналов. Выбранный канал окрашен в зеленый цвет в микроконтроллере или вы можете работать наоборот, выбрав первый ваш pin-код в качестве ADC ввода с помощью правой кнопки мыши на нем. (exp PA0
Теперь пришло время настроить ADC для работы, как мы хотим, (да, и DMA тоже ;)). Так нажмите на АЦП и добавить три регулярных конфигурации канала для преобразования. Также не забудьте включить режим сканирования и непрерывный режим, чтобы иметь непрерывное преобразование трех настроенных каналов.
Теперь перейдите на вкладку "настройки DMA", добавьте запрос DMA, выбрав поток и приоритет. Также включите инкремент памяти, потому что мы будем хранить все преобразованные значения в массиве. Используемый режим является циклическим, потому что у нас будет продолжение передачи слова (Ширина данных).
Нажмите Ok, сгенерируйте проект и откройте его (я использую iar wokbench у вас есть возможность выбрать Keil или TrueSTUDIO тоже). Мы добавим некоторые дополнительные код, чтобы завершить наши демо: в основному.с файл мы объявим 32-битный массив, и мы начнем АЦП и ДМА по телефону HAL_ADC_Start() иHAL_ADC_Start_DMA(). После каждого преобразования значение передается из регистра данных ADC в массив, и DMA автоматически увеличивает индекс.
02 |
2: uint32_t ADC1ConvertedValues[1024]; |
10 |
10: SystemClock_Config(); |
17 |
17: if ( HAL_ADC_Start(&hadc1) != HAL_OK) |
20 |
20: if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1ConvertedValues, 2048) != HAL_OK) |
Комментарии
RootEditor
ср, 03/14/2018 - 15:03
Постоянная ссылка (Permalink)
скажем, что DMA прерывания в
Добавить комментарий