Перейти к содержанию
    

STM32 АЦП. Пожалуйста помогите разобраться

Для пытливых умов. Код инициализации АЦП и ДМА. Результат преобразований один раз складывается в массив My_mass из N элементов. Один канал. Код перезапуска ниже. Ну тоесть пнули, тысячу отсчетов в массив из тысячи элементов аппаратно сложилось.

Инициализация:

    RCC->APB2ENR |=(1<<8);                                                        //
    ADC1->CR2 |= (1<<0);                                                            //ADON: A/D Converter ON    
    ADC->CCR |= (1<<16)|(1<<17);             //TSVREFE: Temperature sensor and VREFINT enable & VBATE: VBAT enable
    ADC1->CR2 |= ADC_CR2_DDS;                                                             //DMA: Direct memory access mode (for single ADC mode)
    ADC1->CR2 |= ADC_CR2_DMA;                                                             //DMA disable selection (for single ADC mode)
    ADC1->CR2 |= (1<<1);                                                            //CONT: Continuous conversion
    ADC1->SMPR2 |= (1<<12);         //IN4 = 111: 480 cycles
    ADC1->SQR1 &= ~((1<<20)|(1<<21)|(1<<22)|(1<<23));            //11: 1 conversions 
    ADC1->SQR3 = 4;                                                                        //
    
    RCC->AHB1ENR |=(1<<22);                                                      //DMA1EN: DMA2 clock enable
    DMA2_Stream0->CR &= ~((1<<27)|(1<<26)|(1<<25));      //000: channel 0 selected
    DMA2_Stream0->CR |= (1<<13);                                        //MSIZE[1:0]: Memory data size 01: half-word (16-bit)
    DMA2_Stream0->CR |= (1<<11);                                          //PSIZE[1:0]: Peripheral data size 01: Half-word (16-bit)
    DMA2_Stream0->CR |= (1<<10);                                          //MINC: Memory increment mode
    DMA2_Stream0->CR |= DMA_SxCR_PL;
    DMA2_Stream0->CR &= ~((1<<7)|(1<<6));                       //DIR[1:0]: Data transfer direction 00: Peripheral-to-memory
    DMA2_Stream0->NDTR = sample_size_adc;                                              //NDT[15:0]: Number of data items to transfer
    DMA2_Stream0->PAR = (uint32_t)&ADC1->DR;                  //PAR[31:0]: Peripheral address
    DMA2_Stream0->M0AR = (uint32_t)&My_mass;              //M0A[31:0]: Memory 0 address
    DMA2_Stream0->CR |= (1<<0);                                              //EN: Stream enable / flag stream ready when read low
    ADC1->CR2 |= (1<<30);                                                          //SWSTART: Start conversion of regular channels

 

Код "пинка" для перезапуска:

        DMA2_Stream0->CR &= ~DMA_SxCR_EN;
        DMA2_Stream0->M0AR = (uint32_t)&My_mass;        
        DMA2_Stream0->NDTR = sample_size_adc; //NDT[15:0]: Number of data items to transfer
        DMA2->LIFCR |= ((1UL<<5)|(1<<4));
        ADC1->SR &= ~ADC_SR_OVR;
        ADC1->CR2 &= ~ADC_CR2_DMA;
        ADC1->CR2 |= ADC_CR2_DMA;
        DMA2_Stream0->CR |= DMA_SxCR_EN;//EN: Stream enable / flag stream ready when read low
        ADC1->CR2 |= ADC_CR2_SWSTART;

 

sample_size_adc это число выборок, которые хотите сделать. Размер массива, куда сложится, должен быть не менее числа выборок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...