Прерывание АЦП STM32 NVIC не запускается

У меня есть STM32F411VET, и я хочу, чтобы прерывание сработало после завершения преобразования АЦП. Документация гласит следующее:

В режиме одиночного преобразования АЦП выполняет одно преобразование. Этот режим запускается с
Бит CONT в 0 либо:

  • установка бита SWSTART в регистр ADC_CR2 (только для обычного канала)
    После завершения преобразования выбранного канала:

Если обычный канал был преобразован:

  • Преобразованные данные сохраняются в 16-битном регистре ADC_DR
  • Флаг EOC (конец преобразования) установлен
  • Прерывание генерируется, если бит EOCIE установлен

Затем АЦП останавливается.

Таким образом, у меня есть следующий код:

Включение прерываний

SET_BIT(ADC1->CR1, ADC_CR1_EOCIE);      // enable interrupt generation
NVIC_EnableIRQ(ADC_IRQn);       // allow interrupt in NVIC
__enable_irq();     // change cpu flags to enable interrupts

Настройка АЦП

void ConfigureADC()
{
// PA1 - ADC_IN1
SET_BIT(GPIOA->MODER, GPIO_MODER_MODE1_0 | GPIO_MODER_MODE1_1);
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);      // enable ADC1 clock
SET_BIT(ADC1->CR2, ADC_CR2_ADON);       // enable ADC1
SET_BIT(ADC1->CR1, ADC_CR1_RES_1);      // 8-bit conversion
SET_BIT(ADC->CCR, ADC_CCR_ADCPRE_0);    // prescaler - /4
SET_BIT(ADC1->SQR3, 1);     // channel 1 (PA1)
SET_BIT(ADC1->CR2, ADC_CR2_CONT);       // Continious mode
}

Обработчик прерываний

void ADC_IRQHandler()
{
vConverted = true;
CLEAR_BIT(ADC1->SR, ADC_SR_EOC);        // Software clears EOC flag
}

В режиме отладки или чтения непосредственно из ADC1->DR зарегистрироваться я получаю прекрасный результат.

Меня беспокоит то, что я не могу отладить обработчик прерываний в uVision5 (я использую IDE).

Проблема в том, что обработчик прерываний не выполняется, и я не знаю, как правильно его отладить.


Спасибо всем за помощь.

1

Решение

Следует отметить, что используется C ++, и поэтому имена скомпилированных функций не совпадают с именами в коде, поэтому они не связаны / не заменены. На обработчик IRQ не было ссылки, и, следовательно, он не включен в скомпилированный код.

Связать функции «С» extern "C" должен быть использован.

extern "C"{
void ADC_IRQHandler();
// Other handlers
}

Чтобы получить больше информации о extern "C" Ссылаться на этот ответ.

2

Другие решения

Просто проверьте, если вы звоните SET_BIT (ADC1-> CR1, ADC_CR1_EOCIE); после ADC_Configure

1