Question
Bare Metal implementation for Continuous Conversion Mode
Hello All,
I am trying to implement baremetal implementation for Continous Conversion Mode. I have wrote the below code. I am expecting that the ADC will read A0-B0-A1-B0 in this sequence. However the code is only reading A0 and not any other pins.
I am using STM32F401RE nucleo Board.
I am not able to clear EOC as well!!
typedef struct{
float AN[4];
}ADC_Vals_t;
int main(void)
{
uint16_t data;
float ADC_volt;
ADC_Vals_t ADCVal;
int i=0;
/*Enable clock to GPIO peripheral*/
RCC->AHB1ENR|= (0x1<<RCC_AHB1ENR_GPIOAEN_Pos); //Enable GPIOA
RCC->AHB1ENR |= (0x1<<RCC_AHB1ENR_GPIOBEN_Pos); //Enable GPIOB
/*Set GPIO to Analog Mode*/
GPIOA->MODER |= (0x3<<GPIO_MODER_MODER0_Pos); // GPIO A0
GPIOA->MODER |= (0x3<<GPIO_MODER_MODER1_Pos); //GPIO A1
GPIOA->MODER |= (0x3<<GPIO_MODER_MODER4_Pos); //GPIO A4
GPIOB->MODER |= (0x3<<GPIO_MODER_MODER0_Pos); //GPIO B0
/*Enable clock to ADC peripheral*/
RCC->APB2ENR |=(0x1<<RCC_APB2ENR_ADC1EN_Pos);
/*Configure ADC trigerring and resolution*/
ADC1->CR2=0;
//Enable COntinous Mode
ADC1->CR2 |= (0x1<<ADC_CR2_CONT_Pos);
/*Set conversion sequence and length*/
ADC1->SQR1 |= (0x3<<ADC_SQR1_L_Pos); //Set length of sequence
ADC1->SQR3 |= (0x0 << ADC_SQR3_SQ1_Pos); //Set Sequence number ADC1_IN0
ADC1->SQR3 |= (0x8<<ADC_SQR3_SQ2_Pos); //ADC1_IN8
ADC1->SQR3 |= (0x1<<ADC_SQR3_SQ3_Pos); //ADC1_IN1
ADC1->SQR3 |= (0x4<<ADC_SQR3_SQ4_Pos); //ADC1_IN4
/*SCAN mode*/
ADC1->CR1 |= (1<<ADC_CR1_SCAN_Pos);
/*Enable ADC*/
ADC1->CR2 |=(0x1<<ADC_CR2_ADON_Pos);
for(;;){
/*Start conversion*/
ADC1->CR2 |= (1<<ADC_CR2_SWSTART_Pos);
/*Wait for conversion to end*/
while(!(ADC1->SR & 0x2));
/*REad Data*/
data = ADC1->DR;
/*Multiply with prescaler
* data is 12Bit resolution
*
* */
ADC_volt = ((3.3/4095)*data);
ADCVal.AN[i++] =ADC_volt;
if(i==4){
i=0;
}
}
}