4. 定时器中断触发机制:溢出中断、比较匹配中断、输入捕获中断、PWM中断
在车载MCU实时系统中,定时器中断是驱动任务调度、信号测量与波形生成的核心机制。不同的中断触发方式对应不同的硬件事件,理解其触发原理与配置差异,是实现高精度实时响应的前提。本章详细解析四种基本定时器中断的触发条件、典型应用场景及配置要点。
4.1 溢出中断(Overflow Interrupt)
溢出中断是最基础的定时器中断类型。当定时器计数器(如TIMx_CNT)从最大值(如0xFFFF)递增到0x0000时,硬件自动置位溢出标志位(如TIM_SR_UIF),若使能了溢出中断,则触发中断服务程序。
- 触发条件:计数器达到自动重装载值(ARR)后回零。
- 典型应用:周期性任务调度、系统心跳(SysTick替代方案)、软件定时器基准。
- 配置要点:设置预分频器(PSC)与自动重装载值(ARR)确定溢出周期;注意溢出中断优先级不宜过低,避免影响系统节拍。
关键公式:溢出周期 T_ov = (PSC + 1) × (ARR + 1) / TIM_CLK
例如:TIM_CLK = 80 MHz,PSC = 7999,ARR = 9999 → T_ov = 8000 × 10000 / 80e6 = 1.0 s
例如:TIM_CLK = 80 MHz,PSC = 7999,ARR = 9999 → T_ov = 8000 × 10000 / 80e6 = 1.0 s
4.2 比较匹配中断(Compare Match Interrupt)
比较匹配中断允许在计数器达到预设的特定值时触发中断,比溢出中断更灵活。每个定时器通道独立配置比较值(如TIMx_CCRx),当CNT与CCR相等时产生中断。
- 触发条件:计数器值等于通道比较寄存器值。
- 典型应用:单次定时、多路不同周期事件、PWM占空比更新、步进电机脉冲控制。
- 配置要点:可配置输出比较模式(如翻转、强制高/低、PWM模式);多通道可独立设置比较值,实现多时间点触发。
| 比较模式 | 中断触发行为 | 车载典型场景 |
|---|---|---|
| 翻转模式 | 每次匹配时输出电平翻转 | 红外载波生成、LED呼吸灯 |
| 强制高/低 | 匹配后输出固定电平 | 电磁阀开关控制 |
| PWM模式1/2 | 匹配时决定输出极性 | 电机驱动、DCDC调压 |
4.3 输入捕获中断(Input Capture Interrupt)
输入捕获中断用于测量外部信号的频率、周期、脉宽或相位差。当外部信号在捕获引脚上产生指定边沿(上升沿/下降沿)时,硬件将当前计数器值锁存到捕获寄存器(TIMx_CCRx)并触发中断。
- 触发条件:外部输入信号边沿(上升沿、下降沿或双边沿)。
- 典型应用:轮速传感器脉冲测量、曲轴位置信号解码、超声波回波时间测量、PWM输入信号解调。
- 配置要点:需设置捕获通道、边沿极性、预分频(数字滤波);注意捕获中断响应时间直接影响测量精度。
车载实战提示:在测量轮速传感器信号时,建议使用输入捕获的双边沿触发模式,同时测量高电平脉宽与周期,可有效抑制噪声干扰并提高转速计算精度。
4.4 PWM中断(PWM Interrupt)
PWM中断并非独立的中断类型,而是基于比较匹配或溢出中断的组合应用。在PWM输出模式下,当计数器达到比较值(占空比事件)或达到重装载值(周期事件)时,均可触发中断。
- 触发条件:PWM周期更新事件(溢出中断)或占空比匹配事件(比较匹配中断)。
- 典型应用:动态调整PWM占空比、多通道PWM同步更新、故障保护响应(如过流时立即关闭PWM输出)。
- 配置要点:通常使能更新中断(UEV)用于周期同步,使能比较中断用于占空比调整;注意中断服务程序中修改CCR值时需考虑影子寄存器更新时机。
常见误区:在PWM中断中直接修改占空比时,若未等待影子寄存器更新完成,可能导致输出波形出现毛刺或周期错乱。建议在更新事件中断(溢出中断)中统一修改所有通道的CCR值。
4.5 四种中断触发机制对比
| 中断类型 | 触发源 | 触发时机 | 典型精度 | 车载应用 |
|---|---|---|---|---|
| 溢出中断 | 计数器回零 | 固定周期 | μs ~ ms | 系统节拍、任务调度 |
| 比较匹配中断 | CNT == CCR | 可编程时间点 | ns ~ μs | 多路定时、脉冲控制 |
| 输入捕获中断 | 外部信号边沿 | 外部事件触发 | ns级(取决于时钟) | 传感器信号测量 |
| PWM中断 | 周期/占空比事件 | PWM周期内多点 | μs级 | 动态调压、电机控制 |
4.6 中断触发机制与实时响应关系
不同的中断触发方式对CPU的实时响应要求不同。溢出中断和比较匹配中断由定时器内部事件触发,响应时间可预测;输入捕获中断由外部信号触发,响应延迟直接影响测量精度;PWM中断则需在严格的时间窗口内完成寄存器更新,否则会导致波形畸变。
在车载系统中,建议按以下原则配置中断优先级:
- 输入捕获中断:优先级最高,避免丢失边沿事件。
- PWM中断(占空比更新):次高优先级,确保波形完整性。
- 比较匹配中断:中等优先级,用于精确时间控制。
- 溢出中断:较低优先级,作为系统节拍基准。
实时响应调优建议:在中断服务程序中,仅执行必要的寄存器操作(如读取捕获值、更新CCR),将数据处理逻辑放在任务级执行,以最小化中断占用时间。
4.7 代码示例:四种中断配置框架
以下代码展示了在STM32系列MCU上配置四种定时器中断的核心步骤,采用HAL库风格,实际车载项目中需根据具体MCU型号调整寄存器地址。
/* 定时器基础配置(以TIM2为例) */
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7999; // 预分频:80MHz / 8000 = 10kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999; // 自动重装载值:10kHz / 10000 = 1Hz
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&htim2);
/* 溢出中断使能 */
HAL_TIM_Base_Start_IT(&htim2);
/* 比较匹配中断配置(通道1) */
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 5000; // 比较值:5000 ticks
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_1);
/* 输入捕获中断配置(通道2) */
TIM_IC_InitTypeDef sConfigIC = {0};
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
/* PWM中断配置(通道3) */
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 2500; // 25% 占空比
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
}
/* 中断服务函数示例 */
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
}
/* 溢出中断回调 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2) {
// 系统节拍处理
}
}
/* 比较匹配中断回调 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
// 单次定时事件处理
}
}
/* 输入捕获中断回调 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
uint32_t capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
// 处理捕获值
}
}
/* PWM中断回调(更新事件) */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) {
// 占空比更新完成处理
}
}
4.8 车载应用场景总结
| 中断类型 | 车载ECU应用 | 实时性要求 | 优先级建议 |
|---|---|---|---|
| 溢出中断 | BCM系统心跳、网关报文周期发送 | 中(ms级) | 低 |
| 比较匹配中断 | 喷油嘴喷射时刻控制、点火提前角 | 高(μs级) | 中高 |
| 输入捕获中断 | 轮速传感器、曲轴位置传感器 | 极高(ns~μs级) | 最高 |
| PWM中断 | 电机驱动占空比更新、DCDC调压 | 高(μs级) | 高 |
课程要点回顾:四种定时器中断触发机制各有侧重——溢出中断适合周期性任务,比较匹配中断适合精确时间点控制,输入捕获中断适合外部信号测量,PWM中断适合动态波形调整。在车载系统中,需根据实时性要求合理分配中断优先级,并在中断服务程序中保持轻量化设计。