




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、通用定時(shí)器輸入捕獲通用定時(shí)器作為輸入捕獲的使用。我們用 TIM5 的通道 1( PA0)來做輸入捕獲,捕獲 PA0 上高 電平的脈寬(用 KEY_UP按鍵輸入高電平) ,通過 串口來打印高電平脈寬時(shí)間 。 輸入捕獲模式可以用來 測量脈沖寬度或者測量頻率 。 我們以測量脈寬為例,用一個(gè)簡圖來說明輸入捕獲的原理:,圖中 t1t2Word 文檔時(shí)間,就是我們需要測量的高電平時(shí)間。測量方法如下:首先設(shè)置 定時(shí)器通道 x 為上升沿捕獲 ,這樣, t1 時(shí)刻,就會(huì)捕獲到當(dāng)前的 CNT 值,然后立即清零 CNT,并 設(shè)置 通道 x 為 下降沿捕獲 , 這樣到 t2 時(shí)刻,又會(huì)發(fā)生捕獲事件,得到此時(shí)的 CNT
2、 值,記為 CCRx2。這樣,根據(jù)定時(shí)器的計(jì) 數(shù)頻率,我們就可以算出 t1t2 的時(shí)間,從而得到高電平脈寬。在 t1t2 之間,可能產(chǎn)生 N 次定 時(shí)器溢出, 這就要求我們對定時(shí)器溢出, 做處理, 防止高電平太長, 導(dǎo)致數(shù)據(jù)不準(zhǔn)確。 如圖所示, t1t2 之間, CNT 計(jì)數(shù)的次數(shù)等于: N*ARR+CCRx2 ,有了這個(gè)計(jì)數(shù)次數(shù),再乘以 CNT 的計(jì)數(shù)周 期,即可得到 t2-t1 的時(shí)間長度,即高電平持續(xù)時(shí)間。STM32F4 的定時(shí)器,除了 TIM6 和 TIM7 ,其他定時(shí)器都有輸入捕獲功能。 STM32F4 的輸入捕 獲,簡單的說就是通過檢測 TIMx_CHx 上的邊沿信號(hào),在邊沿信號(hào)發(fā)
3、生跳變(比如上升沿 / 下降 沿)的時(shí)候, 將當(dāng)前定時(shí)器的值 ( TIMx_CNT )存放到對應(yīng)的通道的捕獲 / 比較寄存器 (TIMx_CCRx) 里面,完成一次捕獲。同時(shí)還可以配置捕獲時(shí)是否觸發(fā)中斷 /DMA 等。這里我們用 TIM5_CH1 來捕獲高電平脈寬TIMx_ARR、 TIMx_PSC、接下來介紹我們需要用到的一些寄存器配置,需要用到的寄存器:TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (這里的 x=5)。 首先 TIMx_ARR 和 TIMx_PSC,這兩個(gè)寄存器用來設(shè)自動(dòng)重裝載值和TIMx 的時(shí)鐘分頻捕獲/比較模式寄存器
4、 1:TIMx_CCMR1 ,這個(gè)寄存器在輸入捕獲的時(shí)候,非常有用:TIMx 捕獲 /比較模式寄存器 1 (TIMx_CCMR1)TIMx capture/compare mode register 1 偏移地址: 0x18 復(fù)位值: 0x0000當(dāng)在輸入捕獲模式下使用的時(shí)候,對應(yīng)圖的第二行描述,從圖中可以看出, TIMx_CCMR1 是針 對 2 個(gè)通道的配置,低八位 7 : 0用于捕獲 /比較通道 1 的控制,而高八位 15 :8則用于捕獲 / 比較通道 2 的控制,因?yàn)?TIMx 還有 CCMR2 這個(gè)寄存器,所以可以知道 CCMR2 是用來控制通 道 3 和通道 4 (詳見 STM32
5、F4xx 中文參考手冊 435 頁, 15.4.8 節(jié))。這里我們用到的是 TIM5 的捕獲 /比較通道 1,我們重點(diǎn)介紹 TIMx_CCMR1 的7:0位(其高 8 位配置類似) ,TIMx_CCMR1 的7:0位詳細(xì)描述見圖所示:位 7:4 IC1F :輸入捕獲 1 濾波器 (Input capture 1 filter)此位域可定義 TI1 輸入的采樣頻率和適用于 TI1 的數(shù)字濾波器帶寬。數(shù)字濾波器由事件計(jì)數(shù)器組成,每 N 個(gè)事件才視為一個(gè)有效邊沿:0000 :無濾波器,按 fDTS 頻率進(jìn)行采樣1000: fSAMPLING=f DTS/8 , N=60001:fSAMPLING=f
6、 CK_INT,N=20010:fSAMPLING=f CK_INT,N=40011:fSAMPLING=f CK_INT,N=80100:fSAMPLING=f DTS/2 ,N=60101:fSAMPLING=f DTS/2 ,N=80110:fSAMPLING=f DTS/4 ,N=60111:fSAMPLING=f DTS/4 ,N=81001 :f SAMPLING=f DTS/8, N=81010 :fSAMPLING=f DTS/16 ,N=51011 :fSAMPLING=f DTS/16 ,N=61100: fSAMPLING=f DTS/16 , N=81101: fSAM
7、PLING=f DTS/32 , N=51110: fSAMPLING=f DTS/32 , N=61111: fSAMPLING=f DTS/32 , N=8注意:在當(dāng)前硅版本中,當(dāng)ICxF3:0= 1、2或 3時(shí),將用 CK INT代替公式中的 fDTS。輸入捕獲 1 濾波器 IC1F3:0 ,這個(gè)用來設(shè)置輸入采樣頻 率和數(shù)字濾波器長度。其中, f CK_INT 是定時(shí)器的輸入頻 率( TIMxCLK ),一般為 84Mhz/168Mhz (看該定時(shí)器 在哪個(gè)總線上) ,而 fDTS 則是根據(jù) TIMx_CR1 的 CKD1:0 的設(shè) 置來 確 定的 ,如 果 CKD1:0 設(shè) 置 為 0
8、0 ,那 么 fDTS=fCK_INT。N 值就是濾波長度,舉個(gè)簡單的例子:假 設(shè) IC1F3:0=0011 ,并設(shè)置 IC1 映射到通道 1 上,且為 上升沿觸發(fā),那么在捕獲到上升沿的時(shí)候,再以fCK_INT的頻率,連續(xù)采樣到 8 次通道 1 的電平,如果都是高電 平,則說明卻是一個(gè)有效的觸發(fā),就會(huì)觸發(fā)輸入捕獲中 斷(如果開啟了的話) 。這樣可以濾除那些高電平脈寬低 于 8 個(gè)采樣周期的脈沖信號(hào),從而達(dá)到濾波的效果。這 里,我們不做濾波處理,所以設(shè)置 IC1F3:0=0000 ,只 要采集到上升沿,就觸發(fā)捕獲。位 3:2 IC1PSC:輸入捕獲 1 預(yù)分頻器 (Input capture 1
9、 prescaler) 此位域定義 CC1輸入 (IC1)的預(yù)分頻比。只要 CC1E=0( TIMx_CCER寄存器),預(yù)分頻器便立即復(fù)位。 00:無預(yù)分頻器,捕獲輸入上每檢測到一個(gè)邊沿便執(zhí)行捕獲 01:每發(fā)生 2 個(gè)事件便執(zhí)行一次捕獲10:每發(fā)生 4 個(gè)事件便執(zhí)行一次捕獲11:每發(fā)生 8 個(gè)事件便執(zhí)行一次捕獲輸入捕獲 1 預(yù)分頻器 IC1PSC1:0 ,我們是 1 次邊沿就觸 發(fā) 1 次捕獲,所以選擇 00 。此位域定義通道方向(輸入 00: CC1 通道配置為輸出 01 : CC1 通道配置為輸入, 10: CC1 通道配置為輸入, 11:CC1 通道配置為輸入,/輸出)以及所使用的輸入I
10、C1 映射到 TI1 上 IC1映射到 TI2 上IC1 映射到 TRC 上。此模式僅在通位 1:0 CC1S:捕獲 / 比較 1 選擇 (Capture/Compare 1 selection)過 TS位( TIMx_SMCR 寄存器)選擇內(nèi)部觸發(fā)輸入時(shí)有效 注意:僅當(dāng)通道關(guān)閉時(shí)( TIMx_CCER中的 CC1E = 0),才 可向 CC1S位寫入數(shù)據(jù)。其中 CC1S1:0 ,這兩個(gè)位用于 CCR1 的通道配置,這里 我們設(shè)置 IC1S1:0=01 ,也就是配置 IC1 映射在 TI1 上。TIMx 捕獲 / 比較使能寄存器 (TIMx_CCER)TIMx capture/compare
11、enable register 偏移地址: 0x20 復(fù)位值: 0x0000位 1 CC1P:捕獲/比較 1輸出極性 (Capture/Compare 1 output Polarity) 。CC1 通道配置為輸出: 0:OC1高電平有效1:OC1 低電平有效CC1 通道配置為輸入: CC1NP/CC1P 位可針對觸發(fā)或捕獲 操作選擇 TI1FP1 和 TI2FP1的極性。00 :非反相 /上升沿觸發(fā)電路對 TIxFP1 上升沿敏感(在復(fù)位模式、外部時(shí)鐘模式或 觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作) ,TIxFP1 未反相(在門控 模式或編碼器模式下執(zhí)行觸發(fā)操作) 。01:反相 /下降沿觸發(fā)電路對 T
12、IxFP1 下降沿敏感 (在復(fù)位模式、外部時(shí)鐘模式或 觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作) ,TIxFP1 反相(在門控模 式或編碼器模式下執(zhí)行觸發(fā)操作) 。10 :保留,不使用此配置。11 :非反相 /上升沿和下降沿均觸發(fā)電路對 TIxFP1 上升沿和下降沿都敏感(在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作)位0 CC1E:捕獲/比較 1輸出使能 (Capture/Compare 1 output enable) 。CC1 通道配置為輸出:0 :關(guān)閉 OC1 未激活1 :開啟 在相應(yīng)輸出引腳上輸出 OC1 信號(hào)CC1 通道配置為輸入:此位決定了是否可以實(shí)際將計(jì)數(shù)器值捕獲到輸入捕獲/比較
13、寄存器 1 (TIMx_CCR1) 中。0:禁止捕獲 1:使能捕獲所以要 使能輸入捕獲,必須設(shè)置 CC1E=1 ,而 CC1P 則根據(jù)自己的需要來配置。接下來我們再看看 DMA/ 中斷使能寄存器: TIMx DIER,該寄存器的各位描述見圖TIMx_ DIER 寄存器各位描述我們需要用到中斷來處理捕獲數(shù)據(jù),所以必須 開啟通道 1 的捕獲比較中斷 ,即 CC1IE 設(shè)置為 1控制寄存器: TIMx_CR1,我們只用到了它的最低位,也就是用來使能定時(shí)器的 控制寄存器 1 (TIMx CR1)位 9:8 CKD :時(shí)鐘分頻 (Clock division)此位域指示定時(shí)器時(shí)鐘 (CK_INT) 頻率
14、與數(shù)字濾波器所使用的采樣時(shí)鐘( ETR、 TIx 之間的分頻比, 00: tDTS = t CK_INT01: tDTS = 2 × t CK_INT10: tDTS = 4 × t CK_INT11:保留最后再來看看捕獲 / 比較寄存器 1:TIMx_CCR1,該寄存器用來存儲(chǔ)捕獲發(fā)生時(shí), TIMx_CNT 的值, 我們從 TIMx_CCR1 就可以讀出通道 1 捕獲發(fā)生時(shí)刻的 TIMx_CNT 值,通過兩次捕獲(一次上升 沿捕獲,一次下降沿捕獲)的差值,就可以計(jì)算出高電平脈沖的寬度(注意,對于脈寬太長的情 況,還要計(jì)算定時(shí)器溢出的次數(shù)) 。= 輸入捕獲庫函數(shù)配置:1)開
15、啟 TIM5 時(shí)鐘,配置 PA0 為復(fù)用功能( AF2 ),并開啟下拉電阻。要使用 TIM5 ,我們必須先開啟 TIM5 的時(shí)鐘。 同時(shí)我們要捕獲 TIM5_CH1 上面的高電平脈寬, 所 以先配置 PA0 為帶下拉的復(fù)用功能,同時(shí),為了讓 PA0 的復(fù)用功能選擇連接到 TIM5 ,所以設(shè)置 PA0 的復(fù)用功能為 AF2,即連接到 TIM5 上面。開啟 IM5 時(shí)鐘的方法為: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); /TIM5 時(shí)鐘使能 當(dāng)然,這里我們也要開啟 PA0 對應(yīng)的 GPIO 的時(shí)鐘。配置 PA0 為復(fù)用功能,所以我們首
16、先要設(shè)置 PA0 引腳映射 AF2,方法為: GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);最后,我們還要初始化 GPIO 的模式為復(fù)用功能,同時(shí)這里我們還要設(shè)置為開啟下拉。方法為: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/ 復(fù)用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; / 速度 100MHz GPIO_InitStruct
17、ure.GPIO_OType = GPIO_OType_PP; / 推挽復(fù)用輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; / 下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); / 初始化 PA0 跟上一講 PWM 輸出類似,這里我們使用的是定時(shí)器 5 的通道 1 ,所以我們從 STM32F4 對應(yīng)的 數(shù)據(jù)手冊可以查看到對應(yīng)的 IO 口為 PA0:2 )初始化 TIM5, 設(shè)置 TIM5 的 ARR 和 PSC。在開啟了 TIM5 的時(shí)鐘之后,我們要設(shè)置 ARR 和 PSC 兩個(gè)寄存器的值來設(shè)置輸入捕獲
18、的自動(dòng)重 裝載值和計(jì)數(shù)頻率。 這在庫函數(shù)中是通過 TIM_TimeBaseInit 函數(shù)實(shí)現(xiàn)的, TIM_TimeBaseStructure.TIM_Prescaler=psc; / 定時(shí)器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /向上計(jì)數(shù)模式TIM_TimeBaseStructure.TIM_Period=arr; / 自動(dòng)重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBas
19、eStructure);/ 初始化 TIM53 )設(shè)置 TIM5 的輸入捕獲參數(shù),開啟輸入捕獲。TIM5_CCMR1 寄存器控制著輸入捕獲 1 和 2 的模式,包括映射關(guān)系,濾波和分頻等。這里我們 需要設(shè)置通道 1 為輸入模式, 且 IC1 映射到 TI1(通道 1)上面,并且不使用濾波器 (提高響應(yīng)速度) 。 庫函數(shù)是通過 TIM_ICInit 函數(shù)來初始化輸入比較參數(shù)的:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) 同樣,我們來看看參數(shù)設(shè)置結(jié)構(gòu)體 TIM_ICInitTypeDef 的定義:
20、typedef structuint16_t TIM_Channel; / 通道 uint16_t TIM_ICPolarity; / 捕獲極性 uint16_t TIM_ICSelection;/ 映射 uint16_t TIM_ICPrescaler;/ 分頻系數(shù) uint16_t TIM_ICFilter; / 濾波器長度 TIM_ICInitTypeDef;參數(shù) TIM_Channel 很好理解,用來設(shè)置通道。我們設(shè)置為通道1 ,為 TIM_Channel_1 。參 數(shù) TIM_ICPolarit 是 用 來 設(shè) 置 輸 入 信 號(hào) 的 有 效 捕 獲 極 性 , 這 里 我 們 設(shè)
21、置 為 TIM_ICPolarity_Rising ,上升沿捕獲。同時(shí)庫函數(shù)還提供了單獨(dú)設(shè)置通道 1 捕獲極性的函數(shù)為: TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);這表示通道 1 為上升沿捕獲,我們后面會(huì)用到,同時(shí)對于其他三個(gè)通道也有一個(gè)類似的函數(shù), 使用的時(shí)候一定要分清楚使用的是哪個(gè)通道該調(diào)用哪個(gè)函數(shù),格式為 TIM_OCxPolarityConfig() 。 參數(shù) TIM_ICSelection 是用來設(shè)置映射關(guān)系,我們配置IC1 直接映射在 TI1 上,選擇TIM_ICSelection_DirectTI 。參 數(shù) TIM_IC
22、Prescaler 用來設(shè)置輸入捕獲分頻系數(shù), 我們這里不分頻, 所以選中 TIM_ICPSC_DIV1, 還有 2,4,8 分頻可選。參數(shù) TIM_ICFilter 設(shè)置濾波器長度,這里我們不使用濾波器,所以設(shè)置為0 。我們的配置代碼是:TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; / 選擇輸入端 IC1 映射到 TI1 上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; / 上升沿捕獲 TIM5_ICInitStructure.TIM_ICSelection =
23、TIM_ICSelection_DirectTI; /映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; / 配置輸入分頻 ,不分頻 TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置輸入濾波器不濾波 TIM_ICInit(TIM5, &TIM5_ICInitStructure);4 )使能捕獲和更新中斷(設(shè)置 TIM5 的 DIER 寄存器) 因?yàn)槲覀円东@的是高電平信號(hào)的脈寬,所以,第一次捕獲是上升沿, 第二次捕獲時(shí)下降沿, 必 須在捕獲上升沿之后,
24、設(shè)置捕獲邊沿為下降沿,同時(shí),如果脈寬比較長,那么定時(shí)器就會(huì)溢出, 對溢出必須做處理,否則結(jié)果就不準(zhǔn)了,不過,由于 STM32F4 的 TIM5 是 32 位定時(shí)器,假設(shè)計(jì) 數(shù)周期為 1us ,那么需要 4294 秒才會(huì)溢出一次,這基本上是不可能的。這兩件事,我們都在中 斷里面做,所以必須開啟捕獲中斷和更新中斷。這里我們使用定時(shí)器的開中斷函數(shù) TIM_ITConfig 即可使能捕獲和更新中斷: TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/ 允許更新中斷和捕獲中斷 5)設(shè)置中斷優(yōu)先級(jí),編寫中斷服務(wù)函數(shù)因?yàn)槲覀円褂玫街袛啵?所以我們在系
25、統(tǒng)初始化之后, 需要先設(shè)置中斷優(yōu)先級(jí)分組, 這里方法跟 我們前面講解一致,調(diào)用 NVIC_PriorityGroupConfig() 函數(shù)即可,我們系統(tǒng)默認(rèn)設(shè)置都是分組 2 。 設(shè)置中斷優(yōu)先級(jí)的方法前面多次提到這里我們不做講解,主要是通過函數(shù) NVIC_Init() 來完成。 設(shè)置優(yōu)先級(jí)完成后, 我們還需要在中斷函數(shù)里面完成數(shù)據(jù)處理和捕獲設(shè)置等關(guān)鍵操作, 從而實(shí)現(xiàn) 高電平脈寬統(tǒng)計(jì)。在中斷服務(wù)函數(shù)里面,跟以前的外部中斷和定時(shí)器中斷實(shí)驗(yàn)中一樣, 我們在中斷開始的時(shí)候要進(jìn)行中斷類型判斷,在中斷結(jié)束的時(shí)候要清除中斷標(biāo)志位。使用到的 函數(shù)在上面的實(shí)驗(yàn)已經(jīng)講解過,分別為 TIM_GetITStatus()
26、 函數(shù)和 TIM_ClearITPendingBit() 函數(shù)。 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/ 判斷是否為更新中斷 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/ 判斷是否發(fā)生捕獲事件 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);/ 清除中斷和捕獲標(biāo)志位 在我們實(shí)驗(yàn)的中斷服務(wù)函數(shù)中,我們還使用到了一個(gè)設(shè)置計(jì)數(shù)器值的函數(shù)為: TIM_SetCounter(TIM5,0);上面語句的意思是將 TIM5 的計(jì)數(shù)值設(shè)
27、置為 0。這個(gè)相信是比較好理解的。6 )使能定時(shí)器(設(shè)置 TIM5 的 CR1 寄存器) 最后,必須打開定時(shí)器的計(jì)數(shù)器開關(guān), 啟動(dòng) TIM5 的計(jì)數(shù)器,開始輸入捕獲。 TIM_Cmd(TIM5,ENABLE ); / 使能定時(shí)器 5通過以上 6 步設(shè)置,定時(shí)器 5 的通道 1 就可以開始輸入捕獲了,同時(shí)因?yàn)檫€用到了串口輸出結(jié) 果,所以還需要配置一下串口。我們在 timer.c 和 timer.h 中主要是添加了輸入捕獲初始化函數(shù) TIM5_CH1_Cap_Init 以及中斷服 務(wù)函數(shù) TIM5_IRQHandler 。接下來我們來看看 timer.c 文件中,我們添加的兩個(gè)函數(shù)的內(nèi)容:TIM_
28、ICInitTypeDef TIM5_ICInitStructure;/定時(shí)器 5通道 1 輸入捕獲配置/arr :自動(dòng)重裝值 (TIM2,TIM5 是 32 位的 !) psc :時(shí)鐘預(yù)分頻數(shù)void TIM5_CH1_Cap_Init(u32 arr,u16 psc)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENA
29、BLE); /TIM5 時(shí)鐘使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); / 使能 PORTA 時(shí)鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/ 復(fù)用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; / 速度 100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; / 推挽復(fù)
30、用輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; / 下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); / 初始化 PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); /PA0 復(fù)用位定時(shí)器 5TIM_TimeBaseStructure.TIM_Prescaler=psc; / 定時(shí)器分頻 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; / 向上計(jì)數(shù)模式 TIM_TimeBa
31、seStructure.TIM_Period=arr; / 自動(dòng)重裝載值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /選擇輸入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; / 上升沿捕獲 TIM5_ICInitStructure.
32、TIM_ICSelection = TIM_ICSelection_DirectTI; /映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; / 配置輸入分頻 ,不分頻 TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置輸入濾波器不濾波 TIM_ICInit(TIM5, &TIM5_ICInitStructure); / 初始化 TIM5 輸入捕獲參數(shù)TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/
33、 允許更新和捕獲中斷 TIM_Cmd(TIM5,ENABLE ); / 使能定時(shí)器 5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;/ 搶占優(yōu)先級(jí) 2 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;/ 響應(yīng)優(yōu)先級(jí) 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道使能 NVIC_Init(&NVIC_InitStr
34、ucture); / 根據(jù)指定的參數(shù)初始化 VIC 寄存器、/ 捕獲狀態(tài)/7:0, 沒有成功的捕獲 ;1,成功捕獲到一次 ./6:0, 還沒捕獲到低電平 ;1,已經(jīng)捕獲到低電平了 ./5:0: 捕獲低電平后溢出的次數(shù) (對于 32 位定時(shí)器來說 ,1us 計(jì)數(shù)器加 1,溢出時(shí)間 :4294 秒 ) u8 TIM5CH1_CAPTURE_STA=0; / 輸入捕獲狀態(tài)u32 TIM5CH1_CAPTURE_VAL; / 輸入捕獲值 (TIM2/TIM5 是 32 位 )/ 定時(shí)器 5 中斷服務(wù)程序void TIM5_IRQHandler(void)if(TIM5CH1_CAPTURE_STA&a
35、mp;0X80)=0)/ 還未成功捕獲if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/ 溢出if(TIM5CH1_CAPTURE_STA&0X40)/ 已經(jīng)捕獲到高電平了if(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/ 高電平太長了TIM5CH1_CAPTURE_STA|=0X80;/ 標(biāo)記成功捕獲了一次 TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;else TIM5CH1_CAPTURE_STA+;if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESE
36、T)/ 捕獲 1 發(fā)生捕獲事件if(TIM5CH1_CAPTURE_STA&0X40) / 捕獲到一個(gè)下降沿TIM5CH1_CAPTURE_STA|=0X80;/ 標(biāo)記成功捕獲到一次高電平脈寬 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);/ 獲取當(dāng)前的捕獲值 .TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); /CC1P=0 設(shè)為上升沿捕獲else/ 還未開始 ,第一次捕獲上升沿TIM5CH1_CAPTURE_STA=0;/ 清空TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAP
37、TURE_STA|=0X40;/ 標(biāo)記捕獲到了上升沿TIM_Cmd(TIM5,DISABLE ); / 關(guān)閉定時(shí)器 5 TIM_SetCounter(TIM5,0);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);/CC1P=1 設(shè)為下降沿捕獲TIM_Cmd(TIM5,ENABLE ); / 使能定時(shí)器 5TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); / 清除中斷標(biāo)志位此部分代碼包含兩個(gè)函數(shù),其中 TIM5_CH1_Cap_Init 函數(shù)用于 TIM5 通道 1 的輸入捕獲設(shè)
38、置,其設(shè)置和我們上面講的步驟是一樣的,這里就不多說, 特別注意: TIM5 是 32 位定時(shí)器, 所以 arr 是 u32 類型的 。接下來,重點(diǎn)來看看第二個(gè)函數(shù)。 TIM5_IRQHandler 是 TIM5 的中斷服 務(wù)函數(shù), 該函數(shù)用到了兩個(gè)全局變量, 用于輔助實(shí)現(xiàn)高電平捕獲。 其中 TIM5CH1_CAPTURE_STA, 是用來記錄捕獲狀態(tài), 該變量類似我們在 usart.c 里面自行定義的 USART_RX_STA 寄存器 (其實(shí)就 是個(gè)變量,只是我們把它當(dāng)成一個(gè)寄存器那樣來使用)。 TIM5CH1_CAPTURE_STA 各位描述如表所示:TIM5CH1 CAPTURE STAbit7bit6bit50捕獲完成標(biāo)志捕獲到高電平標(biāo)志捕獲高電平后定時(shí)器溢出的次數(shù)另外一個(gè)變量 TIM5CH1_CAPTURE_VAL ,則用來記錄捕獲到下降沿的時(shí)候,TIM5_CNT 的值。現(xiàn)在介紹一下, 捕獲高電平脈寬的思路: 首先, 設(shè)置 TIM5_CH1 捕獲上升沿, 這在 TIM5_Cap_Init 函數(shù)執(zhí)行的時(shí)候就設(shè)置好了,然后等待上升沿中斷到來,當(dāng)捕獲到上升沿中斷,此時(shí)如果 T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京農(nóng)業(yè)大學(xué)《醫(yī)藥信息檢索》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北交通職業(yè)技術(shù)學(xué)院《投資經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧波工程學(xué)院《工程管理前沿與創(chuàng)業(yè)研究》2023-2024學(xué)年第二學(xué)期期末試卷
- Module9 (教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(三起)英語五年級(jí)上冊
- 廣西交通職業(yè)技術(shù)學(xué)院《媒體策略》2023-2024學(xué)年第二學(xué)期期末試卷
- 長治幼兒師范高等專科學(xué)?!峨娏鲃?dòng)控制系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧波大學(xué)科學(xué)技術(shù)學(xué)院《俄羅斯概況》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江警官職業(yè)學(xué)院《電機(jī)與電力拖動(dòng)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶醫(yī)藥高等??茖W(xué)?!禩C稅收遵從》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東電子職業(yè)技術(shù)學(xué)院《學(xué)前游戲論》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年國家林業(yè)和草原局管理干部學(xué)院招聘歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年春季開學(xué)典禮活動(dòng)方案【哪吒版】少年無畏凌云志扶搖直上入云蒼
- 醫(yī)藥零售行業(yè)數(shù)字化轉(zhuǎn)型-深度研究
- 現(xiàn)場施工人員安全責(zé)任協(xié)議書(2篇)
- 四川省自貢市、遂寧市、廣安市等2024-2025學(xué)年高一上學(xué)期期末考試語文試題 含解析
- 醫(yī)院感染與醫(yī)療器械消毒
- 投行競爭格局-洞察分析
- 2024年公務(wù)員考試青岡縣《行政職業(yè)能力測驗(yàn)》深度預(yù)測試卷含解析
- 冠脈介入治療術(shù)后護(hù)理常規(guī)
- 物業(yè)管家客服培訓(xùn)課件
- 餐飲業(yè)供應(yīng)鏈管理指南
評論
0/150
提交評論