Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 13:40

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: STM32 F4 ADC+DMA+TIM
СообщениеДобавлено: 31 авг 2016, 14:31 
Здравствуйте!

Зарегистрирован: 07 июл 2016, 18:57
Сообщения: 1
Доброго времени суток!
Проблема достаточно стандартная: необходимо настроить АЦП и ДМА так, чтобы по таймеру АЦП дергалось и дальше ДМА писал преобразованную информацию в память.
Не возникает прерывания ДМА...
Прошу помочь.
Код:
void DMA_init(void) {                     // Инициализация DMA1      
                                                                     // Настройка потока 0 DMA1 без разрешения работы
   DMA2_Stream0->CR |= DMA_SxCR_TCIE |     // Transfer complete interrupt enable
                    DMA_SxCR_CIRC |     // Circular mode
                                        DMA_SxCR_MINC |     // Memory increment mode
                             DMA_SxCR_PSIZE_32 |         // Peripheral size - 32 bit
              DMA_SxCR_MSIZE_32 ;      // Memory size - 32 bit
                             // 00 : Peripheral-to-memory
                                  // Channel 0
                                             
   DMA2_Stream0->PAR = (int)&(ADC1->DR) ;     // Запись адреса регистра данных АЦП выбранного канала DMA2
   
   DMA2_Stream0->M0AR = (int)IntADCData ;     // Запись адреса регистра памяти DMA2
   
   DMA2_Stream0->NDTR = 4;              // Количесво транзакций
                                                                    
   DMA2_Stream0->CR |= DMA_SxCR_EN ;             // DMA channel enable
                              
                             // Сброс флага прерывания потока 0 DMA2
   DMA2->LIFCR |= DMA_LIFCR_CFEIF0 |             
                               DMA_LIFCR_CDMEIF0 |          
                DMA_LIFCR_CTEIF0 |             
                               DMA_LIFCR_CHTIF0 |             
                DMA_LIFCR_CTCIF0 ;             
                        
   NVIC_SetPriority(DMA2_Stream0_IRQn, 15);         
   NVIC_EnableIRQ(DMA2_Stream0_IRQn);                  
}

void ADC_init(void)   {                    // Инициализация ADC
   ADC1->SQR1 |= ADC_SQR1_L_0 ;             // АЦП осуществляет 2 преобразования
   
   ADC1->SQR3 |= ADC_SQR3_SQ1_0 |          // 1ое преобразование
                          ADC_SQR3_SQ1_1 |          // осуществляется по 3му каналу
                ADC_SQR3_SQ2_1 ;          // 2ое преобразование по 2му каналу
   
   ADC1->SMPR1 = ADC_Sample_Time ;          // Настройка скорости АЦП

   ADC1->SMPR2 = ADC_Sample_Time ;
                               // Настройка и включение АЦП
   ADC1->CR1 |= ADC_CR1_SCAN ;             // Настраиваем режим сканирования АЦП

   ADC1->CR2 |= ADC_CR2_ADON |             // Включаем АЦП
             ADC_CR2_DMA |             // Режим DMA
             ADC_CR2_EXTSEL_3 |          // Внешнее событие TRGO Timer3
             ADC_CR2_EXTEN_1 ;             // Разрешаем внешние прерывания по спаду импульса            
}

void TIM3_init(void) {                       // Инициализация TIM3
   TIM_TypeDef *TIM = TIM3;
   TIM->PSC = 0 ;                       // Значение предделителя 0
   TIM->ARR = SystemCoreClock/90000 - 1 ;        // период запуска АЦП (90000 Гц)
   TIM->CR2 |= TIM_CR2_MMS_Update ;           // MMS = 010, update even as a trigger output
}

void ADC_configuration(void) {
   TIM_TypeDef *TIM = TIM3;
   
   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;         // Разрешение тактирования блока таймеров (TIM3)
      
   RCC->APB2ENR |= RCC_APB2ENR_ADC1EN ;         // Разрешение тактирования блока АЦП (ADC1)
   
   RCC->AHB2ENR |= RCC_AHB1ENR_DMA2EN ;         // Разрешение тактирование блока DMA2
   
   DMA_init();                           // Настройка DMA1
   
   ADC_init();                           // Настройка ADC
   
   TIM3_init();                           // Настройка TIM3
   
   TIM->CR1 |= TIM_CR1_CEN;                  // Включаем таймер TIM3
}


P.s. Надо ли включать прерывание таймера TIM3 по переполнению?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB