STM32F411VE La interrupción ADC no funciona

0

Mi código funciona bien sin interrupción (traté de sondear el valor ADC) pero cuando habilité la interrupción, no funcionó. Al depurar en Keil, nunca alcanza el ADC_IRQHandler() . También encontré que el indicador EOC siempre se establece (en el bucle while)

Este es mi código:

#include "stm32f4xx.h"                  // Device header
volatile int16_t k=0;
int main()
{

RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN ;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;

GPIOA->MODER |= GPIO_MODER_MODE0; //analog input
GPIOA->PUPDR &=~ GPIO_PUPDR_PUPD0; 
GPIOD->MODER |= GPIO_MODER_MODE13_0;//ouput
GPIOD->MODER &=~ GPIO_MODER_MODE13_1;
GPIOD->OTYPER &=~ GPIO_OTYPER_OT13;
GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0 ;
GPIOD->PUPDR &=~ GPIO_PUPDR_PUPD13 ;
GPIOD->ODR &=~ GPIO_ODR_OD13;

ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CONT;
ADC1->SMPR2 |= ADC_SMPR2_SMP0_1;
ADC1->SQR3 &=~ ADC_SQR3_SQ1_4; //CHANNEL 0 (PA0)
ADC1->CR1 |= ADC_CR1_EOCIE;
NVIC_EnableIRQ(ADC_IRQn);
NVIC_SetPriority(ADC_IRQn,0);
ADC1->CR2 |= ADC_CR2_SWSTART;

while(1)
{
}

}
void ADC_IRQHandler()
{
     k= ADC1->DR;
     if(k>2000)
     {
        GPIOD->ODR ^= GPIO_ODR_OD13;
     }
}
    
pregunta Mourad

1 respuesta

1

Debo agregar este extern "C" porque estoy en c ++ no en c:

    extern "C" {
     void ADC_IRQHandler()
     {
           // do whatever
     }
    }

esta es la respuesta completa: Error en el compilador Keil ARM con controladores de interrupción y C ++?

    
respondido por el Mourad

Lea otras preguntas en las etiquetas