??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的值保持不變直至下次捕獲。