經常有人問起預裝暫存器和影子暫存器的話題,其實stm32相關系列的手冊裡有介紹,有文件做介紹,這裡借花獻佛地一起分享下。
在談預裝暫存器及影子暫存器的差別前,不妨先對stm32定時器的時基單元做個基本了解。stm32各系列的定時器結構和框架基本是一樣的,時基單元也一樣。 下面時基單元是以stm32f3系列為參考。
時基單元中的timx_psc、 tim_arr兩個暫存器加上捕捉比較模組中timx_ccr暫存器,它們都可以動態修改。不過他們的修改和生效可能不在同乙個時刻,這裡便引入了預裝暫存器及影子暫存器的概念。要記住一點,真正在timer模組中起作用的是影子暫存器。
1、使用者程式對timx_psc暫存器值的修改或讀取都是操作其預裝載暫存器,其修改值只能通過更新事件後才能生效,即從timx_psc的預裝暫存器拷貝到timx_psc的影子暫存器。
2、對於tim_arr暫存器的修改或讀取,是直接操作影子暫存器還是先操作arr的預裝暫存器,還是等更新事件後拷貝到影子暫存器呢?這跟乙個timx_cr1暫存器的arpe位有關。如果arpe=0,即不使用arr的預裝功能,則修改timx_arr 暫存器的值就是操作影子暫存器,新的arr的值立即生效。否則,如果arpe=1,即使用arr的預裝功能,則修改timx_arr 暫存器的值就是操作預裝暫存器,直到發生更新事件後,arr預裝載暫存器的值才被拷貝到影子暫存器中。
同樣,對於timx_ccr的修改和讀取跟tim_arr暫存器的修改或讀取類似。是直接操作ccr影子暫存器還是先操作ccr的預裝載暫存器,還得等更新事件後拷貝到影子暫存器呢?這跟乙個timx_ccmrx暫存器的ocxpe位有關。如果ocxpe=0,即不使用ccr的預裝載功能,則修改timx_ccr暫存器的值就是操作影子暫存器,新的ccr的值立即生效。否則,如果ocxpe==1,即使用ccr的預裝載功能,則修改timx_arr 暫存器的值就是操作預裝載暫存器,要等到發生更新事件後,ccr預裝載暫存器的值拷貝到影子暫存器中。
明白了ocxpe位的功用後,當ocxpe==1時,就不難理解為什麼做oc比較輸出時,發現修改ccr暫存器的值後可能需要最長1個arr週期的延時後才能生效。
STM32定時器的預裝暫存器及影子暫存器話題
摘自 經常有人問起預裝暫存器和影子暫存器的話題,其實stm32相關系列的手冊裡有介紹,有文件做介紹,這裡借花獻佛地一起分享下。在談預裝暫存器及影子暫存器的差別前,不妨先對stm32定時器的時基單元做個基本了解。stm32各系列的定時器結構和框架基本是一樣的,時基單元也一樣。下面時基單元是以stm32...
STM32開發專案 定時器預裝載暫存器(ARR)
筆者在進行某專案開發時,需要實時調節定時器的週期,以控制定時器下次更新中斷的時間。自動重裝載暫存器 arr 是乙個 16 位的暫存器,這裡面裝著計數器能計數的最大數值。當計數到這個值的時候,如果使能了中斷的話,定時器就產生溢位中斷。在物理上這個暫存器對應2個暫存器,乙個是程式設計師可以寫入或讀出的暫...
Stm32 暫存器 定時器中斷
1 原理 和外部中斷差不多,不同的是外部中斷的產生是由外部硬體產生變化的,而定時器中斷就是通過定時器的溢位實現中斷 可以想象成鬧鐘 2 操作步驟 這裡我用的是通用定時器tim3 1 tim3 時鐘使能。這裡我們通過 apb1enr 的第 1 位來設定 tim3 的時鐘,因為 stm32 clock ...