STM32的同一中断的次数不会累计

本文探讨了STM32中,当某个中断被掩蔽时,若多次触发该中断,解除掩蔽后ISR是否会累计执行的问题。实验结果表明,定时器中断ISR不会多次执行,仅执行一次。原因是中断被悬起但不记录悬起次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想到了一个问题:假如STM32的某个中断被掩蔽(通过BASEPRI寄存器),被掩蔽期间如果该中断两次(或多次)触发,等解除掩蔽之后该中断的ISR(中断服务程序)会执行几次呢?会不会累计?

然后我用定时器中断测试了一下,结果显示该定时器中断的ISR并不会多次执行,只执行了一次。

原因:某个中断被掩蔽期间如果触发了该中断那么这个中断会被悬起(通过SETPEND寄存器自动悬起),但是只是标记了悬起的状态,并不会记录悬起的次数。

以上结论是在Cortex-M3上测试得出的。
(个人观点如有错误、不当之处欢迎指正)

### STM32 外部中断计数实现方法 在STM32微控制器中,外部中断可以用于检测特定事件的发生并触发相应的响应。为了实现外部中断计数功能,通常需要配置GPIO引脚作为外部中断源,并编写对应的中断服务程序来处理这些中断。 #### 配置外部中断线 对于STM32系列MCU而言,当使用EXTI10至EXTI15之间的线路时,在`EXTI15_10_IRQHandler()`这个通用的中断向量表入口处集中管理多个可能触发条件相似的中断请求[^1]。因此,在此函数内部应当进一步区分具体的哪个引脚引发了中断动作。 #### 中断服务例程中的防抖动措施 为了避免由于电气噪声或其他因素造成的误触发现象影响到最终的结果准确性,在每次确认有新的有效边沿变化之前加入适当长度的时间延迟是非常必要的。这可以通过调用诸如`Delay_ms(10)`这样的延时子程序完成[^2]。 #### 清除挂起位操作的重要性 每当一次成功的中断被识别之后,必须及时清除相应线路的状态寄存器内的待处理标记(`ITPendingBit`);否则将会导致同一类型的后续真实信号无法得到正常处理而丢失掉。这一过程可通过执行像`EXTI_ClearITPendingBit(EXTI_LineX)`之类的API指令达成目的。 以下是完整的C语言代码片段展示如何设置以及处理来自指定IO端口上的下降沿触发型外部中断: ```c #include "stm32f1xx_hal.h" volatile uint8_t CountSensor_Num = 0; void MX_GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; /* Configure PA.14 as input floating */ GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); } void EXTI15_10_IRQHandler(void) { if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_14)!= RESET){ // Check whether the interrupt is from line 14 HAL_Delay(10); // Debounce delay CountSensor_Num++; __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_14); // Clear pending bit of Line 14 } } ``` 上述代码展示了初始化PA.14为输入模式下的下降沿敏感型外部中断源的过程,并定义了一个名为`CountSensor_Num`的全局变量用来累计发生的次数。当中断发生时,先检查确实是来自于第14号线路再做下一步的动作以确保可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值