Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- volatile uint16_t adc_buff[4];
- void ADC_Initialize(void){
- RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;
- // PD3 (ADC канал 4)
- GPIOD->CFGLR &= ~GPIO_CFGLR_CNF3;
- // PD2 (ADC канал 3)
- GPIOD->CFGLR &= ~GPIO_CFGLR_CNF2;
- RCC->AHBPCENR |= RCC_AHBPeriph_DMA1; //Разрешаем тактирование первого DMA модуля
- DMA1_Channel1->PADDR = (uint32_t)&(ADC1->RDATAR); //Указываем адрес периферии
- DMA1_Channel1->MADDR = (uint32_t)adc_buff; //Задаем адрес памяти - базовый адрес массива в RAM
- DMA1_Channel1->CFGR &= ~DMA_CFGR1_DIR ; //Указываем направление передачи данных, из периферии в память
- DMA1_Channel1->CNTR = 4; //Количество пересылаемых значений
- DMA1_Channel1->CFGR &= ~DMA_CFGR1_PINC; //Адрес периферии не инкрементируем после каждой пересылки
- DMA1_Channel1->CFGR |= DMA_CFGR1_MINC; //Адрес памяти инкрементируем после каждой пересылки
- DMA1_Channel1->CFGR |= DMA_CFGR1_PSIZE_0; //Размерность данных периферии - 16 бит
- DMA1_Channel1->CFGR |= DMA_CFGR1_MSIZE_0; //Размерность данных памяти - 16 бит
- DMA1_Channel1->CFGR |= DMA_CFGR1_PL; //Приоритет - очень высокий
- DMA1_Channel1->CFGR |= DMA_CFGR1_CIRC; //Разрешаем работу DMA в циклическом режиме
- DMA1_Channel1->CFGR |= DMA_CFGR1_TCIE; //Разрешаем прерывание по окончанию передачи
- DMA1_Channel1->CFGR |= DMA_CFGR1_EN; //Разрешаем работу 1-го канала DMA
- RCC->CFGR0 |= RCC_ADCPRE_DIV8; //тактовая частота АЦП не должна превышать 12MHz@3.3v
- RCC->APB2PCENR |= RCC_APB2Periph_ADC1; //разрешаем тактирование АЦП
- //запускаем калибровку и ждем пока завершится
- ADC1->CTLR1 = (ADC1->CTLR1 & ~ADC_CALVOL_50PERCENT) | ADC_CALVOL_75PERCENT;
- ADC1->CTLR2 |= ADC_ADON;
- ADC1->CTLR2 |= ADC_RSTCAL;
- while(ADC1->CTLR2 & ADC_RSTCAL);
- ADC1->CTLR2 |= ADC_CAL;
- while (ADC1->CTLR2 & ADC_CAL);
- // Длина последовательности = 4; 3-й, 4-й, 8-й (Vref) и 9-й (Vcal) канал
- ADC1->RSQR1 = 0x00300000; // Установить длину последовательности на 4
- ADC1->RSQR2 = 0x00000000; // Пустой, поскольку длина последовательности мала
- ADC1->RSQR3 = 0x0004A083; // Установить последовательность каналов 3, 4, 8 (Vref), 9 (Vcal)
- ADC1->CTLR1 |= ADC_SCAN; // режим сканирования
- //для 3, 4, 8, 9-го каналов между выборками 241 цикла
- ADC1->SAMPTR2 = ADC_SMP3| ADC_SMP4 | ADC_SMP8 | ADC_SMP9;
- //ADC1->CTRL1 |= ADC_EOCIE; // прерывание по окончанию преобразования
- //NVIC_SetPriority(ADC_IRQn,1);
- //NVIC_EnableIRQ(ADC_IRQn);
- NVIC_SetPriority(DMA1_Channel1_IRQn,1);
- NVIC_EnableIRQ(DMA1_Channel1_IRQn);
- // разрешение - запросов DMA, внешние запуски, внешний запуск от SWSTART, непрерывный режим преобразования
- ADC1->CTLR2 |= ADC_DMA | ADC_EXTTRIG | ADC_EXTSEL | ADC_CONT;
- //запускаем преобразование
- ADC1->CTLR2 |= ADC_SWSTART;
- }
- void DMA1_Channel1_IRQHandler (void){
- DMA1->INTFCR |= DMA_CGIF1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement