STM32启用ADC中断后程序停止运行,ADC中断处理函数是否书写正确?
问题原因及修复方案
- 第一个错误是中断服务函数名与实际注册的中断号不匹配
STM32F0系列的ADC1与比较器共用中断向量,你在NVIC中注册的是ADC1_COMP_IRQn,但你写的中断函数名为ADC1_IRQHandler,二者不匹配。当中断触发时,MCU会跳转到默认的空中断处理函数(通常是无限循环),直接导致程序停止运行。
修复方法:将中断函数名改为ADC1_COMP_IRQHandler,和你注册的中断号保持一致。 - 第二个错误是中断服务函数未处理中断标志位
你已经使能了ADC的转换结束(EOC)、序列结束(EOS)中断,中断触发后如果不主动清除对应的中断标志位,中断会持续触发,CPU会一直被占用处理中断,完全无法运行主循环代码。
修复方法:在中断服务函数中读取ADC转换值、清除中断标志,示例代码如下:void ADC1_COMP_IRQHandler(void) { // 检查转换结束标志 if(ADC1->ISR & (ADC_ISR_EOC | ADC_ISR_EOS)) { // 读取ADC转换值,读取操作同时会清除EOC标志 adcValue = ADC1->DR; // 手动清除序列结束标志 ADC1->ISR |= ADC_ISR_EOS; // 此处补充你需要的处理逻辑,比如根据adcValue计算rpm值 } } - 第三个可选优化点:全局变量
rpm如果会在中断服务函数中被修改,需要给它加上volatile修饰,避免编译器优化导致主循环读取到的是缓存的旧值:volatile uint32_t rpm;
内容的提问来源于stack exchange,提问作者peyman khalili
相关产品推荐
相关产品推荐

