一、开篇:核心疑问
在 STM32 定时中断开发中,很多人会遇到一个 "看似矛盾" 的问题:明明配置的是 "每 2 次中断翻转一次 LED",最终却看到 LED"1 秒亮、1 秒灭"------ 这不是应该 "2 秒亮、2 秒灭" 吗?
其实问题的关键,是没理清 "中断触发条件" 和 "中断时间基准" 的绑定关系。本文以 TIM2 定时器 1 秒中断为例,从 "完整翻转循环" 的定义入手,一步步拆解 "每 2 次中断翻一次" 为何对应 "1 秒亮灭",帮你彻底吃透定时中断与 LED 控制的逻辑。
二、先明确两个基础前提:避免理解偏差
在分析前,必须先敲定代码里的两个 "固定条件"------ 这是后续所有逻辑的基础,少了它们,就会越想越乱:
- TIM2 中断周期是 1 秒 :通过
Prescaler=7200-1
(72MHz 分频为 10kHz)和Period=10000-1
(计数 10000 次)配置,TIM2 每 1 秒触发一次中断,即TIM2_IRQHandler
每 1 秒执行一次。- LED 翻转逻辑绑定中断次数 :代码中用
unsigned char cnt
记录中断次数,每进一次中断cnt+1
;通过cnt&0x01
判断奇偶性 ------ 奇数次中断(cnt=1、3、5...
)时 LED 亮,偶数次中断(cnt=2、4、6...
)时 LED 灭,本质是 "每 2 次中断完成一次'亮→灭'或'灭→亮'的完整翻转"。
三、核心拆解:从 "2 次中断完整循环" 到 "1 秒亮灭" 的 3 步推导
咱们以 "LED 初始状态为灭" 为例,结合 1 秒中断周期,按 "时间轴→状态变化→时长计算" 的顺序,把逻辑拆透:
第一步:定义 "完整翻转循环"------2 次中断才够
什么是 "完整翻转循环"?对 LED 来说,是从 "初始状态" 出发,经过两次状态变化后 "回到初始状态" 的过程。在你的代码里:
- 初始状态:灭;
- 第 1 次中断(1 秒时):
cnt=1
(奇)→ 灭→亮(第一次状态变化);- 第 2 次中断(2 秒时):
cnt=2
(偶)→ 亮→灭(第二次状态变化);- 至此,LED 从 "灭" 出发,经过 2 次中断,回到 "灭"------ 这就是一次 "完整翻转循环",需要 2 次中断才能完成。
第二步:拆解 "完整循环" 的时间分布 ------1 秒中断周期是关键
因为 TIM2 中断周期是 1 秒(每 1 秒触发一次),所以 "2 次中断" 的总时长是
2×1秒=2秒
,但这 2 秒内,LED 的状态不是 "一直变",而是 "中断时才变,不中断时保持不变":
时间区间 中断次数 cnt 值 LED 状态 状态持续时长 关键逻辑 0 秒(上电)→1 秒 0 次 0 灭 - 未触发中断,保持初始状态 1 秒(第 1 次中断)→2 秒 1 次 1 亮 1 秒 中断触发后变亮,之后保持到下一次中断 2 秒(第 2 次中断)→3 秒 2 次 2 灭 1 秒 中断触发后变灭,之后保持到下一次中断 3 秒(第 3 次中断)→4 秒 3 次 3 亮 1 秒 重复第 1 次中断后的逻辑 从表格能清晰看到:每 1 个 "中断周期(1 秒)",LED 只保持 1 个状态------ 亮 1 秒,是因为从第 1 次中断到第 2 次中断间隔 1 秒;灭 1 秒,是因为从第 2 次中断到第 3 次中断间隔 1 秒。
第三步:推导因果关系 ------ 为什么是 "1 秒亮灭"?
核心结论藏在 "状态变化的触发时机" 和 "中断周期" 的绑定里:
LED 的状态只在中断触发时改变,中断不触发时,状态不会自动变(硬件特性决定);
两次中断的间隔是 1 秒(中断周期),所以 "亮" 的状态能持续 1 秒(从第 1 次到第 2 次中断),"灭" 的状态也能持续 1 秒(从第 2 次到第 3 次中断);
而 "每 2 次中断完成一次完整循环",只是描述 "LED 回到初始状态需要 2 次中断",但循环内的每个 "单个状态",时长都等于 "中断周期(1 秒)"------ 这就是 "1 秒亮、1 秒灭" 的本质。
四、反推验证:如果中断周期变了,结果会怎样?
为了让逻辑更扎实,咱们做个 "反推实验":假设把 TIM2 中断周期改成 2 秒(
Period=20000-1
),其他逻辑不变,会出现什么情况?
- 第 1 次中断(2 秒时):LED 灭→亮,之后保持亮到第 2 次中断;
- 第 2 次中断(4 秒时):LED 亮→灭,之后保持灭到第 3 次中断;
- 最终效果:LED"2 秒亮、2 秒灭"。