Страница 1 из 1

stm32f4 adc+dma+tim

Добавлено: 12 апр 2019, 12:19
red15530
Может кто-нибудь помочь разобраться или поделиться кодом (если кто уже писал) для работы adc+dma+tim? Я использую камень stm32f405vgt6. И не как не могу разобраться как запустить adc+dma+tim. Всё работает нормально, но с ацп идут неправильные данные (я подаю с генератора синус частотой 400Гц)
код
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->CR1 |=ADC_CR1_SCAN;
ADC1->CR2 |=ADC_CR2_EXTEN_0;
ADC1->CR2 |=(ADC_CR2_EXTSEL_3);
ADC1->CR2 |= ADC_CR2_EOCS;
ADC1->CR2 |=ADC_CR2_DDS;
ADC1->CR2 |=ADC_CR2_DMA;
ADC1->SQR3 =1;
ADC1->CR2 |=ADC_CR2_ADON;

RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
//DMA low interrupt flag clear register
DMA2->LIFCR = 0x0F7D0F7D;
//DMA high interrupt flag clear register
DMA2->HIFCR = 0x0F7D0F7D;

DMA2_Stream4->CR|= DMA_SxCR_PL;
DMA2_Stream4->CR|= DMA_SxCR_MSIZE_0;
DMA2_Stream4->CR|= DMA_SxCR_PSIZE_0;
DMA2_Stream4->CR|= DMA_SxCR_MINC;
DMA2_Stream4->CR|= DMA_SxCR_CIRC;
DMA2_Stream4->CR|= DMA_SxCR_TCIE;
DMA2_Stream4->CR&=~ DMA_SxCR_DIR;
DMA2_Stream4->NDTR=1;
DMA2_Stream4->PAR= (uint32_t)&ADC1->DR;
DMA2_Stream4->M0AR=(uint32_t)&BUFF;
DMA2_Stream4->FCR = 3;
DMA2_Stream4->CR|= DMA_SxCR_EN;
NVIC_SetPriority(DMA2_Stream4_IRQn,5);
NVIC_EnableIRQ(DMA2_Stream4_IRQn);

RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 84-1;
TIM3->ARR = 50-1;
TIM3->CR1 |= TIM_CR1_URS;
TIM3->CR2 |= TIM_CR2_MMS_1;
TIM3->CR1 |= TIM_CR1_CEN;

void DMA2_Stream4_IRQHandler(void)
{
DMA2->LIFCR = 0x0F7D0F7D;
DMA2->HIFCR = 0x0F7D0F7D;
}

Re: stm32f4 adc+dma+tim

Добавлено: 12 апр 2019, 20:00
rhf-admin
Дайте целиком код, который как вы считаете работает неправильно. Покажите результаты тестов, - что получается при его работе, а так же то, что вы ожидаете увидеть. Тогда можно будет подумать и в отладчике посмотреть что не так. А так... проверять отдельные куски... :?

P.S. Попробуйте в стандартных библиотеках подсмотреть как инициализация выполняется. Там и примеры есть.