在 STM32 里,TIM(定时器) 的两大常用模式
模式 | 英文 | 功能 | 谁触发中断 | 典型用途 |
---|
输入捕获 | Input Capture | “记住事件发生点的时间戳” | 外部信号跳变 | 测脉冲宽度、频率、占空比 |
输出比较 | Output Compare | “到点就翻转/置位/清零” | 计数器=比较值 | 生成精确延时、PWM、脉冲 |
- 输入捕获(Input Capture,IC):
外部引脚电平跳变 → 把当前计数器值“捕获”到寄存器里 - 关键寄存器:
CCRn:捕获寄存器(Capture/Compare Register)。
CCMR、CCER:配置捕获边沿(上升/下降/双边沿)。
DIER:允许捕获中断/DMA。 - 工作流程:
计数器 CNT 一直向上计数,引脚出现上升沿(或下降沿),硬件立即把 CNT 值锁进 CCRn,并可触发中断,软件读两次 CCRn 差值 , 算出脉宽/周期。
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1);
- 输出比较(Output Compare,OC):
计数器 CNT == CCRn 时,按设定动作翻转/置位/清零通道引脚。 - 关键寄存器:
CCRn:比较值(Compare Value)
CCMR、CCER:选择输出模式(冻结、置位、清零、翻转)
DIER:允许比较中断
输出比较工作模式对比
OC Mode | 计数器=CCRn 时引脚动作 | 用途 |
---|
TIM_OCMODE_TIMING | 无动作 | 纯中断延时 |
TIM_OCMODE_Active | 置 1 | 单脉冲 |
TIM_OCMODE_Inactive | 清 0 | 单脉冲 |
TIM_OCMODE_Toggle | 翻转 | 方波 |
TIM_OCMODE_PWM1/PWM2 | 自动产生 PWM | 电机/LED |
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
htim2.Init.Prescaler = 8400 - 1;
htim2.Init.Period = 1000 - 1;
HAL_TIM_OC_Init(&htim2);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim2, TIM_CHANNEL_1);
输出比较和输入捕获二者对比
维度 | 输入捕获 | 输出比较 |
---|
方向 | 外部 → MCU(测信号) | MCU → 外部(发信号) |
触发源 | 引脚边沿 | 内部计数器匹配 |
中断点 | 捕获到边沿 | 计数器=CCRn |
典型应用 | 测频率、占空比、脉冲宽度 | 生成 PWM、精确延时、脉冲 |