Skocz do zawartości

[STM32F4] ADC DMA długość bufora.


kasjo

Pomocna odpowiedź

Próbuję odczytać jak najszybciej napięcie z ADC czymś takim:

	GPIO_InitTypeDef gpio;
SPI_InitTypeDef spi;
ADC_InitTypeDef adc;
ADC_CommonInitTypeDef adc_common;
DMA_InitTypeDef dma;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_ADC3, ENABLE);
gpio.GPIO_Mode = GPIO_Mode_AN;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Pin = GPIO_PIN_0;
GPIO_Init(GPIOA, &gpio);

dma.DMA_BufferSize = 3;
dma.DMA_Channel = DMA_Channel_0;
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
dma.DMA_Memory0BaseAddr = 0xD0000000;
dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_Mode = DMA_Mode_Circular;
dma.DMA_PeripheralBaseAddr = &ADC->CDR;
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA2_Stream0, &dma);
DMA_Cmd(DMA2_Stream0, ENABLE);

adc_common.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
adc_common.ADC_Mode = ADC_TripleMode_Interl;
adc_common.ADC_Prescaler = ADC_Prescaler_Div2;
adc_common.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&adc_common);

adc.ADC_ContinuousConvMode = ENABLE;
adc.ADC_DataAlign = ADC_DataAlign_Right;
adc.ADC_ExternalTrigConv = DISABLE;
adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
adc.ADC_NbrOfConversion = 1;
adc.ADC_Resolution = ADC_Resolution_12b;
adc.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &adc);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
ADC_DMACmd(DMA1, ENABLE);
ADC_Init(ADC2, &adc);
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
ADC_Init(ADC3, &adc);
ADC_RegularChannelConfig(ADC3, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
ADC_Cmd(ADC3, ENABLE);
ADC_SoftwareStartConv(ADC1);

Teraz chciałbym odczytane wartości przez krótki okres czasu pchać do pamięci żeby je potem obrobić.

Czy mogę w ten sposób wrzucić jedynie 65536 wartości? Bo chyba taki maksymalnie może mieć rozmiar bufora dla DMA?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.