STM32F401RET6输入捕获模式中断未触发问题求助
排查TIM5输入捕获中断未触发的问题
以下是针对你代码的逐一排查和修复点:
1. 必须清除中断标志位
中断触发后,必须手动清除TIM5->SR寄存器中的CC3IF标志,否则NVIC会持续认为中断未处理,后续中断无法正常触发。修改中断处理函数:
void TIM5_IRQHandler (void){ if(TIM5->SR & TIM_SR_CC3IF){ value1 = (uint32_t)READ_REG(TIM5->CCR3); CLEAR_BIT(TIM5->SR, TIM_SR_CC3IF); // 清除捕获中断标志 } // 若需处理更新中断,同步清除UIF标志 if(TIM5->SR & TIM_SR_UIF){ CLEAR_BIT(TIM5->SR, TIM_SR_UIF); } }
2. 补全GPIO上下拉配置
PA2默认是浮空输入,若外部信号驱动能力弱或电平不稳定,无法被正确识别。根据你的输入信号电平,添加上下拉配置:
// 示例:配置为上拉输入(适配低电平有效的信号) MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR2, 1U << GPIO_PUPDR_PUPDR2_Pos); // 若信号为高电平有效,改为下拉输入 // MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR2, 2U << GPIO_PUPDR_PUPDR2_Pos);
3. 修正定时器预分频配置(不影响中断,但影响频率计算)
你期望定时器时钟为10kHz,但当前PSC=15的配置不符合预期:STM32F401的APB1时钟默认是42MHz,定时器时钟为APB1时钟×2(预分频>1时)即84MHz,实际计数频率为84MHz/(15+1)=5.25MHz。若要得到10kHz,PSC应设置为:
WRITE_REG(TIM5->PSC, 8399U); // 84MHz/(8399+1)=10kHz
4. 验证外部输入信号有效性
- 确保输入信号电平符合STM32 IO标准(高电平≥2V,低电平≤0.8V)。
- 用示波器测量PA2引脚,确认有清晰的边沿变化脉冲输入。
5. 确认NVIC配置合理性
你已启用TIM5中断并设置优先级,需确保:
- 系统中无更高优先级中断持续占用CPU(你的代码中无其他中断,此点可忽略)。
- 中断优先级分组配置合法(默认分组下优先级1有效)。
内容的提问来源于stack exchange,提问作者Antonio Fortunato
相关产品推荐
相关产品推荐

