I am trying to configure adc in stm32f091rc in interrupt mode but having problem with callback function called from the interrupt request handler. I have attached my codes below, I tried to follow a tutorial on stm32f4 and i ported the code for my specific MCU but it didn't work.
#define ADCENABLE (1U<<9)
#define GPIOAENABLE (1U<<17)
#define ADC_CH1 (1U<<1)
#define CR_ADEN (1U<<0)
#define CFGR_CONT (1U<<13)
#define CR_EOCIE (1U<<2)
void pa1_adc_interrupt_init(void)
{
/* Configure the ADC GPIO Pin */
/* Enable Clock access to gpioa */
RCC->AHBENR |= GPIOAENABLE;
/* Set the mode of PA1 to analog mode */
GPIOA->MODER |= (1<<2);
GPIOA->MODER |= (1<<3);
/* Configure the ADC module */
/* Enable clock access to ADC */
RCC->APB2ENR |= ADCENABLE;
/* Enable ADC end-of-conversion interrupt */
ADC1->IER |= CR_EOCIE;
/* Setting Priority */
//NVIC_SetPriority(ADC1_COMP_IRQn, 0);
/* Enable ADC interrupt in NVIC */
NVIC_EnableIRQ(ADC1_COMP_IRQn);
/* Configure adc parameters */
/* Conversion sequence start */
ADC1->CHSELR = ADC_CH1;
/* Conversion sequence length */
/* Enable ADC module */
ADC1->CR |= CR_ADEN;
}
static void adc_callback(void)
{
sensor_value = ADC1->DR;
printf("the sensor value is %d \n\r", (int)sensor_value);
}
void ADC_COM_IRQHandler(void)
{
/* Check for eoc in SR */
/*
if(ADC1->ISR & ADC_EOC)
{
// Clear EOC
ADC1->ISR &= ~ADC_EOC;
// doing sth here
adc_callback();
}
*/
if(EXTI->PR & (1U<<21))
{
adc_callback();
val = 1;
EXTI->PR |= (1U<<21);
}
}
adc_callback is somewhat not called, I tried to call the callback when the pending status is read as 1 and i clear it with 1 to indicate that the pending is cleared.
Can anyone help me with the problem i am facing ?
prinf
in the interrupt handlersADC1_COMP_IRQHandler
. Check your vector table definition.And probably plenty other issues.
I would suggest to write the code with the Reference Manual in your hand instead of following the internet tutorials.