????????????????????????????????????????目錄
定時(shí)器介紹
HAL庫(kù)外設(shè)模塊設(shè)計(jì)方法
外設(shè)通用接口函數(shù)設(shè)計(jì)
定時(shí)/計(jì)數(shù)功能
時(shí)基單元
外部脈沖計(jì)數(shù)
定時(shí)器介紹
定時(shí)器的核心就是一個(gè)計(jì)數(shù)器模塊,可以進(jìn)行加一或減一計(jì)數(shù)。每出現(xiàn)一個(gè)計(jì)數(shù)信號(hào),計(jì)數(shù)器的值就自動(dòng)加一或減一。當(dāng)計(jì)數(shù)值從0遞增到最大值或者從最大值遞減到0時(shí),定時(shí)器可以向處理器發(fā)送中斷請(qǐng)求。計(jì)數(shù)信號(hào)的來源可以選擇非周期的外部輸人信號(hào)或者周期性的內(nèi)部時(shí)銷中信號(hào),這兩種不同的計(jì)數(shù)信號(hào)決定了定時(shí)器的兩種基本工作模式:計(jì)數(shù)模式和定時(shí)模式。
在衡量一個(gè)定時(shí)器的基本性能時(shí),常常使用位寬進(jìn)行描述,比如8位定時(shí)器或者16位定時(shí)器。這里的位寬代表了定時(shí)器內(nèi)部的計(jì)數(shù)器器的位數(shù),它決定了定時(shí)器的最大計(jì)數(shù)范圍或者最大定時(shí)時(shí)間。16位計(jì)數(shù)器的最大計(jì)數(shù)值為65535(216-1),32 位計(jì)數(shù)器的最大值為4294967295(232-1)。
在STM32微控制器中,按照功能的不同,可以把常規(guī)定時(shí)器分為基本定時(shí)器、通用定時(shí)器和高級(jí)定時(shí)器三類:
(1)基本定時(shí)器
幾乎沒有任何對(duì)外的輸人/輸出通道,常用作時(shí)間基準(zhǔn)(時(shí)基),實(shí)現(xiàn)基本的定時(shí)功能。
(2)通用定時(shí)器
具備多路獨(dú)立的捕獲/比較通道,可以完成定時(shí)/計(jì)數(shù)、輸入捕獲、輸出比較等功能,還可以連接其他的傳感器接口,如編碼器和霍爾傳感器。
(3)高級(jí)定時(shí)器
局級(jí)定時(shí)器的功能最為強(qiáng)大,除了具備通用定時(shí)器的功能外,還增加了重復(fù)計(jì)數(shù)器、帶死區(qū)控制的互補(bǔ)信號(hào)輸出等功能,可用于電機(jī)控制等領(lǐng)域。
無論哪一種定時(shí)器,最基本的功能都是定時(shí)和計(jì)數(shù),在這兩個(gè)功能的基礎(chǔ)上又衍生出其他的功能。在實(shí)際的工程應(yīng)用中,最常用的定時(shí)器功能有以下三種:
① 定時(shí)/計(jì)數(shù)功能:用于產(chǎn)生時(shí)間基準(zhǔn)以以及測(cè)量外部脈沖的個(gè)數(shù)。
② 輸出比較功能:包括 PWM輸出、電平翻轉(zhuǎn)、單脈沖輸出以及強(qiáng)制輸出等功能。
③ 輸入捕獲功能:用于測(cè)量輸入信號(hào)的腐脈沖寬度。
在 STM32 的常規(guī)定時(shí)器中,通用定時(shí)器涵蓋了定時(shí)/計(jì)數(shù)、輸出比較和輸入捕獲等常用功能。因此,我們將以通用定時(shí)器為例來介紹定時(shí)器的應(yīng)用。
HAL庫(kù)外設(shè)模塊設(shè)計(jì)方法
對(duì)于定時(shí)器(TIMER)串口(UART)和模數(shù)轉(zhuǎn)換器(ADC)等功能較為復(fù)雜的外設(shè), HAL 庫(kù)設(shè)計(jì)了一個(gè)名為外設(shè)句柄的數(shù)據(jù)類型 PPP_HandleTypeDef (PPP表示外設(shè)名稱)。外設(shè)句柄作為外設(shè)的一個(gè)標(biāo)識(shí)符,一般采用結(jié)構(gòu)體類型實(shí)現(xiàn),結(jié)構(gòu)體的成員變量對(duì)應(yīng)外設(shè)的工作參數(shù),主要由以下部分組成:
1.外設(shè)實(shí)例
表示具體的外設(shè),它是指向?qū)?yīng)外設(shè)寄存器組起始地址的指針。
2.初始化配置參數(shù)
定義外設(shè)初始化數(shù)據(jù)類型,例如串口通信的波特率和數(shù)據(jù)格式等。
3. I/O 緩沖區(qū)
定義數(shù)據(jù)傳輸時(shí),接收緩沖區(qū)和發(fā)送緩沖區(qū)的起始地址以及數(shù)據(jù)傳輸?shù)膫€(gè)數(shù)。I/O緩沖區(qū)主要用于數(shù)據(jù)傳輸類外設(shè),如UART和ADC等。
4.外設(shè)狀態(tài)
定義外設(shè)的工作狀態(tài):忙狀態(tài)(busy) 就緒狀態(tài)(ready)和錯(cuò)誤狀態(tài)(error)。
5. DMA通道句柄
定義外設(shè)采用 DMA 方式進(jìn)行數(shù)據(jù)傳輸時(shí)的相關(guān)參數(shù),包括了 DMA 控制器的寄存器定義、DMA 通信參數(shù)和 DMA 通信狀態(tài)等
以定時(shí)器為例,HAL 庫(kù)中用于定時(shí)器的外設(shè)句柄為 TIM_HandleTypeDef,具體定義如程序如下所示。
typedef struct
{
TIM_TypeDef *Instance; // 外設(shè)實(shí)例
TIM_Base_InitTypeDef Init; // 時(shí)基單元初始化數(shù)據(jù)類型
HAL_TIM_ActiveChannel Channel; // 捕獲/比較通道
DMA_HandleTypeDef *hdma[7]; // DMA 通道句柄
HAL_LockTypeDef Lock; // 保護(hù)鎖
_IO HAL_TIM_StateTypeDef State; // 定時(shí)器工作狀態(tài)
}TIM_HandleTypeDef;
注意:外設(shè)實(shí)例在編程時(shí)有很重要的作用。在外設(shè)的中斷回調(diào)函數(shù)中,常常使用外設(shè)實(shí)例來判斷同一類外設(shè)下的具體外設(shè)。例如,在定時(shí)器的更新中斷回調(diào)函數(shù)中,為了判斷是哪一個(gè)定時(shí)器產(chǎn)生的本次更新中斷,就常常使用如下的判斷:
If( htmi->Instance==TIM10 );
HAL 庫(kù)根據(jù)微控制器和外設(shè)的數(shù)據(jù)傳輸方式,設(shè)計(jì)了輪詢、中斷和DMA 三種編程模型,用于外設(shè)的數(shù)據(jù)傳輸。
以定時(shí)器的定時(shí)功能為例,三種編程模型下的接口函數(shù)分別是:
1. 輪詢方式
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
2. 中斷方式
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
3. DMA 方式
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim,
uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim);
從接口函數(shù)的定義,我們可以總結(jié)出以下的規(guī)律:
●不同編程模型下的接口函數(shù),通過函數(shù)后綴加以區(qū)別,如輪詢方式的接口函數(shù)不加后綴,中斷方式的接口函數(shù)后綴為IT,DMA 方式的接口函數(shù)后綴為 DMA。
●接口函數(shù)的第一個(gè)人口參數(shù)都是指向外設(shè)句柄的指針(地址)。
外設(shè)通用接口函數(shù)設(shè)計(jì)
為了確保 HAL庫(kù)的接口函數(shù)在整個(gè) STM32微控制器的產(chǎn)品線之間能夠無縫移植,HAL庫(kù)提供了通用的接口函數(shù),根據(jù)接口函數(shù)的功能可以分為以下四類:
1.初始化函數(shù)
根據(jù)用戶的配置參數(shù)完成外設(shè)的初始化。例如,引腳初始化函數(shù):HAL_GPIO_Init()。
2.I/O 操作函數(shù)
這類函數(shù)主要用于外設(shè)的數(shù)據(jù)傳輸,按照輪詢、中斷和DMA 三種編程模型分類。
3.控制函數(shù)
這類函數(shù)主要用于動(dòng)態(tài)配置外設(shè)參數(shù)。例如,在定時(shí)器的 PWM 輸出功能中,用于配置輸出通道的控制函數(shù) HAL_TIM_PWM_ConfigChannel()。
4.狀態(tài)函數(shù)
這類函數(shù)主要用于獲取外設(shè)的運(yùn)行狀態(tài):忙狀態(tài)、就緒狀態(tài)和錯(cuò)誤狀態(tài)。例如,定時(shí)器狀態(tài)獲取函數(shù) HAL_TIM_Base_GetState()。
這些通用接口函數(shù)的設(shè)計(jì)不僅方便了用戶快速掌握接口函數(shù)的功能,也確保了程序在STM32微控制器的各個(gè)產(chǎn)品線之間能夠無縫移植,提高開發(fā)效率。
注意:除了通用接口函數(shù)以外,為了兼顧 STM32 微控制器產(chǎn)品線的一些特有功能以及同一個(gè)產(chǎn)品系列中不同型號(hào)芯片的特有功能,HAL庫(kù)還提供了擴(kuò)展接口函數(shù),存放在后綴名為ex 的文件中。以定時(shí)器為例,通用接口函數(shù)位于 stm32f4xx_hal_tim.c 文件中,而擴(kuò)展接口函數(shù)則位于 stm32f4xx_hal_tim_ex.c。
定時(shí)/計(jì)數(shù)功能
時(shí)鐘源
定時(shí)器的兩種工作模式:當(dāng)定時(shí)器對(duì)內(nèi)部時(shí)鐘進(jìn)行計(jì)數(shù)時(shí),工作在定時(shí)模式下;當(dāng)定時(shí)器對(duì)外部脈沖進(jìn)行計(jì)數(shù)時(shí),工作在計(jì)數(shù)模式下。兩種工作模式的區(qū)別主要在于時(shí)鐘源的選擇。
定時(shí)器的時(shí)鐘源一共有四種選擇:
1.內(nèi)部時(shí)鐘(CK_INT)
內(nèi)部時(shí)鐘CK_INT來自外設(shè)總線APB1或APB2提供的定時(shí)時(shí)鐘TIMx_CLK。使用內(nèi)部時(shí)鐘作為時(shí)鐘源時(shí),定時(shí)器工作于定時(shí)模式,并衍生出輸出比較和輸入捕獲等功能。
2.外部時(shí)鐘模式1:外部輸入引腳TIX(表示引腳編號(hào)1-4,下同)
時(shí)鐘信號(hào)來自外部輸入引腳Tix,定時(shí)器可以在時(shí)鐘信號(hào)的每個(gè)上升沿或下降沿計(jì)數(shù)注意:當(dāng)使用外部時(shí)鐘模式1時(shí),時(shí)鐘信號(hào)實(shí)際上是由定時(shí)器的捕獲/比較通道所對(duì)應(yīng)的引腳TIMx_CHn(n表示通道編號(hào)1~4,下同)輸入。
3.外部時(shí)鐘模式2:外部觸發(fā)輸入ETR
時(shí)鐘信號(hào)來自外部觸發(fā)輸人引腳TIMX_ETR。定時(shí)器可以在時(shí)鐘信號(hào)的每個(gè)上升沿或下降沿計(jì)數(shù)。
4.內(nèi)部觸發(fā)輸入ITRx
時(shí)鐘信號(hào)來自芯片內(nèi)部其他定時(shí)器的觸發(fā)輸出,可以實(shí)現(xiàn)定時(shí)器的同步或級(jí)聯(lián)。例如,使用一個(gè)定時(shí)器作為另一個(gè)定時(shí)器的預(yù)分頻器。
通過設(shè)置相關(guān)的寄存器,選擇對(duì)應(yīng)的時(shí)鐘源后,該時(shí)鐘源將作為時(shí)基單元的預(yù)分頻時(shí)鐘 CK_PSC 送入時(shí)基單元。時(shí)鐘源選擇的示意圖如圖所示。
時(shí)基單元
時(shí)基單元是定時(shí)器的核心控制單元,負(fù)責(zé)時(shí)鐘源的分頻、計(jì)數(shù)和溢出重載等基本功能。它主要由三個(gè)模塊組成:預(yù)分頻模塊、計(jì)數(shù)模塊和自動(dòng)重載模塊。時(shí)基單元的功能框圖如下圖。
在上圖中預(yù)分頻時(shí)鐘CK_PSC是經(jīng)過時(shí)鐘源選擇后輸出的時(shí)鐘信號(hào)。如果使用內(nèi)部時(shí)鐘CK_INT作為時(shí)鐘源,CK_PSC的頻率等于定時(shí)時(shí)鐘TIMx_CLK 的頻率。如果使用外部時(shí)鐘或者內(nèi)部觸發(fā)信號(hào)作為時(shí)鐘源,CK_PSC的頻率由外部引腳輸人信號(hào)或者內(nèi)部觸發(fā)信號(hào)的頻率決定。CK_CNT是經(jīng)過預(yù)分頻模塊后,送入計(jì)數(shù)模塊的時(shí)鐘,這里稱為計(jì)數(shù)時(shí)鐘。
1.預(yù)分頻模塊
預(yù)分頻模塊由預(yù)分頻計(jì)數(shù)器和預(yù)分頻寄存器 TIMx_PSC 組成:預(yù)分頻計(jì)數(shù)器通過計(jì)數(shù)的方式對(duì)預(yù)分頻時(shí)鐘 CK_PSC 進(jìn)行分頻,而預(yù)分頻存器用于存放預(yù)分頻系數(shù)PSC。當(dāng)時(shí)鐘源為內(nèi)部時(shí)鐘 CK_INT 時(shí),其頻率值較高。以STM32F411的通用定時(shí)器TIM2為例,定時(shí)時(shí)鐘 TIM2_CLK為100 MHz體現(xiàn)在16位定時(shí)器上的效果就是:從0計(jì)數(shù)到65535,發(fā)生上溢的時(shí)間只需要0.65 ms左右。如果我們需要更長(zhǎng)的定時(shí)時(shí)間,就需要對(duì)預(yù)分頻時(shí)鐘CK_PSC進(jìn)行分頻處理。
除此之外,還可以通過設(shè)置預(yù)分頻系數(shù) PSC來獲得特定的時(shí)鐘頻率。假設(shè)內(nèi)部時(shí)鐘為72MHz,如果不分頻,72MHz時(shí)鐘對(duì)應(yīng)的計(jì)數(shù)時(shí)間為 1/72 μs,不利于計(jì)算定時(shí)時(shí)間如果將內(nèi)部時(shí)鐘進(jìn)行72分頻,分頻后的時(shí)鐘頻率為1MHz,計(jì)數(shù)時(shí)間為1μs,這個(gè)計(jì)數(shù)時(shí)間在計(jì)算定時(shí)時(shí)間時(shí),就非常方便。
預(yù)分頻模塊的工作原理如下:定時(shí)器啟動(dòng)后,預(yù)分頻計(jì)數(shù)器的初值為0。預(yù)分頻時(shí)鐘CK_PSC 每輸人一個(gè)脈沖,預(yù)分頻計(jì)數(shù)器的計(jì)數(shù)值就自動(dòng)加一。當(dāng)計(jì)數(shù)值等于預(yù)分頻寄存器中存放的預(yù)分頻系數(shù) PSC時(shí),計(jì)數(shù)值清零,并開始下一輪計(jì)數(shù)。
從上圖可以看到:當(dāng)預(yù)分頻寄存器的內(nèi)容為3時(shí),預(yù)分頻計(jì)數(shù)器從0開始計(jì)數(shù),且計(jì)數(shù)值0會(huì)保持一個(gè)完整的計(jì)數(shù)脈沖。因此,實(shí)際的計(jì)數(shù)脈沖個(gè)數(shù)為 4,即最終的預(yù)分頻系數(shù)為:PSC+1。例如,要對(duì)內(nèi)部時(shí)鐘進(jìn)行 72分頻,則預(yù)分頻系數(shù) PSC應(yīng)設(shè)置為71。預(yù)分頻時(shí)鐘CK_PSC經(jīng)過預(yù)分頻模塊后,得到計(jì)數(shù)時(shí)鐘CK_CNT,它的計(jì)算公式如下:
CK_CNT=CK_PSC/(PSC+1)
2.計(jì)數(shù)模塊
計(jì)數(shù)模塊由核心計(jì)數(shù)器和計(jì)數(shù)器寄存器 TIMx_CNT 組成:核心計(jì)數(shù)器用來對(duì)預(yù)分頻模塊輸出的計(jì)數(shù)時(shí)鐘 CK_CNT 進(jìn)行二次計(jì)數(shù)。計(jì)數(shù)時(shí)鐘CK_CNT 每輸入一個(gè)脈沖,核心計(jì)數(shù)器的計(jì)數(shù)值就自動(dòng)加一或減一(根據(jù)用戶設(shè)置的不同計(jì)數(shù)模式來決定是加一還是減一)。計(jì)數(shù)器寄存器則用來存放核心計(jì)數(shù)器運(yùn)行時(shí)的計(jì)數(shù)值,便于用戶讀取。
3.自動(dòng)重載模塊
自動(dòng)重載模塊由自動(dòng)重載寄存器 TIMx_ARR 構(gòu)成,用來設(shè)置計(jì)數(shù)器的計(jì)數(shù)終值或計(jì)數(shù)初值,決定計(jì)數(shù)脈沖的多少(計(jì)數(shù)模式)或定時(shí)周期(定時(shí)模式)的長(zhǎng)短。
我們將TIMx_ARR 寄存器的內(nèi)容記為自動(dòng)重值A(chǔ)RR。當(dāng)定時(shí)器設(shè)置為遞增計(jì)數(shù)模式時(shí),ARR 作為計(jì)數(shù)器的計(jì)數(shù)終值,表示記到ARR 時(shí)發(fā)生濫出。當(dāng)定時(shí)器設(shè)置為遞計(jì)數(shù)模式時(shí),ARR 作為計(jì)數(shù)器的計(jì)數(shù)初值,表示從ARR開始向下計(jì)數(shù)。
4.計(jì)數(shù)模式
國(guó)定時(shí)器的計(jì)數(shù)模塊支持三種計(jì)數(shù)模式:遞增計(jì)數(shù)、遞減計(jì)數(shù)和中心對(duì)齊計(jì)數(shù),并產(chǎn)生溢出事件,作為定時(shí)器的更新中斷(定時(shí)中斷)。
(1)遞增計(jì)數(shù)
計(jì)數(shù)器從0開始向上計(jì)數(shù),當(dāng)計(jì)數(shù)值等于ARR 時(shí),產(chǎn)生計(jì)數(shù)器上溢事件,并從0開新一輪的計(jì)數(shù)周期。
(2)遞減計(jì)數(shù)
計(jì)數(shù)器從ARR開始向下計(jì)數(shù),當(dāng)計(jì)數(shù)值等于0時(shí),產(chǎn)生計(jì)數(shù)器下溢事件,并從AR開始新一輪的計(jì)數(shù)周期。
(3)中心對(duì)齊計(jì)數(shù)(遞增/遞減計(jì)數(shù))
計(jì)數(shù)器從0開始向上計(jì)數(shù),當(dāng)計(jì)數(shù)值等于ARR-1時(shí),產(chǎn)生計(jì)數(shù)器上溢事件;然后從ARR開始向下計(jì)數(shù),當(dāng)計(jì)數(shù)值等于1時(shí),產(chǎn)生計(jì)數(shù)器下溢事件。之后再?gòu)?開始新一輪的計(jì)數(shù)周期。
三種計(jì)數(shù)模式的計(jì)數(shù)過程下圖所示。其中,紅圈表示溢出事件發(fā)生時(shí)刻。
預(yù)裝載功能和影子寄存器
自動(dòng)重載寄存器TIMx_ARR和預(yù)分頻寄存器 TIMx_PSC 都具有預(yù)裝載功能,即每類寄存器具有雙寄存器機(jī)制,分別由各自的影子寄存器和預(yù)裝載寄存器組成。影子寄存器是真正起作用的寄存器,預(yù)裝載寄存器為影子寄存器提供緩沖,用戶只能操作預(yù)裝載寄存器。
預(yù)裝載功能可由軟件開啟或關(guān)閉。關(guān)閉預(yù)裝載功能時(shí),寫入預(yù)裝載寄存器的內(nèi)容將立即傳入影子寄存器,使修改的內(nèi)容生效。開啟預(yù)裝載功能時(shí),寫入預(yù)裝載寄存器的內(nèi)容將在更新事件(計(jì)數(shù)器溢出)發(fā)生時(shí),才傳入影子寄存器并生效。
預(yù)裝載功能在多個(gè)定時(shí)器同時(shí)輸出信號(hào)時(shí)比較有用,可以確保多個(gè)定時(shí)器的輸出,信號(hào)在同一個(gè)時(shí)刻變化,實(shí)現(xiàn)同步輸出。單個(gè)定時(shí)器使用時(shí),一般不開啟預(yù)裝載功能。
5.定時(shí)時(shí)間計(jì)算公式
當(dāng)定時(shí)器工作于定時(shí)模式時(shí),預(yù)分頻時(shí)鐘CK_PSC等于定時(shí)時(shí)鐘TIMX_CLK。定時(shí)時(shí)間由TIMx_CLK 的頻率、預(yù)分頻系數(shù) PSC和自動(dòng)重載值A(chǔ)RR 三者決定。假設(shè) PSC=1,ARR=36,采用遞增計(jì)數(shù)模式,計(jì)數(shù)器寄存器的初值為0。定時(shí)器的時(shí)序下圖所示。
從上圖可以總結(jié)出以下幾個(gè)特點(diǎn):
當(dāng)PSC=1時(shí),預(yù)分頻時(shí)鐘CKLPSC進(jìn)行了二分頻得到計(jì)數(shù)時(shí)鐘 CK_CNT。
當(dāng)計(jì)數(shù)器寄存器的內(nèi)容等于ARR時(shí),產(chǎn)生計(jì)數(shù)器上溢事件,并申請(qǐng)中斷。由于計(jì)數(shù)器寄存器從0開始計(jì)數(shù),且計(jì)數(shù)值0會(huì)保持 1個(gè)完整的計(jì)數(shù)脈沖。因此,實(shí)際的計(jì)數(shù)脈沖個(gè)數(shù)為:ARR+1。
預(yù)分頻時(shí)鐘 CK_PSC 經(jīng)過分頻后,得到計(jì)數(shù)時(shí)鐘 CK_CNT,送入計(jì)數(shù)器。計(jì)數(shù)器的計(jì)數(shù)時(shí)間為1/CK_CNT,代入式CK_CNT=CK_PSC/(PSC+1)可以得到計(jì)數(shù)時(shí)間為(PSC+1)/CK_PSC。由于實(shí)際的計(jì)數(shù)值為 ARR+1,將計(jì)數(shù)值和計(jì)數(shù)時(shí)間代入,可以得到定時(shí)時(shí)間的計(jì)算公式:
T=(PSC+1)X(ARR+1)/CK_PSC
同樣的,可以得到定時(shí)器溢出頻率的計(jì)算公式:
f=CK_PSC/[(PSC+1)X(ARR+1)]
注意:使用內(nèi)部時(shí)鐘 CK_INT 作為時(shí)鐘源時(shí),預(yù)分頻時(shí)鐘 CK_PSC就等于內(nèi)部時(shí)鐘而內(nèi)部時(shí)鐘又源自定時(shí)器的定時(shí)時(shí)鐘 TIMx_CLK。因此,在定時(shí)模式下,定時(shí)器的定時(shí)時(shí)鐘TIMx_CLK內(nèi)部時(shí)鐘CK_INT 以及預(yù)分頻時(shí)鐘CK_PSC三者的頻率都是一樣的。
寄存器名稱 |
作用 |
預(yù)分頻寄存器TIMx_PSC |
用于存放預(yù)分頻系數(shù) PSC,將預(yù)分頻時(shí)鐘(CK_PSC)進(jìn)行 1~65 536之間的任意值分頻,得到計(jì)數(shù)時(shí)鐘(CK_CNT)。 |
計(jì)數(shù)器寄存器TIMx_CNT |
用于存放核心計(jì)數(shù)器運(yùn)行時(shí)的當(dāng)前計(jì)數(shù)值,便于用戶讀取。芯片復(fù)位后,默認(rèn)值為0。 |
自動(dòng)重載寄存器TIMx_ARR |
用于存放自動(dòng)重載值A(chǔ)RR。當(dāng)計(jì)數(shù)器遞增計(jì)數(shù)時(shí),ARR作為計(jì)數(shù)終值;當(dāng)計(jì)數(shù)器遞減計(jì)數(shù)時(shí),ARR作為計(jì)數(shù)初值。 |
外部脈沖計(jì)數(shù)
計(jì)數(shù)的功能在現(xiàn)實(shí)生活中比比皆是。例如,測(cè)量一天內(nèi)進(jìn)出圖書館的人數(shù)或者測(cè)量單位時(shí)間內(nèi)某生產(chǎn)線的產(chǎn)品數(shù)量。人數(shù)或者產(chǎn)品數(shù)量的測(cè)量,可以先利用傳感器轉(zhuǎn)化為脈沖信號(hào),再將脈沖信號(hào)作為外部信號(hào),輸人到定時(shí)器進(jìn)行計(jì)數(shù)。此時(shí),定時(shí)器工作在計(jì)數(shù)模式下。
外部信號(hào)的輸入有兩個(gè)途徑:
一個(gè)是通過外部觸發(fā)輸入引腳 ETR,經(jīng)過極性選擇、分頻和濾波以后,再輸人到時(shí)基單元進(jìn)行計(jì)數(shù)。
另一個(gè)是通過外部輸人引腳TIx,也就是定時(shí)器的捕獲/比較通道TIMx_CHn,經(jīng)過濾波和邊沿檢測(cè)后,再輸人到時(shí)基單元進(jìn)行計(jì)數(shù)。
使用外部輸人引腳TIx 送入外部脈沖信號(hào)時(shí),定時(shí)器將工作于從模式,并且占用了定時(shí)器的捕獲/比較通道。因此,在實(shí)際的工程應(yīng)用中一般使用ETR引腳輸入外部信號(hào)。
從 ETR引腳輸入的信號(hào),需要經(jīng)過極性選擇、分頻以及濾波等階段后,再通過時(shí)鐘源選擇開關(guān)的選擇,才能作為預(yù)分頻時(shí)鐘 CK_PSC,輸入到時(shí)基單元進(jìn)行計(jì)數(shù)。
外部脈沖信號(hào)的處理流程如下圖所示。
?
①:時(shí)鐘信號(hào)輸入引腳
時(shí)鐘信號(hào)來自于定時(shí)器的特定輸入通道 TIMx_ETR,只有 1 個(gè)。
②:外部觸發(fā)極性
來自 ETR 引腳輸入的信號(hào)可以選擇為上升沿或者下降沿有效,具體的由 TIMx_SMCR 的位 ETP 配置。
③:外部觸發(fā)預(yù)分頻器
由于 ETRP 的信號(hào)的頻率不能超過 TIMx_CLK(72M)的 1/4,當(dāng)觸發(fā)信號(hào)的頻率很高的情況下,就必須使用分頻器來降頻,具體的由 TIMx_SMCR 的位 ETPS[1:0] 配置。
④:濾波器
如果 ETRP 的信號(hào)的頻率過高或者混雜有高頻干擾信號(hào)的話,我們就需要使用濾波器對(duì)ETRP信號(hào)重新采樣,來達(dá)到降頻或者去除高頻干擾的目的。具體的由 TIMx_SMCR 的位ETF[3:0]配置,其中的fDTS是由內(nèi)部時(shí)鐘CK_INT分頻得到,具體的由TIMx_CR1 的位 CKD[1:0] 配置。
⑤:從模式選擇
經(jīng)過濾波器濾波的信號(hào)連接到 ETRF 引腳后,觸發(fā)信號(hào)成為外部時(shí)鐘模式 2 的輸入,最終等于CK_PSC,然后驅(qū)動(dòng)計(jì)數(shù)器 CNT 計(jì)數(shù)。具體的配置 TIMx_SMCR 的位 ECE 為 1 即可選擇外部時(shí)鐘模式 2。
極性選擇用于選擇外部脈沖信號(hào)的觸發(fā)極性,可以進(jìn)行反相和不反相:觸發(fā)極性不反相表示在脈沖信號(hào)的上升沿出現(xiàn)時(shí)計(jì)數(shù);觸發(fā)極性反相表示在脈沖信號(hào)的下降沿出現(xiàn)時(shí)計(jì)數(shù)。
分頻表示多少個(gè)有效邊沿觸發(fā)一次計(jì)數(shù)。當(dāng)計(jì)數(shù)脈沖頻率較高時(shí),可以通過分頻來降低外部脈沖信號(hào)的頻率,從而擴(kuò)大計(jì)數(shù)范圍。
濾波的目的是防止外部脈沖信號(hào)上的噪聲或邊沿抖動(dòng)導(dǎo)致誤計(jì)數(shù)和誤觸發(fā)。文章來源:http://www.zghlxwxcb.cn/news/detail-450317.html
注意:外部脈沖信號(hào)的分頻和濾波并不是必需的,可以根據(jù)信號(hào)的頻率高低以及信號(hào)的干凈程度來決定。文章來源地址http://www.zghlxwxcb.cn/news/detail-450317.html
到了這里,關(guān)于【STM32】定時(shí)器詳細(xì)學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!