У меня есть 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).
Проблема в том, что обработчик прерываний не выполняется, и я не знаю, как правильно его отладить.
Спасибо всем за помощь.
Следует отметить, что используется C ++, и поэтому имена скомпилированных функций не совпадают с именами в коде, поэтому они не связаны / не заменены. На обработчик IRQ не было ссылки, и, следовательно, он не включен в скомпилированный код.
Связать функции «С» extern "C"
должен быть использован.
extern "C"{
void ADC_IRQHandler();
// Other handlers
}
Чтобы получить больше информации о extern "C"
Ссылаться на этот ответ.
Просто проверьте, если вы звоните SET_BIT (ADC1-> CR1, ADC_CR1_EOCIE); после ADC_Configure