I can't figure out DMA, I've tried everything, it doesn't work. Separately Procedure MyAdcInit(); works fine, but DMA_Buffer is empty. What am I doing wrong?
Code: Select all
procedure AdcDmaInit();
begin
// ADC1_Init;
MyAdcInit();
// Delay_ms(100);
RCC_AHBENR.B0 := 1;
DMA1_CPAR1 := DWORD(@ADC1_DR);
DMA1_CMAR1 := DWORD(@DMA_Buffer[0]);
DMA1_CNDTR1 := dword(sizeof(ADC_BUFFER_SIZE));
//DMA1_CCR1 := MINC or CIRC or PSIZE0 or MSIZE0 or TCIE;
//DMA1_CCR1 := $000025A0;
MINC_bit := 1;
PSIZE0_bit := 1;
MSIZE1_bit := 1;
CIRC_bit := 1;
TCIE_bit := 1;
EN_bit := 1;
end;
Procedure MyAdcInit();
begin
// GPIOA
RCC_APB2ENR := RCC_APB2ENR or RCC_APB2ENR.IOPAEN;
// GPIOA.3
GPIOA_CRL.MODE30 := 0; //
GPIOA_CRL.MODE31 := 0; //
GPIOA_CRL.CNF30 := 0; //
GPIOA_CRL.CNF31 := 0; //
ADC1_CR2.TSVREFE := 1;
RCC_APB2ENR.ADC1EN := 1;
RCC_CFGR.ADCPRE0 := 0; //
RCC_CFGR.ADCPRE1 := 1; //
//
ADC1_CR1 := 0;
ADC1_SQR1 := 0;
//
ADC1_CR2.CAL := 1;
while (ADC1_CR2.CAL) = 0 do; //
// ADC1_CR2.B1 := 1; // CONT
ADC1_CR2.B8 := 1; // ADC
//(SWSTART)
ADC1_CR2.EXTSEL0 := 1;
ADC1_CR2.EXTSEL1 := 1;
ADC1_CR2.EXTSEL2 := 1;
ADC1_CR2.EXTTRIG := 1;
//
ADC1_CR2.ADON := 1;
end;
function DMAReadADC2(numb: integer): word;
begin
ADC1_SQR3 := (numb shl (5 * 0));
ADC1_CR2.SWSTART := 1; // ADC
// while (ADC1_SR.EOC) = 0 do ;
//
Result := {@ADC1_DR;//}@DMA_Buffer;
end;
Thank you!