STM32 定时中断逻辑拆解:为什么 “每 2 次中断翻一次 LED”,却是 1 秒亮 1 秒灭?

一、开篇:核心疑问

在 STM32 定时中断开发中,很多人会遇到一个 "看似矛盾" 的问题:明明配置的是 "每 2 次中断翻转一次 LED",最终却看到 LED"1 秒亮、1 秒灭"------ 这不是应该 "2 秒亮、2 秒灭" 吗?

其实问题的关键,是没理清 "中断触发条件" 和 "中断时间基准" 的绑定关系。本文以 TIM2 定时器 1 秒中断为例,从 "完整翻转循环" 的定义入手,一步步拆解 "每 2 次中断翻一次" 为何对应 "1 秒亮灭",帮你彻底吃透定时中断与 LED 控制的逻辑。

二、先明确两个基础前提:避免理解偏差

在分析前,必须先敲定代码里的两个 "固定条件"------ 这是后续所有逻辑的基础,少了它们,就会越想越乱:

  1. TIM2 中断周期是 1 秒 :通过Prescaler=7200-1(72MHz 分频为 10kHz)和Period=10000-1(计数 10000 次)配置,TIM2 每 1 秒触发一次中断,即TIM2_IRQHandler每 1 秒执行一次。
  2. 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 秒灭"。
相关推荐
充哥单片机设计8 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
EatFan8 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网·esp32
sunoo-2299 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Brilliantwxx10 小时前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
Doraemomo10 小时前
IMX6ULL裸机开发——PWM
arm开发·嵌入式硬件·imx6ull
老当益壮梁奶奶11 小时前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
西城微科方案开发12 小时前
基于SIC8F0535芯片的红外额温枪开发方案
单片机·嵌入式硬件
LCG元12 小时前
STM32F103 NTC 热敏电阻测温实战:分压网络设计、Steinhart-Hart 标定与 ADC 采样优化实测
stm32·单片机·嵌入式硬件
M78佐菲12 小时前
ARM学习笔记(五)
linux·arm开发·笔记·嵌入式硬件·学习
恒锐丰科技林技术员12 小时前
EG2184 半桥栅极驱动芯片详解:高压半桥电路的性价比之选
经验分享·嵌入式硬件·硬件工程