реклама на сайте
подробности

 
 
> STM32F407 ADc + DMA, Постоянно выскакивает флаг OVR
smk
сообщение Sep 6 2015, 17:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Прошу помочь в следующем вопросе. АЦП меряет сигнал, а ДМА укладывает измерения в массив. Всего 3000 измерений, один регулярный канал. Затем стоп и после паузы по команде из программы следующий цикл в 3000 преобразований. Проблема в том, что потоянно выскакивает флаг OVR. Согласно даташиту он будет появляться всякий раз когда АЦП будет записывать данные в ADC->DR, но прежние данные не будут прочитанны. Поскольку данные вычитывает ДМА, то получается что ДМА не успевает? Может я что-то не так настраиваю? Прошу помочь с прояснением вопроса. Спасибо.

Код настройки периферии:
Код
    //ADC2_IN4 to DMA    
    RCC->APB2ENR |=RCC_APB2ENR_ADC2EN;                                            //
    ADC->CCR |= ADC_CCR_TSVREFE | ADC_CCR_ADCPRE;     
    ADC2->CR2 |= ADC_CR2_ADON;                                                            //ADON: A/D Converter ON    
    ADC2->CR2 |= ADC_CR2_DDS;                                                             //DMA: Direct memory access mode (for single ADC mode)
    ADC2->CR2 |= ADC_CR2_DMA;                                                             //DMA disable selection (for single ADC mode)
    ADC2->CR2 |= ADC_CR2_CONT;                                                            //CONT: Continuous conversion
    ADC2->SMPR2 |= ADC_SMPR2_SMP4_0;                                                 //IN4 = 001: 15 cycles
    ADC2->SQR1 &= ~(ADC_SQR1_L);                                                        //11: 1 conversions
    ADC2->SQR3 = 4;                                                                                    //
    
    RCC->AHB1ENR |=(1<<22);                                                      //DMA1EN: DMA2 clock enable
    DMA2_Stream2->CR |= DMA_SxCR_CHSEL_0;                          //001: channel 1 selected    
    DMA2_Stream2->CR |= (1<<13);                                        //MSIZE[1:0]: Memory data size 01: half-word (16-bit)
    DMA2_Stream2->CR |= (1<<11);                                          //PSIZE[1:0]: Peripheral data size 01: Half-word (16-bit)
    DMA2_Stream2->CR |= (1<<10);                                          //MINC: Memory increment mode
    DMA2_Stream2->CR |= DMA_SxCR_PL;
    DMA2_Stream2->CR &= ~((1<<7)|(1<<6));                       //DIR[1:0]: Data transfer direction 00: Peripheral-to-memory
    DMA2_Stream2->NDTR = sample_size_adc;                            //NDT[15:0]: Number of data items to transfer
    DMA2_Stream2->PAR = (uint32_t)&ADC2->DR;                  //PAR[31:0]: Peripheral address
    DMA2_Stream2->M0AR = (uint32_t)&massiv;                  //M0A[31:0]: Memory 0 address
    DMA2_Stream2->CR |= (1<<0);                                              //EN: Stream enable / flag stream ready when read low
    ADC2->CR2 |= ADC_CR2_SWSTART;                                            //SWSTART: Start conversion of regular channels


Поскольку бит OVR устанавливается всякий раз по завершении цикла в 3000 преобразований, то перед запуском следующей "партии" согласно даташита сделана переинициализация:
Код
        DMA2_Stream2->CR &= ~DMA_SxCR_EN;
        DMA2_Stream2->M0AR = (uint32_t)&massiv;        
        DMA2_Stream2->NDTR = sample_size_adc; //NDT[15:0]: Number of data items to transfer
        DMA2->LIFCR |= ((1UL<<20)|(1<<21));
        ADC2->SR &= ~ADC_SR_OVR;
        ADC2->CR2 &= ~ADC_CR2_DMA;
        ADC2->CR2 |= ADC_CR2_DMA;
        DMA2_Stream2->CR |= DMA_SxCR_EN;//EN: Stream enable / flag stream ready when read low
        ADC2->CR2 |= ADC_CR2_SWSTART;


Собственно в таком виде работает, но нет понимания откуда флаг OVR?
Очень прошу помочь разобраться. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016