smk 0 18 августа, 2015 Опубликовано 18 августа, 2015 · Жалоба Для пытливых умов. Код инициализации АЦП и ДМА. Результат преобразований один раз складывается в массив 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 это число выборок, которые хотите сделать. Размер массива, куда сложится, должен быть не менее числа выборок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться