STM32 NVIC ADC中断未触发

时间:2017-04-27 22:49:14

标签: c++ c interrupt stm32 cmsis

我有一个STM32F411VET,我希望在ADC转换完成后触发中断。文档说明如下:

  

在单次转换模式下,ADC执行一次转换。此模式以。开头   CONT位于0位:

     
      
  • 设置ADC_CR2寄存器中的SWSTART位(仅适用于常规通道)   完成所选频道的转换后:
  •   
     

如果转换了常规频道:

     
      
  • 转换后的数据存储在16位ADC_DR寄存器
  • 中   
  • 设置了EOC(转换结束)标志
  •   
  • 如果EOCIE位置1,则会产生中断
  •   
     

然后ADC停止。

因此,我有以下代码:

启用中断

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

配置ADC

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)中调试中断处理程序。

问题是中断处理程序没有被执行,我不知道如何正确调试它。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:2)

我应该注意使用C ++,因此,编译的函数名称与代码中的函数名称不匹配,因此它们不被绑定/替换。 IRQ处理程序未被引用,因此未包含在已编译的代码中。

制作功能' C'应使用链接的extern "C"

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

要获取有关extern "C"的更多信息,请参阅that answer

答案 1 :(得分:1)

检查是否调用SET_BIT(ADC1-> CR1,ADC_CR1_EOCIE);在ADC_Configure之后