STM32F4. Урок 14 — АЦП с использованием DMA

Данная библиотека позволяет использовать АЦП для циклического считывания данных с применением DMA, что позволяет снизить нагрузку на процессор. Максимальное количество используемых каналов — 16.
Настройка производится (как и в STM32F4. Урок 5 — работа с АЦП) в C-файлы. В нем для каждого канала АЦП должен быть назначен вывод.
К данной статье прикреплено 2 библиотеки, ADC1 и ADC2, которые можно использовать одновременно, если необходимо более 16 каналов АЦП.

Пример работы:

В примере используется только три канала АЦП для иллюстрации работы: PA3, PC4, PC5.

Требования:

   Подключаемые модули CooCox-IDE : GPIO, ADC, DMA.
   Поддерживаемые библиотеки: отсутствуют.

Перечисления:

 typedef enum {   ADC_PA3 = 0,  // PA3   ADC_PC4 = 1,  // PC4   ADC_PC5 = 2   // PC5 }ADC1d_NAME_t;

Функции:

 void UB_ADC1_DMA_Init(void);                       // инициализация и запуск uint16_t UB_ADC1_DMA_Read(ADC1d_NAME_t adc_name);  // зачитать данные в канале АЦП

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 03.03.2013 // Version  : 1.0 // Autor    : UB // EMail    : mc-4u(@)t-online.de // Web      : www.mikrocontroller-4u.de // CPU      : STM32F4 // IDE      : CooCox CoIDE 1.7.0 // Module   : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der ADC-DMA-Library // Hinweis  : Diese zwei Files muessen auf 8MHz stehen //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_adc2_dma.h"  int main(void) {   uint16_t adc_wert;    SystemInit(); // Инициализация настроек кварца    UB_Led_Init(); // Инициализация светодиодов   UB_ADC2_DMA_Init(); // Инициализация ADC2 с режиме DMA    while(1)   { 	// Зачитать данные АЦП и зажечь соответствующий светодиод     adc_wert=UB_ADC2_DMA_Read(ADC_PA3);     if(adc_wert>2048) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN);  	// Зачитать данные АЦП и зажечь соответствующий светодиод     adc_wert=UB_ADC2_DMA_Read(ADC_PC4);     if(adc_wert>2048) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED);  	// Зачитать данные АЦП и зажечь соответствующий светодиод     adc_wert=UB_ADC2_DMA_Read(ADC_PC5);     if(adc_wert>2048) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);   } } 

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.