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

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中断则需在严格的时间窗口内完成寄存器更新,否则会导致波形畸变。

在车载系统中,建议按以下原则配置中断优先级:

  1. 输入捕获中断:优先级最高,避免丢失边沿事件。
  2. PWM中断(占空比更新):次高优先级,确保波形完整性。
  3. 比较匹配中断:中等优先级,用于精确时间控制。
  4. 溢出中断:较低优先级,作为系统节拍基准。
实时响应调优建议:在中断服务程序中,仅执行必要的寄存器操作(如读取捕获值、更新CCR),将数据处理逻辑放在任务级执行,以最小化中断占用时间。
定时器中断触发机制与实时响应关系图 定时器计数器 (CNT) 溢出中断 CNT回零 → 置位UIF 比较匹配中断 CNT == CCR → 置位CCxIF 输入捕获中断 外部边沿 → 锁存CNT PWM中断 周期/占空比事件 实时响应层级(优先级从高到低) 输入捕获中断 PWM中断 比较匹配中断 溢出中断 说明:输入捕获中断对外部事件响应要求最高,需分配最高优先级; 溢出中断作为系统节拍,可分配较低优先级,避免频繁打断高实时任务。

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中断适合动态波形调整。在车载系统中,需根据实时性要求合理分配中断优先级,并在中断服务程序中保持轻量化设计。