STM32 CCR寄存器

​1. CCR寄存器在输入捕获模式下的特性​

  • 只读属性 :
    当定时器通道配置为输入捕获模式(如捕获上升沿/下降沿)时,CCR寄存器硬件自动变为只读。软件写入操作无效,只能在捕获事件发生时由硬件自动更新为当前CNT值。
  • 硬件自动装载 :
    当指定的边沿(如PA8下降沿)触发捕获时,硬件自动将当前计数器值(CNT)写入CCR寄存器,并置位中断标志位(如TIM_IT_CC1)。

⚙️ ​2. 清零机制:硬件复位CNT计数器​

用户代码中通过主从模式实现了间接清零效果:

cpp 复制代码
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寄存器:

cpp 复制代码
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的值保持不变直至下次捕获。

相关推荐
周洲08307 小时前
STM32 串口底层深度解析|USART 中断标志、硬件 FIFO,乱码根源底层定位
stm32·单片机·嵌入式硬件
女神下凡12 小时前
芯参谋(29):UFS UMCP 软件设计规范
arm开发·单片机·嵌入式硬件
李日华大战鸡红12 小时前
IC-MU128编码器使用教程
stm32
周洲083012 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32
RISCV_Explorer13 小时前
RISC-V电源管理与低功耗实战——WFI指令、电源域划分与唤醒路径设计
单片机·嵌入式硬件·risc-v
zd84510150013 小时前
支持双向输入信号的开关量电路
单片机·嵌入式硬件
齐落山大勇13 小时前
【裸机程序】IMX 6ULL的中断机制的理解
单片机·嵌入式硬件
cu14314 小时前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
HRTOS15 小时前
HRTOS 任务优先级与调度模式说明
单片机·嵌入式硬件·系统架构·51单片机
cu14315 小时前
细谈GM7123C的具体功能与其应用
c语言·c++·人工智能·嵌入式硬件