1. CCR寄存器在输入捕获模式下的特性
- 只读属性:
当定时器通道配置为输入捕获模式(如捕获上升沿/下降沿)时,CCR寄存器硬件自动变为只读。软件写入操作无效,只能在捕获事件发生时由硬件自动更新为当前CNT值。 - 硬件自动装载:
当指定的边沿(如PA8下降沿)触发捕获时,硬件自动将当前计数器值(CNT)写入CCR寄存器,并置位中断标志位(如TIM_IT_CC1
)。
⚙️ 2. 清零机制:硬件复位CNT计数器
用户代码中通过主从模式实现了间接清零效果:
TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1); // 选择PA8作为触发源
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset); // 复位模式:PA8下降沿复位CNT
- 工作流程:
- PA8下降沿 → 触发硬件复位信号 → CNT计数器立即清零并重启计数。
- CCR1的值:在中断中读取
TIM1->CCR1
时,实际是复位前CNT的值(即信号周期)。 - CCR2的值:在PA9下降沿触发时,硬件捕获当前CNT值(即PA9与PA8的时间差)。
✅ 关键点:CCR寄存器存储的是捕获瞬间的CNT值,而CNT的清零由硬件自动完成,与CCR无关。
📥 3. 中断服务中的操作
在中断函数中,只需读取CCR值并清除中断标志,无需操作CCR寄存器:
void TIM1_CC_IRQHandler(void) {
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET) {
Cycle = TIM1->CCR1; // 读取周期值(CNT复位前的值)
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); // 清除中断标志
}
if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET) {
Phase = TIM1->CCR2; // 读取相位差(PA9下降沿时的CNT值)
TIM_ClearITPendingBit(TIM1, TIM_IT_CC2); // 清除中断标志
}
}
- 中断标志的作用:
仅表示“捕获事件已发生”,清除后等待下次事件。 - CCR值更新:
下一次捕获事件发生时,硬件自动覆盖CCR寄存器的值。
⚠️ 4. 常见误区与注意事项
误区 | 正确理解 |
---|---|
手动写CCR1=0 |
❌ 输入捕获模式下无效,CCR只读。 |
CNT复位=CCR清零 | ❌ CNT清零由硬件完成,CCR存储的是复位前的值。 |
不清除中断标志 | ❌ 导致中断持续触发,CPU被阻塞。 |
💎 总结
- CCR清零机制:通过
TIM_SlaveMode_Reset
在PA8下降沿硬件自动复位CNT,实现计数器的周期性清零。 - CCR寄存器角色:只读存储单元,记录捕获瞬间的CNT值(周期或相位差)。
- 软件操作:仅需在中断中读取CCR值 + 清除中断标志,无需操作CCR寄存器。
🔍 验证方法:在调试时监控
TIM1->CNT
和TIM1->CCR1
,可观察到PA8下降沿时CNT被清零,而CCR1的值保持不变直至下次捕获。