1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

stm32 adc+dma+tim

Тема в разделе "STM8/STM32", создана пользователем red15530, 15 апр 2019.

  1. red15530

    red15530 Гость

    Сообщения:
    1
    Симпатии:
    0
    Может кто-нибудь помочь разобраться или поделиться кодом (если кто уже писал) для работы adc+dma+tim? Или же просто adc+tim. Я использую камень stm32f405vgt6. Частота дискретизации 20кГц, но реально она плавает, я подаю чистый синус с генератора. Почему так может происходить?
    Код:
                //Enable ADC2 clock
                RCC->APB2ENR    |= RCC_APB2ENR_ADC1EN;
                __NOP();
                GPIOA->MODER    |= GPIO_MODER_MODER1;        //ADC1 CH1 PA1           
               
                ADC2->CR2 = 0;   //off ADC
               
            ADC1->CR1       |=ADC_CR1_SCAN;               // Scan mode!
                ADC1->CR2       |=ADC_CR2_EXTEN_0;            //01: Trigger detection on the rising edge!
            ADC1->CR2       |=(ADC_CR2_EXTSEL_3);           //tim 3 (TRGO)!
                ADC1->CR2       |= ADC_CR2_EOCS;               //razreshem prerivanie!
                ADC1->CR2       |=ADC_CR2_DDS;                //DMA disable selection (for single ADC mode)!
                ADC1->CR2       |=ADC_CR2_DMA;                //razreshem rabotu DMA!  
            ADC1->SQR3       =1;                          //PA1
            ADC1->CR2       |=ADC_CR2_ADON;               //vkluchet preobrazovanie
               
                //Enable DMA2 clock
                RCC->AHB1ENR    |= RCC_AHB1ENR_DMA2EN;
                __NOP();
               
                //Disable DMA before enable
                DMA2_Stream2->CR = 0;
                while (DMA2_Stream2->CR & DMA_SxCR_EN) continue;
               
                //DMA low interrupt flag clear register
                DMA2->LIFCR = 0x0F7D0F7D;
                //DMA high interrupt flag clear register
                DMA2->HIFCR = 0x0F7D0F7D;
               
                //DMA2_Stream4->CR|= DMA_SxCR_CHSEL;           // 001: channel 1 selected
            DMA2_Stream4->CR|= DMA_SxCR_PL;                // 11: Very high prioritet
            DMA2_Stream4->CR|= DMA_SxCR_MSIZE_0;              // 16 bit
            DMA2_Stream4->CR|= DMA_SxCR_PSIZE_0;            // 16 bit
                DMA2_Stream4->CR|= DMA_SxCR_MINC;               // inkrement adresa
                DMA2_Stream4->CR|= DMA_SxCR_CIRC;                // neprerivni rejim
                DMA2_Stream4->CR|= DMA_SxCR_TCIE;                // Transfer complete interrupt enable
                DMA2_Stream4->CR&=~ DMA_SxCR_DIR;                // 01: peripheral-to-Memory
                DMA2_Stream4->NDTR=1;                           // dlinna
            DMA2_Stream4->PAR= (uint32_t)&ADC1->DR;    
            DMA2_Stream4->M0AR=(uint32_t)&BUFF;              // massiv
                DMA2_Stream4->FCR = 3;                                     //Full FIFO
                DMA2_Stream4->CR|= DMA_SxCR_EN;                // vkluchit peredachu
                NVIC_SetPriority(DMA2_Stream4_IRQn,5);
            NVIC_EnableIRQ(DMA2_Stream4_IRQn);
           
    
            RCC->APB1ENR    |= RCC_APB1ENR_TIM3EN;      
            TIM3->PSC        = 84-1;                     // PSC
            TIM3->ARR        = 50-1;                      // ARR
                TIM3->CR1       |= TIM_CR1_URS;                      //Only counter overflow/underflow generates an update interrupt or DMA request if enabled
            TIM3->CR2       |= TIM_CR2_MMS_1;            // output (TRGO)
                //TIM3->DIER      |= TIM_DIER_UIE;           //prerivanie po perepolneniu
            //TIM3->DIER      |= TIM_DIER_UDE;
            TIM3->CR1       |= TIM_CR1_CEN;              //zapusk scheta
                //NVIC_EnableIRQ(TIM3_IRQn);
                //NVIC_SetPriority(TIM3_IRQn,16);
     
    : stm32f4, stm32, adc

Поделиться этой страницей