ADC1->SQR1 =0; // 1 регулярный канал ADC1->SQR3 =11; // 1 преобразование - канал 0 ADC1->SMPR1 |= ADC_SMPR1_SMP11_1; // Установка sample time 28 для канала 11 ADC1->CR2 |= ADC_CR2_DMA; // разрешение DMA ADC1->CR1 &= ~ADC_CR1_SCAN; // запрет режима сканирования ADC1->CR2 &= ~ADC_CR2_EOCS; // сбрасываем этот бит, сгенерирован Кубом и не работает непрерывный режим ADC1->CR2 |= ADC_CR2_CONT; // разрешить непрерывный режим ADC1->CR2 |= ADC_CR2_ADON; // разрешить АЦП //------------------------------------------// Настройка DMA RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; // включаем тактирование шины DMA2 DMA2_Stream0->PAR = (uint32_t) &ADC1->DR; // указываем откуда брать данные DMA2_Stream0->NDTR = 256; // количество данных которые пишем DMA2_Stream0->M0AR = (uint32_t) ADC_sum; // указываем куда ложить данные DMA2_Stream0->CR |= (1 << 13); // размер данных памяти DMA2_Stream0->CR |= (1 << 11); // размер данных перефирии DMA2_Stream0->CR |= (1 << DMA_SxCR_CIRC_Pos); // circular DMA2_Stream0->CR |= (1 << DMA_SxCR_MINC_Pos); // инкремируем адрес памяти для передачи данных DMA2_Stream0->CR |= (1 << DMA_SxCR_TCIE_Pos); // разрешаем прерывание по завершению передачи данных DMA2_Stream0->CR |= (1 << DMA_SxCR_EN_Pos); // включаем DMA NVIC_EnableIRQ(DMA2_Stream0_IRQn); // разрешить прерывания DMA2_Stream0 ADC1->CR2 |= ADC_CR2_SWSTART; // запуск АЦП while (1) { if (flag_end_DMA) { for (uint16_t count = 0; count < 256; ++count) { ADC_rez += ADC_sum [count]; } ledprint (ADC_rez / 256); flag_end_DMA = 0; ADC1->CR2 &=~ ADC_CR2_DMA; // запрещаем DMA ADC1->CR2 |= ADC_CR2_DMA; // разрешение DMA ADC1->CR2 |= ADC_CR2_ADON; // разрешить АЦП ADC1->CR2 |= ADC_CR2_SWSTART; // запуск АЦП } } //---------------------------------------- void DMA2_Stream0_IRQHandler (void) { // прерывания DMA ADC1->CR2 &=~ ADC_CR2_ADON; // запрет АЦП DMA2->LIFCR |= (1 << 5) | (1 << 4) | (1 << 3); // сбрасываем флаг окончания передачи,полупередачи и ошибки передачи DMA flag_end_DMA = 1; }