在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32定時器詳解 -----影子寄存器,預(yù)裝寄存器

            STM32定時器詳解 -----影子寄存器,預(yù)裝寄存器

            作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
            定時器
            在STM32F10xxx系列的32位MCU上,定時器資源十分豐富,包括高級控制定時器,通用定時器和基本定時器。此外,還有能夠?qū)崿F(xiàn)定時功能的系統(tǒng)滴答定時器,實時時鐘以及看門狗。關(guān)于這些定時器的介紹,占據(jù)了STM32F10xxx參考手冊1/5的篇幅,可見其功能的強大。
            在低容量和中容量的STM32F103xx產(chǎn)品,以及互聯(lián)型產(chǎn)品STM32F105xx和STM32F107xx中,只有一個高級控制定時器TIM1。而在高容量和超大容量的STM32F103xx產(chǎn)品中,有兩個高級控制定時器TIM1和TIM8。
            在所有STM32F10xxx系列產(chǎn)品中,都有通用定時器TIM2~TIM5,除非另有說明。除此之外,在超大容量產(chǎn)品中,還有通用定時器TIM9~TIM14。
            在高容量和超大容量的STM32F101xx和STM32F103xx產(chǎn)品,以及互聯(lián)型產(chǎn)品STM32F105xx和STM32F107xx中,有兩個基本定時器TIM6和TIM7。
            其中,高級控制定時器的功能最為強大,可以實現(xiàn)所有其他定時器的所有功能。TrailBreaker開發(fā)板使用的是高容量的STM32F103ZE,因此有兩個高級控制定時器TIM1和TIM8。下面我們就著重介紹這兩個高級控制定時器。
            TIM1和TIM8簡介
            高級控制定時器(TIM1和TIM8)由一個16位的自動裝載計數(shù)器組成,它由一個可編程的預(yù)分頻器驅(qū)動。 它適合多種用途,包含測量輸入信號的脈沖寬度(輸入捕獲),或者產(chǎn)生輸出波形(輸出比較、PWM、嵌入死區(qū)時間的互補PWM等)。 使用定時器預(yù)分頻器和RCC時鐘控制預(yù)分頻器,可以實現(xiàn)脈沖寬度和波形周期從幾個微秒到幾個毫秒的調(diào)節(jié)。
            關(guān)于實驗中用到的LED部分原理圖和GPIO跑馬燈實驗所用到的相同,在此不再多做介紹。
            TIM1和TIM8定時器的功能包括:
            16位向上、向下、向上/下自動裝載計數(shù)器
            16位可編程(可以實時修改)預(yù)分頻器,計數(shù)器時鐘頻率的分頻系數(shù)為1~65535之間的任意數(shù)值
            多達4個獨立通道: ─ 輸入捕獲 ─ 輸出比較 ─ PWM生成(邊緣或中間對齊模式) ─ 單脈沖模式輸出
            死區(qū)時間可編程的互補輸出
            使用外部信號控制定時器和定時器互聯(lián)的同步電路
            允許在指定數(shù)目的計數(shù)器周期之后更新定時器寄存器的重復(fù)計數(shù)器
            剎車輸入信號可以將定時器輸出信號置于復(fù)位狀態(tài)或者一個已知狀態(tài)
            如下事件發(fā)生時產(chǎn)生中斷/DMA:
            ─ 更新:計數(shù)器向上溢出/向下溢出,計數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā))
            ─ 觸發(fā)事件(計數(shù)器啟動、停止、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))
            ─ 輸入捕獲
            ─ 輸出比較
            ─ 剎車信號輸入
            支持針對定位的增量(正交)編碼器和霍爾傳感器電路
            觸發(fā)輸入作為外部時鐘或者按周期的電流管理
            高級定時器框圖和時鐘簡介
            如框圖中的紅框所示,紅框中的部分,也是時基單元(Time-base unit),對時基單元進行設(shè)置,就可以完成基礎(chǔ)的定時器的使用設(shè)置。
            計數(shù)器時鐘可由下列時鐘源提供:
            ● 內(nèi)部時鐘(CK_INT)
            ● 外部時鐘模式1:外部輸入引腳
            ● 外部時鐘模式2:外部觸發(fā)輸入ETR
            ● 內(nèi)部觸發(fā)輸入(ITRx):使用一個定時器作為另一個定時器的預(yù)分頻器。如可以配置一個定時器Timer1而作為另一個定時器Timer2的預(yù)分頻器。詳見數(shù)據(jù)手冊的通用定時器部分。
            內(nèi)部時鐘源(CK_INT):
            如果禁止了從模式控制器(SMS=000),則CEN、DIR(TIMx_CR1寄存器)和UG位(TIMx_EGR寄存器)是事實上的控制位,并且只能被軟件修改(UG位仍被自動清除)。只要CEN位被寫成’1’,預(yù)分頻器的時鐘就由內(nèi)部時鐘CK_INT提供。 下圖顯示控制電路和向上計數(shù)器在一般模式下,不帶預(yù)分頻器時的操作。
            外部時鐘源模式1
            當(dāng)TIMx_SMCR寄存器的SMS=111時,此模式被選中。計數(shù)器可以在選定輸入端的每個上升沿或下降沿計數(shù)。 下圖為TI2外部時鐘連接例子
            例如,要配置向上計數(shù)器在T12輸入端的上升沿計數(shù),使用下列步驟:
            1.配置TIMx_CCMR1寄存器CC2S=01
            2.配置通道2檢測TI2輸入的上升沿
            3.配置TIMx_CCMR1寄存器的IC2F[3:0],選擇輸入濾波器帶寬(如果不需要濾波器,保持IC2F=0000)
            4.配置TIMx_CCER寄存器的CC2P=0,選定上升沿極性
            5.配置TIMx_SMCR寄存器的SMS=111,選擇定時器外部時鐘模式1
            6.配置TIMx_SMCR寄存器中的TS=110,選定TI2作為觸發(fā)輸入源
            7.設(shè)置TIMx_CR1寄存器的CEN=1,使能計數(shù)器
            注: 捕獲預(yù)分頻器不用作觸發(fā),所以不需要對它進行配置
            當(dāng)上升沿出現(xiàn)在TI2,計數(shù)器計數(shù)一次,且TIF標(biāo)志被設(shè)置。 在TI2的上升沿和計數(shù)器實際時鐘之間的延時,取決于在TI2輸入端的重新同步電路。
            下圖為外部時鐘模式1下的控制電路
            外部時鐘源模式2
            選定此模式的方法為:令TIMx_SMCR寄存器中的ECE=1。
            計數(shù)器能夠在外部觸發(fā)ETR的每一個上升沿或下降沿計數(shù)。
            下圖是外部觸發(fā)輸入的框圖
            設(shè)置從模式控制寄存器的ETP位選擇選擇是用ETR還是ETR的反相來作為觸發(fā)操作
            例如,要配置在ETR下每2個上升沿計數(shù)一次的向上計數(shù)器,使用下列步驟:
            1.本例中不需要濾波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000
            2.設(shè)置預(yù)分頻器,置TIMx_SMCR寄存器中的ETPS[1:0]=01
            3.選擇ETR的上升沿檢測,置TIMx_SMCR寄存器中的ETP=0
            4.開啟外部時鐘模式2,寫TIMx_SMCR寄存器中的ECE=1
            5.啟動計數(shù)器,寫TIMx_CR1寄存器中的CEN=1
            計數(shù)器在每2個ETR上升沿計數(shù)一次。
            在ETR的上升沿和計數(shù)器實際時鐘之間的延時取決于在ETRP信號端的重新同步電路。
            下圖為外部時鐘模式2下的控制電路
            如圖,該圖為STM32的時鐘樹,結(jié)合高級控制定時器框圖,我們可以看出,高級定時器的時鐘不是直接來自APB2,而是來自于輸入為APB2的一個倍頻器。
            當(dāng)APB2的預(yù)分頻系數(shù)為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB2的頻率;當(dāng)APB2的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8或16)時,這個分頻器起作用,定時器的時鐘頻率等于APB2的頻率相應(yīng)倍數(shù)。
            假定AHB=36MHz,因為APB2允許的最大頻率為72MHz,所以APB2的預(yù)分頻系數(shù)可以取任意數(shù)值;當(dāng)預(yù)分頻系數(shù)=1時,APB2=72MHz,TIM1和TIM8的時鐘頻率=72MHz(分頻器不起作用);當(dāng)預(yù)分頻系數(shù)=2時,APB1=36MHz,在倍頻器的作用下,TIM1和TIM8的時鐘頻率=72MHz。
            有人會問,既然需要TIM1和TIM8的時鐘頻率為72MHz,為什么不直接取APB2的預(yù)分頻系數(shù)=1?答案是:APB2不但要為TIM1和TIM8提供時鐘,而且還要為其它外設(shè)提供時鐘;設(shè)置這個倍頻器可以在保證其它外設(shè)使用較低時鐘頻率時,TIM1和TIM8仍能得到較高的時鐘頻率。
            再舉個例子:當(dāng)AHB=72MHz時,APB2因為其他設(shè)備需要,時鐘為36MHZ,因為這個倍頻器,TIM1和TIM8仍然能夠得到72MHz的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的分辨率,這也正是設(shè)計這個倍頻器的初衷。
            高級定時器寄存器簡介
            可編程高級控制定時器的主要部分是一個16位計數(shù)器和與其相關(guān)的自動裝載寄存器。這個計數(shù)器可以向上計數(shù)、向下計數(shù)或者向上向下雙向計數(shù)。此計數(shù)器時鐘由預(yù)分頻器分頻得到。 計數(shù)器、自動裝載寄存器和預(yù)分頻器寄存器可以由軟件讀寫,即使計數(shù)器還在運行讀寫仍然有效。
            時基單元,也就是決定了定時器的基本功能的模塊包含:
            1.計數(shù)器寄存器(Counter register,簡寫為TIMx_CNT)
            2.預(yù)分頻器寄存器 (Prescaler register,簡寫為TIMx_PSC)
            3.自動裝載寄存器 (Auto-reload register,簡寫為TIMx_ARR)
            4.重復(fù)次數(shù)寄存器 (Repetition counter register,簡寫為TIMx_RCR)
            1.影子寄存器
            這張圖是高級定時器框圖的一部分,細心的人可以發(fā)現(xiàn)預(yù)分頻器寄存器、自動重載寄存器和捕捉/比較寄存器下面有一個陰影,其他的寄存器有些也有陰影。
            這表示在物理上這個寄存器對應(yīng)2個寄存器:一個是我們可以可以寫入或讀出的寄存器,稱為預(yù)裝載寄存器,另一個是我們看不見的、無法真正對其讀寫操作的,但在使用中真正起作用的寄存器,稱為影子寄存器.
            數(shù)據(jù)手冊介紹預(yù)裝載寄存器的內(nèi)容可以隨時傳送到影子寄存器,即兩者是連通的(permanently),或者在每一次更新事件(UEV)時才把預(yù)裝載寄存器的內(nèi)容傳送到影子寄存器。
            原文如下:
            The auto-reload register is preloaded. Writing to or reading from the auto-reload register accesses the preload register. The content of the preload register are transferred into the shadow register permanently or at each update event (UEV), depending on the auto-reload preload enable bit (ARPE) in TIMx_CR1 register. The update event is sent when the counter reaches the overflow (or underflow when downcounting) and if the UDIS bit equals 0 in the TIMx_CR1 register. It can also be generated by software. The generation of the update event is described in detailed for each configuration.
            在圖中的,表示對應(yīng)寄存器的影子寄存器可以在發(fā)生更新事件時,被更新為它的預(yù)裝載寄存器的內(nèi)容;而圖中的部分,表示對應(yīng)的自動重載寄存器可以產(chǎn)生一個更新事件(U)或更新事件中斷(UI)。
            設(shè)計預(yù)裝載寄存器和影子寄存器的好處是,所有真正需要起作用的寄存器(影子寄存器)可以在同一個時間(發(fā)生更新事件時)被更新為所對應(yīng)的預(yù)裝載寄存器的內(nèi)容,這樣可以保證多個通道的操作能夠準(zhǔn)確地同步。如果沒有影子寄存器,軟件更新預(yù)裝載寄存器時,則同時更新了真正操作的寄存器,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結(jié)果造成多個通道的時序不能同步,如果再加上例如中斷等其它因素,多個通道的時序關(guān)系有可能會混亂,造成是不可預(yù)知的結(jié)果。
            2.預(yù)分頻寄存器
            預(yù)分頻器可以將計數(shù)器的時鐘頻率按1到65536之間的任意值分頻。它是基于一個在TIMx_PSC寄存器中的16位寄存器控制的16位計數(shù)器。因為這個控制寄存器帶有緩沖器,它能夠在運行時被改變。新的預(yù)分頻器的參數(shù)在下一次更新事件到來時被采用。
            下面給出了在預(yù)分頻器運行時,更改計數(shù)器參數(shù)的例子
            當(dāng)預(yù)分頻器的參數(shù)從1變到2時,計數(shù)器的時序圖如下:
            當(dāng)預(yù)分頻器的參數(shù)從1變到4時,計數(shù)器的時序圖如下:
            預(yù)分頻寄存器各位的描述如下:
            位15:0 PSC[15:0]:預(yù)分頻值
            計數(shù)器的時鐘頻率(CK_CNT)等于fCK_PSC / (PSC[15:0] + 1)。
            PSC的值保存在預(yù)分頻寄存器的預(yù)裝載寄存器中,在每次更新事件時加載至影子寄存器.
            3.計數(shù)器寄存器
            高級定時器計數(shù)模式:在向上計數(shù)模式中,計數(shù)器從0計數(shù)到自動加載值(TIMx_ARR計數(shù)器的內(nèi)容),然后重新從0開始計數(shù)并且產(chǎn)生一個計數(shù)器溢出事件。
            如果使用了重復(fù)計數(shù)器功能,在向上計數(shù)達到設(shè)置的重復(fù)計數(shù)次數(shù)(TIMx_RCR)時,產(chǎn)生更新事件(UEV);否則每次計數(shù)器溢出時才產(chǎn)生更新事件。
            在事件產(chǎn)生寄存器寄存器中(通過軟件方式或者使用從模式控制器)設(shè)置UG位也同樣可以產(chǎn)生一個更新事件。 設(shè)置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件;這樣可以避免在向預(yù)裝載寄存器中寫入新值時更新影子寄存器。在UDIS位被清’0’之前,將不產(chǎn)生更新事件。但是在應(yīng)該產(chǎn)生更新事件時,計數(shù)器仍會被清’0’,同時預(yù)分頻器的計數(shù)也被請0(但預(yù)分頻器的數(shù)值不變)。此外,如果設(shè)置了TIMx_CR1寄存器中的URS位(選擇更新請求),設(shè)置UG位將產(chǎn)生一個更新事件UEV,但硬件不設(shè)置UIF標(biāo)志(即不產(chǎn)生中斷或DMA請求)。這是為了避免在捕獲模式下清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。
            當(dāng)發(fā)生一個更新事件時,所有的寄存器都被更新,硬件同時(依據(jù)URS位)設(shè)置更新標(biāo)志位(TIMx_SR寄存器中的UIF位)。
            ● 重復(fù)計數(shù)器被重新加載為TIMx_RCR寄存器的內(nèi)容。
            ● 自動裝載影子寄存器被重新置入預(yù)裝載寄存器的值(TIMx_ARR)。
            ● 預(yù)分頻器的緩沖區(qū)被置入預(yù)裝載寄存器的值(TIMx_PSC寄存器的內(nèi)容)。
            下面給出一些例子,當(dāng)TIMx_ARR=0x36時計數(shù)器在不同時鐘頻率下的動作。
            內(nèi)部時鐘分頻因子為1 時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為2 時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為4時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為N時的計數(shù)器時序圖如下:
            當(dāng)ARPE=0時的更新事件(TIMx_ARR沒有預(yù)裝入) 時的計數(shù)器時序圖如下:
            當(dāng)ARPE=1時的更新事件(TIMx_ARR預(yù)裝入) 時的計數(shù)器時序圖如下:
            在向下模式中,計數(shù)器從自動裝入的值(TIMx_ARR計數(shù)器的值)開始向下計數(shù)到0,然后從自動裝入的值重新開始并且產(chǎn)生一個計數(shù)器向下溢出事件。
            如果使用了重復(fù)計數(shù)器,當(dāng)向下計數(shù)重復(fù)了重復(fù)計數(shù)寄存器(TIMx_RCR)中設(shè)定的次數(shù)后,將產(chǎn)生更新事件(UEV),否則每次計數(shù)器下溢時才產(chǎn)生更新事件。
            在TIMx_EGR寄存器中(通過軟件方式或者使用從模式控制器)設(shè)置UG位,也同樣可以產(chǎn)生一個更新事件。
            設(shè)置TIMx_CR1寄存器的UDIS位可以禁止UEV事件。這樣可以避免向預(yù)裝載寄存器中寫入新值時更新影子寄存器。因此UDIS位被清為0之前不會產(chǎn)生更新事件。然而,計數(shù)器仍會從當(dāng)前自動加載值重新開始計數(shù),并且預(yù)分頻器的計數(shù)器重新從0開始(但預(yù)分頻系數(shù)不變)。
            此外,如果設(shè)置了TIMx_CR1寄存器中的URS位(選擇更新請求) ,設(shè)置UG位將產(chǎn)生一個更新事件UEV但不設(shè)置UIF標(biāo)志(因此不產(chǎn)生中斷和DMA請求),這是為了避免在發(fā)生捕獲事件并清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。
            當(dāng)發(fā)生更新事件時,所有的寄存器都被更新,并且(根據(jù)URS位的設(shè)置)更新標(biāo)志位(TIMx_SR寄存器中的UIF位)也被設(shè)置。
            ● 重復(fù)計數(shù)器被重置為TIMx_RCR寄存器中的內(nèi)容
            ● 預(yù)分頻器的緩存器被加載為預(yù)裝載的值(TIMx_PSC寄存器的值)。
            ● 當(dāng)前的自動加載寄存器被更新為預(yù)裝載值(TIMx_ARR寄存器中的內(nèi)容)。
            注:自動裝載在計數(shù)器重載入之前被更新,因此下一個周期將是預(yù)期的值。
            下面是一些當(dāng)TIMx_ARR=0x36時,計數(shù)器在不同時鐘頻率下的動作。
            內(nèi)部時鐘分頻因子為1 時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為2 時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為4時的計數(shù)器時序圖如下:
            內(nèi)部時鐘分頻因子為N時的計數(shù)器時序圖如下:
            當(dāng)沒有使用重復(fù)計數(shù)器時的更新事件時的計數(shù)器時序圖:
            中央對齊模式(up/down counting) 在中央對齊模式,計數(shù)器從0開始計數(shù)到自動加載的值(TIMx_ARR寄存器)−s211,產(chǎn)生一個計數(shù)器溢出事件,然后向下計數(shù)到1并且產(chǎn)生一個計數(shù)器下溢事件;然后再從0開始重新計數(shù)。
            在此模式下,不能寫入TIMx_CR1中的DIR方向位。它由硬件更新并指示當(dāng)前的計數(shù)方向。
            可以在每次計數(shù)上溢和每次計數(shù)下溢時產(chǎn)生更新事件;也可以通過(軟件或者使用從模式控制器)設(shè)置TIMx_EGR寄存器中的UG位產(chǎn)生更新事件。然后,計數(shù)器重新從0開始計數(shù),預(yù)分頻器也重新從0開始計數(shù)。
            設(shè)置TIMx_CR1寄存器中的UDIS位可以禁止UEV事件。這樣可以避免在向預(yù)裝載寄存器中寫入新值時更新影子寄存器。因此UDIS位被清為0之前不會產(chǎn)生更新事件。然而,計數(shù)器仍會根據(jù)當(dāng)前自動重加載的值,繼續(xù)向上或向下計數(shù)。 此外,如果設(shè)置了TIMx_CR1寄存器中的URS位(選擇更新請求) ,設(shè)置UG位將產(chǎn)生一個更新事件UEV但不設(shè)置UIF標(biāo)志(因此不產(chǎn)生中斷和DMA請求),這是為了避免在發(fā)生捕獲事件并清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。
            當(dāng)發(fā)生更新事件時,所有的寄存器都被更新,并且(根據(jù)URS位的設(shè)置)更新標(biāo)志位(TIMx_SR寄存器中的UIF位)也被設(shè)置。
            上一頁 1 2 下一頁

            評論


            技術(shù)專區(qū)

            關(guān)閉