STM32 CCR寄存器

发布于:2025-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

 ​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
  • 工作流程​:
    1. PA8下降沿​ → 触发硬件复位信号 → CNT计数器立即清零并重启计数。
    2. CCR1的值​:在中断中读取TIM1->CCR1时,实际是复位前CNT的值​(即信号周期)。
    3. 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->CNTTIM1->CCR1,可观察到PA8下降沿时CNT被清零,而CCR1的值保持不变直至下次捕获。


网站公告

今日签到

点亮在社区的每一天
去签到