一個關於STM32定時器CCR無法清零的話題
這裡跟大家分享一個STM32應用開發過程中操作CCR暫存器遇到的小案例,是關於對STM32定時器中的捕獲暫存器CCR進行清零的問題。
有人用STM32F3的定時器做輸入捕獲,在捕獲的回撥函式裡先將捕捉到的CCR值放入緩衝區,然後打算將CCR暫存器清零。結果發現怎麼也無法清零。
客戶的相關測試程式碼如下【基於STM32cube庫的程式碼】:
上面程式碼的第【1】句將捕獲到的CCR值放入CCR_CUR變數。
第【2】句意圖對TIM4_CCR1清零操作;
第【3】句意欲從TIM4_CCR1讀取資料到dbug_data.
最後發現,即使經過ccr清零操作,再來讀取CCR
從程式碼上看似乎並無什麼問題。不妨開啟晶片參考手冊看看CCR暫存器的相關描述:
從上述定義上來看,CCR暫存器可讀可寫,這點寫得清清楚楚。作為輸入捕捉時CCR的值為最近一次捕捉到的計數器的值。咋看之下也沒發現什麼異常,難道庫程式碼有問題?
嘗試將庫函式呼叫直接改為對暫存器的操作,結果還是一樣。那問題出在哪裡呢?
嘗試著再回頭繼續細看關於輸入捕捉的章節,看能否找到蛛絲馬跡,終於看到一段關鍵性的語句【紅線標識】:
上面紅線上的那句話徹底說明白了,當某定時器通道配置為輸入捕獲時,該通道的CCR暫存器變為只讀,只能在發生捕獲時硬體裝載修改。到這裡,問題也算有個了結。對於這個問題,如果手冊看得不到位,就有點麻煩。
後來的後來,我重新了下載該晶片的參考手冊,也關注了這個細節。發現新版本手冊裡對於該暫存器的描述已做了進一步的完善,含義更加明確了。關於作為輸入捕捉時對暫存器的只讀特性做了明確的描述,同時暫存器屬性方格里增加了作為IC輸入時的只讀屬性[/r]提示。
總之,在碰到類似問題時,首先有針對性地對相關手冊章節仔細研讀下,問題或許可以很快迎刃而解。這裡提醒特別注意使用最新版本的技術手冊,不同版本手冊的差異往往體現這些細節的地方。