ADC1 and 2 timing longer than data sheet values
Hello,
I try to setup ADC1 and ADC2, but I don't get the timing values given in reference manual and data sheet. I work with STM32H743 Nucleo
I have setup RCC to clk ADC with 36 MHz from PLL2P. I checked the frequency at master clock out 2 on PC9. To initialize ADC1 and 2 I use this code:
volatile uint32_t wait_cnt;
// ADC init: for ADC1 and ADC2
// reset ADC1 and ADC2:
SetBitMask (RCC->AHB1RSTR, RCC_AHB1RSTR_ADC12RST);
ClearBitMask (RCC->AHB1RSTR, RCC_AHB1RSTR_ADC12RST);
// enable ADC clk
SetBitMask (RCC->AHB1ENR, RCC_AHB1ENR_ADC12EN);
__DSB (); // needs to be here according to errata, to wait till periph clk is enabled
ClearBitMask (ADC1->CR, ADC_CR_DEEPPWD);
ClearBitMask (ADC2->CR, ADC_CR_DEEPPWD);
SetBitMask (ADC1->CR, ADC_CR_ADVREGEN);
SetBitMask (ADC2->CR, ADC_CR_ADVREGEN);
SetPortBit (port_Testpins, pin_ADC_test);
for (wait_cnt = 0; wait_cnt < 500; wait_cnt++)
{ // wait for ADC voltage regulator to stabilize, this loop is ca 12 µsec
__NOP ();
__NOP ();
}
ClearPortBit (port_Testpins, pin_ADC_test);
SetBitMask (ADC1->CR, ADC_CR_BOOST);
SetBitMask (ADC2->CR, ADC_CR_BOOST);
SetBitMask (ADC1->CR, ADC_CR_ADCALDIF | ADC_CR_ADCALLIN);
SetBitMask (ADC2->CR, ADC_CR_ADCALDIF | ADC_CR_ADCALLIN);
SetBitMask (ADC1->CR, ADC_CR_ADCAL);
SetBitMask (ADC2->CR, ADC_CR_ADCAL);
SetPortBit (port_Testpins, pin_ADC_test);
while (BitMaskIsNOTClear(ADC1->CR, ADC_CR_ADCAL) || BitMaskIsNOTClear(ADC2->CR, ADC_CR_ADCAL))
{ // wait for calibration to complete
}
ClearPortBit (port_Testpins, pin_ADC_test);
SetBitMask (ADC1->ISR, ADC_ISR_ADRD); // to clear it
SetBitMask (ADC2->ISR, ADC_ISR_ADRD); // to clear it
SetBitMask (ADC1->CR, ADC_CR_ADEN);
SetBitMask (ADC2->CR, ADC_CR_ADEN);
SetPortBit (port_Testpins, pin_ADC_test);
while (BitMaskIsClear(ADC1->ISR, ADC_ISR_ADRD) || BitMaskIsClear(ADC2->ISR, ADC_ISR_ADRD))
{ // wait for startup to complete
}
ClearPortBit (port_Testpins, pin_ADC_test);
ADC1->SQR1 = (3 << ADC_SQR1_SQ1_Pos) + (1-1);
ADC1->PCSEL = 1 << 3;
ADC1->SMPR1 |= 2 << ADC_SMPR1_SMP3_Pos; // 2 = 8,5 ADC clk cycles
ADC1->ISR = ADC_ISR_EOS;
SetBitMask (ADC1->CR, ADC_CR_ADSTART);
SetPortBit (port_Testpins, pin_ADC_test);
while (BitMaskIsClear(ADC1->ISR, ADC_ISR_EOS))
{ // wait for calibration to complete
}
ClearPortBit (port_Testpins, pin_ADC_test);I have set 8.5 clk cycles sampling time + another 8.5 for conversion time, @36MHz I would expect a total conversion time of 472 nsec but I get 670 nsec.
Even more differing from datasheet is the time for calibration. Data sheet says it is 16384 cycles = 455µsec @36MHz but I measure 4.56 msec. Is there a digit missing in data sheet ?
Do I miss some setting in my code?
Any help is welcome
Thanks a lot.
Martin
