STM32 NVIC ADC 中断未触发
STM32 NVIC ADC interrupt not triggering
我有一个 STM32F411VET,我想在 ADC 转换完成后触发中断。文档说明如下:
In Single conversion mode the ADC does one conversion. This mode is started with the
CONT bit at 0 by either:
- setting the SWSTART bit in the ADC_CR2 register (for a regular channel only)
Once the conversion of the selected channel is complete:
If a regular channel was converted:
- The converted data are stored into the 16-bit ADC_DR register
- The EOC (end of conversion) flag is set
- An interrupt is generated if the EOCIE bit is set
Then the ADC stops.
因此,我有以下代码:
启用中断
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 我正在使用)。
问题是中断处理程序没有被执行,我不知道如何正确调试它。
感谢大家的帮助。
只要检查一下你是否调用了SET_BIT(ADC1->CR1, ADC_CR1_EOCIE);在 ADC_Configure
之后
我应该注意,使用的是 C++,因此,编译后的函数名称与代码中的名称不匹配,因此它们不是 binded/replaced。 IRQ 处理程序未被引用,因此未包含在编译代码中。
要使函数 'C' 链接,应使用 extern "C"
。
extern "C"
{
void ADC_IRQHandler();
// Other handlers
}
要获取有关 extern "C"
的更多信息,请参阅 that answer。
我有一个 STM32F411VET,我想在 ADC 转换完成后触发中断。文档说明如下:
In Single conversion mode the ADC does one conversion. This mode is started with the CONT bit at 0 by either:
- setting the SWSTART bit in the ADC_CR2 register (for a regular channel only) Once the conversion of the selected channel is complete:
If a regular channel was converted:
- The converted data are stored into the 16-bit ADC_DR register
- The EOC (end of conversion) flag is set
- An interrupt is generated if the EOCIE bit is set
Then the ADC stops.
因此,我有以下代码:
启用中断
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 我正在使用)。
问题是中断处理程序没有被执行,我不知道如何正确调试它。
感谢大家的帮助。
只要检查一下你是否调用了SET_BIT(ADC1->CR1, ADC_CR1_EOCIE);在 ADC_Configure
之后我应该注意,使用的是 C++,因此,编译后的函数名称与代码中的名称不匹配,因此它们不是 binded/replaced。 IRQ 处理程序未被引用,因此未包含在编译代码中。
要使函数 'C' 链接,应使用 extern "C"
。
extern "C"
{
void ADC_IRQHandler();
// Other handlers
}
要获取有关 extern "C"
的更多信息,请参阅 that answer。