




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、通用定時(shí)器輸入捕獲通用定時(shí)器作為輸入捕獲的使用。我們用TIM5的通道1(PA0)來(lái)做輸入捕獲,捕獲PA0上高電平的脈寬(用KEY_UP按鍵輸入高電平),通過(guò)串口來(lái)打印高電平脈寬時(shí)間。輸入捕獲模式可以用來(lái)測(cè)量脈沖寬度或者測(cè)量頻率。 我們以測(cè)量脈寬為例,用一個(gè)簡(jiǎn)圖來(lái)說(shuō)明輸入捕獲的原理:如圖所示,就是輸入捕獲測(cè)量高電平脈寬的原理,假定定時(shí)器工作在向上計(jì)數(shù)模式,圖中t1t2時(shí)間,就是我們需要測(cè)量的高電平時(shí)間。測(cè)量方法如下:首先設(shè)置定時(shí)器通道x為上升沿捕獲,這樣,t1時(shí)刻,就會(huì)捕獲到當(dāng)前的CNT值,然后立即清零CNT,并設(shè)置通道x為下降沿捕獲,這樣到t2時(shí)刻,又會(huì)發(fā)生捕獲事件,得到此時(shí)的CNT值,記為C
2、CRx2。這樣,根據(jù)定時(shí)器的計(jì)數(shù)頻率,我們就可以算出t1t2的時(shí)間,從而得到高電平脈寬。在t1t2之間,可能產(chǎn)生N次定時(shí)器溢出,這就要求我們對(duì)定時(shí)器溢出,做處理,防止高電平太長(zhǎng),導(dǎo)致數(shù)據(jù)不準(zhǔn)確。如圖所示,t1t2之間,CNT計(jì)數(shù)的次數(shù)等于:N*ARR+CCRx2,有了這個(gè)計(jì)數(shù)次數(shù),再乘以CNT的計(jì)數(shù)周期,即可得到t2-t1的時(shí)間長(zhǎng)度,即高電平持續(xù)時(shí)間。 STM32F4的定時(shí)器,除了TIM6和TIM7,其他定時(shí)器都有輸入捕獲功能。STM32F4的輸入捕獲,簡(jiǎn)單的說(shuō)就是通過(guò)檢測(cè)TIMx_CHx上的邊沿信號(hào),在邊沿信號(hào)發(fā)生跳變(比如上升沿/下降沿)的時(shí)候,將當(dāng)前定時(shí)器的值(TIMx_CNT)存放到對(duì)
3、應(yīng)的通道的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。同時(shí)還可以配置捕獲時(shí)是否觸發(fā)中斷/DMA等。這里我們用TIM5_CH1來(lái)捕獲高電平脈寬。=捕獲/比較通道(例如:通道 1 輸入階段)=接下來(lái)介紹我們需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (這里的x=5)。首先TIMx_ARR和TIMx_PSC,這兩個(gè)寄存器用來(lái)設(shè)自動(dòng)重裝載值和TIMx的時(shí)鐘分頻。-捕獲/比較模式寄存器1:TIMx_CCMR1,這個(gè)寄存器在輸入捕獲的時(shí)候,非常有用:TIMx
4、 捕獲/比較模式寄存器 1 (TIMx_CCMR1)TIMx capture/compare mode register 1 偏移地址: 0x18 復(fù)位值: 0x0000當(dāng)在輸入捕獲模式下使用的時(shí)候,對(duì)應(yīng)圖的第二行描述,從圖中可以看出,TIMx_CCMR1是針對(duì)2個(gè)通道的配置,低八位7:0用于捕獲/比較通道1的控制,而高八位15:8則用于捕獲/比較通道2的控制,因?yàn)門IMx還有CCMR2這個(gè)寄存器,所以可以知道CCMR2是用來(lái)控制通道3和通道4(詳見(jiàn)STM32F4xx中文參考手冊(cè)435頁(yè),15.4.8節(jié))。這里我們用到的是TIM5的捕獲/比較通道1,我們重點(diǎn)介紹TIMx_CCMR1的7:0位(
5、其高8位配置類似),TIMx_CCMR1的7:0位詳細(xì)描述見(jiàn)圖所示:位7:4 IC1F:輸入捕獲1濾波器(Input capture 1 filter)此位域可定義TI1輸入的采樣頻率和適用于TI1的數(shù)字濾波器帶寬。數(shù)字濾波器由事件計(jì)數(shù)器組成,每N個(gè)事件才視為一個(gè)有效邊沿:0000:無(wú)濾波器,按fDTS頻率進(jìn)行采樣1000:fSAMPLING=fDTS/8, N=6 0001:fSAMPLING=fCK_INT,N=2 1001:fSAMPLING=fDTS/8, N=8 0010:fSAMPLING=fCK_INT,N=4 1010:fSAMPLING=fDTS/16,N=5 0011:fS
6、AMPLING=fCK_INT,N=8 1011:fSAMPLING=fDTS/16,N=6 0100:fSAMPLING=fDTS/2, N=6 1100:fSAMPLING=fDTS/16,N=8 0101:fSAMPLING=fDTS/2, N=8 1101:fSAMPLING=fDTS/32,N=5 0110:fSAMPLING=fDTS/4, N=6 1110:fSAMPLING=fDTS/32,N=6 0111:fSAMPLING=fDTS/4, N=8 1111:fSAMPLING=fDTS/32,N=8 注意:在當(dāng)前硅版本中,當(dāng)ICxF3:0= 1、2或3時(shí),將用CK_INT代
7、替公式中的fDTS。輸入捕獲1濾波器IC1F3:0,這個(gè)用來(lái)設(shè)置輸入采樣頻率和數(shù)字濾波器長(zhǎng)度。其中,fCK_INT是定時(shí)器的輸入頻率(TIMxCLK),一般為84Mhz/168Mhz(看該定時(shí)器在哪個(gè)總線上),而fDTS則是根據(jù)TIMx_CR1的CKD1:0的設(shè)置來(lái)確定的,如果CKD1:0設(shè)置為00,那么fDTS=fCK_INT。N值就是濾波長(zhǎng)度,舉個(gè)簡(jiǎn)單的例子:假設(shè)IC1F3:0=0011,并設(shè)置IC1映射到通道1上,且為上升沿觸發(fā),那么在捕獲到上升沿的時(shí)候,再以fCK_INT的頻率,連續(xù)采樣到8次通道1的電平,如果都是高電平,則說(shuō)明卻是一個(gè)有效的觸發(fā),就會(huì)觸發(fā)輸入捕獲中斷(如果開(kāi)啟了的話)
8、。這樣可以濾除那些高電平脈寬低于8個(gè)采樣周期的脈沖信號(hào),從而達(dá)到濾波的效果。這里,我們不做濾波處理,所以設(shè)置IC1F3:0=0000,只要采集到上升沿,就觸發(fā)捕獲。位3:2 IC1PSC:輸入捕獲1預(yù)分頻器(Input capture 1 prescaler)此位域定義CC1輸入(IC1)的預(yù)分頻比。只要CC1E=0(TIMx_CCER寄存器),預(yù)分頻器便立即復(fù)位。00:無(wú)預(yù)分頻器,捕獲輸入上每檢測(cè)到一個(gè)邊沿便執(zhí)行捕獲01:每發(fā)生2個(gè)事件便執(zhí)行一次捕獲10:每發(fā)生4個(gè)事件便執(zhí)行一次捕獲11:每發(fā)生8個(gè)事件便執(zhí)行一次捕獲輸入捕獲1預(yù)分頻器IC1PSC1:0,我們是1次邊沿就觸發(fā)1次捕獲,所以選擇
9、00。位1:0 CC1S:捕獲/比較1選擇 (Capture/Compare 1 selection)此位域定義通道方向(輸入/輸出)以及所使用的輸入。00:CC1通道配置為輸出01:CC1通道配置為輸入,IC1映射到TI1上10:CC1通道配置為輸入,IC1映射到TI2上11:CC1通道配置為輸入,IC1映射到TRC上。此模式僅在通過(guò)TS位(TIMx_SMCR寄存器)選擇內(nèi)部觸發(fā)輸入時(shí)有效注意:僅當(dāng)通道關(guān)閉時(shí)(TIMx_CCER中的CC1E = 0),才可向CC1S位寫(xiě)入數(shù)據(jù)。其中CC1S1:0,這兩個(gè)位用于CCR1的通道配置,這里我們?cè)O(shè)置IC1S1:0=01,也就是配置IC1映射在TI1上
10、。-TIMx 捕獲/比較使能寄存器 (TIMx_CCER)TIMx capture/compare enable register 偏移地址: 0x20 復(fù)位值: 0x0000位1 CC1P:捕獲/比較1輸出極性 (Capture/Compare 1 output Polarity)。CC1通道配置為輸出:0:OC1高電平有效1:OC1低電平有效CC1 通道配置為輸入:CC1NP/CC1P位可針對(duì)觸發(fā)或捕獲操作選擇TI1FP1和TI2FP1的極性。00:非反相/上升沿觸發(fā)電路對(duì)TIxFP1上升沿敏感(在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作),TIxFP1未反相(在門控模式或編碼
11、器模式下執(zhí)行觸發(fā)操作)。01:反相/下降沿觸發(fā)電路對(duì)TIxFP1下降沿敏感 (在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作),TIxFP1反相(在門控模式或編碼器模式下執(zhí)行觸發(fā)操作)。10:保留,不使用此配置。11:非反相/上升沿和下降沿均觸發(fā)電路對(duì)TIxFP1上升沿和下降沿都敏感(在復(fù)位模式、外部時(shí)鐘模式或觸發(fā)模式下執(zhí)行捕獲或觸發(fā)操作)位0 CC1E:捕獲/比較1輸出使能 (Capture/Compare 1 output enable)。CC1通道配置為輸出:0:關(guān)閉OC1未激活1:開(kāi)啟在相應(yīng)輸出引腳上輸出OC1信號(hào)CC1通道配置為輸入:此位決定了是否可以實(shí)際將計(jì)數(shù)器值捕獲到輸入
12、捕獲/比較寄存器 1 (TIMx_CCR1) 中。0:禁止捕獲1:使能捕獲所以要使能輸入捕獲,必須設(shè)置CC1E=1,而CC1P則根據(jù)自己的需要來(lái)配置。-接下來(lái)我們?cè)倏纯碊MA/中斷使能寄存器:TIMx_DIER,該寄存器的各位描述見(jiàn)圖TIMx_ DIER 寄存器各位描述我們需要用到中斷來(lái)處理捕獲數(shù)據(jù),所以必須開(kāi)啟通道1的捕獲比較中斷,即CC1IE設(shè)置為1。-控制寄存器: TIMx_CR1,我們只用到了它的最低位,也就是用來(lái)使能定時(shí)器的。u 控制寄存器1(TIMx_CR1)位 9:8 CKD:時(shí)鐘分頻 (Clock division)此位域指示定時(shí)器時(shí)鐘 (CK_INT) 頻率與數(shù)字濾波器所使用
13、的采樣時(shí)鐘(ETR、 TIx之間的分頻比,00: tDTS = tCK_INT 01: tDTS = 2 tCK_INT 10: tDTS = 4 tCK_INT 11:保留-最后再來(lái)看看捕獲/比較寄存器 1:TIMx_CCR1,該寄存器用來(lái)存儲(chǔ)捕獲發(fā)生時(shí),TIMx_CNT的值,我們從TIMx_CCR1就可以讀出通道1捕獲發(fā)生時(shí)刻的TIMx_CNT值,通過(guò)兩次捕獲(一次上升沿捕獲,一次下降沿捕獲)的差值,就可以計(jì)算出高電平脈沖的寬度(注意,對(duì)于脈寬太長(zhǎng)的情況,還要計(jì)算定時(shí)器溢出的次數(shù))。=輸入捕獲庫(kù)函數(shù)配置:1)開(kāi)啟TIM5時(shí)鐘,配置PA0為復(fù)用功能(AF2),并開(kāi)啟下拉電阻。要使用TIM5,
14、我們必須先開(kāi)啟TIM5的時(shí)鐘。同時(shí)我們要捕獲TIM5_CH1上面的高電平脈寬,所以先配置PA0為帶下拉的復(fù)用功能,同時(shí),為了讓PA0的復(fù)用功能選擇連接到TIM5,所以設(shè)置PA0的復(fù)用功能為AF2,即連接到TIM5上面。開(kāi)啟 IM5時(shí)鐘的方法為:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); /TIM5 時(shí)鐘使能當(dāng)然,這里我們也要開(kāi)啟PA0對(duì)應(yīng)的GPIO的時(shí)鐘。配置PA0為復(fù)用功能,所以我們首先要設(shè)置PA0引腳映射AF2,方法為:GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); 最后
15、,我們還要初始化GPIO的模式為復(fù)用功能,同時(shí)這里我們還要設(shè)置為開(kāi)啟下拉。方法為:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復(fù)用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /速度 100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /推挽復(fù)用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
16、 /下拉GPIO_Init(GPIOA,&GPIO_InitStructure); /初始化 PA0跟上一講PWM輸出類似,這里我們使用的是定時(shí)器5的通道 1,所以我們從STM32F4對(duì)應(yīng)的數(shù)據(jù)手冊(cè)可以查看到對(duì)應(yīng)的IO口為PA0:2)初始化TIM5,設(shè)置TIM5的ARR和PSC。在開(kāi)啟了TIM5的時(shí)鐘之后,我們要設(shè)置ARR和PSC兩個(gè)寄存器的值來(lái)設(shè)置輸入捕獲的自動(dòng)重裝載值和計(jì)數(shù)頻率。 這在庫(kù)函數(shù)中是通過(guò)TIM_TimeBaseInit函數(shù)實(shí)現(xiàn)的, TIM_TimeBaseStructure.TIM_Prescaler=psc; /定時(shí)器分頻TIM_TimeBaseStructure.TIM_C
17、ounterMode=TIM_CounterMode_Up; /向上計(jì)數(shù)模式TIM_TimeBaseStructure.TIM_Period=arr; /自動(dòng)重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);/初始化TIM53)設(shè)置TIM5的輸入捕獲參數(shù),開(kāi)啟輸入捕獲。TIM5_CCMR1寄存器控制著輸入捕獲1和2的模式,包括映射關(guān)系,濾波和分頻等。這里我們需要設(shè)置通道1為輸入模式,且IC1映射到TI1(通道1)上面,并且不使用濾波器(提高
18、響應(yīng)速度)。 庫(kù)函數(shù)是通過(guò)TIM_ICInit函數(shù)來(lái)初始化輸入比較參數(shù)的:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)同樣,我們來(lái)看看參數(shù)設(shè)置結(jié)構(gòu)體 TIM_ICInitTypeDef 的定義:typedef structuint16_t TIM_Channel; /通道uint16_t TIM_ICPolarity; /捕獲極性u(píng)int16_t TIM_ICSelection;/映射uint16_t TIM_ICPrescaler;/分頻系數(shù)uint16_t TIM_ICFilter; /濾波器
19、長(zhǎng)度 TIM_ICInitTypeDef;參數(shù)TIM_Channel很好理解,用來(lái)設(shè)置通道。我們?cè)O(shè)置為通道1,為TIM_Channel_1。參 數(shù)TIM_ICPolarit是用來(lái)設(shè)置輸入信號(hào)的有效捕獲極性,這里我們?cè)O(shè)置為TIM_ICPolarity_Rising,上升沿捕獲。同時(shí)庫(kù)函數(shù)還提供了單獨(dú)設(shè)置通道1捕獲極性的函數(shù)為:TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);這表示通道1為上升沿捕獲,我們后面會(huì)用到,同時(shí)對(duì)于其他三個(gè)通道也有一個(gè)類似的函數(shù),使用的時(shí)候一定要分清楚使用的是哪個(gè)通道該調(diào)用哪個(gè)函數(shù),格式為TIM_OCxPolarity
20、Config()。參數(shù)TIM_ICSelection是用來(lái)設(shè)置映射關(guān)系,我們配置IC1直接映射在TI1上,選擇TIM_ICSelection_DirectTI。參 數(shù)TIM_ICPrescaler用來(lái)設(shè)置輸入捕獲分頻系數(shù),我們這里不分頻,所以選中TIM_ICPSC_DIV1,還有2,4,8分頻可選。參數(shù)TIM_ICFilter設(shè)置濾波器長(zhǎng)度,這里我們不使用濾波器,所以設(shè)置為0。我們的配置代碼是:TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /選擇輸入端IC1 映射到TI1上TIM5_ICInitStructure.TIM_ICPolarit
21、y = TIM_ICPolarity_Rising; /上升沿捕獲TIM5_ICInitStructure.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);4)使能捕獲和更新中斷(設(shè)置TIM5的DIER寄存器
22、)因?yàn)槲覀円东@的是高電平信號(hào)的脈寬,所以,第一次捕獲是上升沿,第二次捕獲時(shí)下降沿,必須在捕獲上升沿之后,設(shè)置捕獲邊沿為下降沿,同時(shí),如果脈寬比較長(zhǎng),那么定時(shí)器就會(huì)溢出,對(duì)溢出必須做處理,否則結(jié)果就不準(zhǔn)了,不過(guò),由于STM32F4的TIM5是32位定時(shí)器,假設(shè)計(jì)數(shù)周期為1us,那么需要4294秒才會(huì)溢出一次,這基本上是不可能的。這兩件事,我們都在中斷里面做,所以必須開(kāi)啟捕獲中斷和更新中斷。這里我們使用定時(shí)器的開(kāi)中斷函數(shù)TIM_ITConfig即可使能捕獲和更新中斷:TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/允許更新中斷和捕獲中斷5
23、)設(shè)置中斷優(yōu)先級(jí),編寫(xiě)中斷服務(wù)函數(shù)因?yàn)槲覀円褂玫街袛啵晕覀冊(cè)谙到y(tǒng)初始化之后,需要先設(shè)置中斷優(yōu)先級(jí)分組,這里方法跟我們前面講解一致,調(diào)用NVIC_PriorityGroupConfig()函數(shù)即可,我們系統(tǒng)默認(rèn)設(shè)置都是分組2。 設(shè)置中斷優(yōu)先級(jí)的方法前面多次提到這里我們不做講解,主要是通過(guò)函數(shù) NVIC_Init()來(lái)完成。設(shè)置優(yōu)先級(jí)完成后,我們還需要在中斷函數(shù)里面完成數(shù)據(jù)處理和捕獲設(shè)置等關(guān)鍵操作,從而實(shí)現(xiàn)高電平脈寬統(tǒng)計(jì)。在中斷服務(wù)函數(shù)里面,跟以前的外部中斷和定時(shí)器中斷實(shí)驗(yàn)中一樣,我們?cè)谥袛嚅_(kāi)始的時(shí)候要進(jìn)行中斷類型判斷,在中斷結(jié)束的時(shí)候要清除中斷標(biāo)志位。使用到的函數(shù)在上面的實(shí)驗(yàn)已經(jīng)講解過(guò),分
24、別為TIM_GetITStatus()函數(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);上面語(yǔ)句的意思是將TIM
25、5的計(jì)數(shù)值設(shè)置為0。這個(gè)相信是比較好理解的。6)使能定時(shí)器(設(shè)置TIM5的CR1寄存器)最后,必須打開(kāi)定時(shí)器的計(jì)數(shù)器開(kāi)關(guān), 啟動(dòng)TIM5的計(jì)數(shù)器,開(kāi)始輸入捕獲。TIM_Cmd(TIM5,ENABLE ); /使能定時(shí)器 5通過(guò)以上6步設(shè)置,定時(shí)器5的通道1就可以開(kāi)始輸入捕獲了,同時(shí)因?yàn)檫€用到了串口輸出結(jié)果,所以還需要配置一下串口。我們?cè)趖imer.c和timer.h 中主要是添加了輸入捕獲初始化函數(shù)TIM5_CH1_Cap_Init 以及中斷服務(wù)函數(shù) TIM5_IRQHandler。接下來(lái)我們來(lái)看看timer.c文件中,我們添加的兩個(gè)函數(shù)的內(nèi)容:TIM_ICInitTypeDef TIM5_I
26、CInitStructure;/定時(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,ENABLE); /TIM5 時(shí)鐘使能RCC_AHB1Per
27、iphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /使能 PORTA 時(shí)鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復(fù)用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /速度 100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /推挽復(fù)用輸出GPIO_InitStructure.GPIO_PuPd = G
28、PIO_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_TimeBaseStructure.TIM_Period=arr; /自動(dòng)重裝載值TIM_TimeBase
29、Structure.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.TIM_ICSelection = TIM_ICSelection_DirectTI; /映射到 TI1 上T
30、IM5_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);/允許更新和捕獲中斷TIM_Cmd(TIM5,ENABLE ); /使能定時(shí)器 5NVIC_InitStructure.NVIC_
31、IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;/搶占優(yōu)先級(jí) 2NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;/響應(yīng)優(yōu)先級(jí) 0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道使能NVIC_Init(&NVIC_InitStructure); /根據(jù)指定的參數(shù)初始化 VIC 寄存器、/捕獲狀態(tài)/7:0,沒(méi)有成功的捕獲;1,成功捕獲到一次./6:0,還沒(méi)捕獲到低電平;1,已經(jīng)捕獲
32、到低電平了./5:0:捕獲低電平后溢出的次數(shù)(對(duì)于32位定時(shí)器來(lái)說(shuō),1us計(jì)數(shù)器加1,溢出時(shí)間:4294秒)u8 TIM5CH1_CAPTURE_STA=0;/輸入捕獲狀態(tài) u32TIM5CH1_CAPTURE_VAL;/輸入捕獲值(TIM2/TIM5是32位)/定時(shí)器5中斷服務(wù)程序 void TIM5_IRQHandler(void) if(TIM5CH1_CAPTURE_STA&0X80)=0)/還未成功捕獲if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/溢出 if(TIM5CH1_CAPTURE_STA&0X40)/已經(jīng)捕獲到高電平了i
33、f(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/高電平太長(zhǎng)了TIM5CH1_CAPTURE_STA|=0X80;/標(biāo)記成功捕獲了一次TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;else TIM5CH1_CAPTURE_STA+; if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/捕獲1發(fā)生捕獲事件if(TIM5CH1_CAPTURE_STA&0X40)/捕獲到一個(gè)下降沿 TIM5CH1_CAPTURE_STA|=0X80;/標(biāo)記成功捕獲到一次高電平脈寬 TIM5CH1_CAPTURE_VAL=TIM_GetCap
34、ture1(TIM5);/獲取當(dāng)前的捕獲值. TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); /CC1P=0設(shè)為上升沿捕獲else /還未開(kāi)始,第一次捕獲上升沿TIM5CH1_CAPTURE_STA=0;/清空TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAPTURE_STA|=0X40;/標(biāo)記捕獲到了上升沿TIM_Cmd(TIM5,DISABLE ); /關(guān)閉定時(shí)器5 TIM_SetCounter(TIM5,0); TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);/CC
35、1P=1設(shè)為下降沿捕獲TIM_Cmd(TIM5,ENABLE ); /使能定時(shí)器5 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); /清除中斷標(biāo)志位此部分代碼包含兩個(gè)函數(shù),其中 TIM5_CH1_Cap_Init函數(shù)用于TIM5通道1的輸入捕獲設(shè)置,其設(shè)置和我們上面講的步驟是一樣的,這里就不多說(shuō), 特別注意:TIM5是32位定時(shí)器,所以arr是u32類型的。接下來(lái),重點(diǎn)來(lái)看看第二個(gè)函數(shù)。TIM5_IRQHandler是TIM5的中斷服務(wù)函數(shù),該函數(shù)用到了兩個(gè)全局變量,用于輔助實(shí)現(xiàn)高電平捕獲。其中TIM5CH1_CAPTURE_STA,是用來(lái)記錄捕獲狀態(tài),該變量類似我們?cè)趗sart.c里面自行定義的USART_RX_STA 寄存器(其實(shí)就是個(gè)變量,只是我們把它當(dāng)成一個(gè)寄存器那樣來(lái)使用)。TIM5CH1_CAPTURE_STA 各位描述如表所示:TIM5CH1_CAPTURE_STAbit7 bit6bit50捕獲完成標(biāo)志捕獲到高電平標(biāo)志捕獲高電平后定時(shí)器溢出的次數(shù)另外一個(gè)變量TIM5CH1_CAPTURE_VAL,則用來(lái)記錄捕獲到下降沿的時(shí)候,TIM5_CNT的值。現(xiàn)在介紹一下,捕獲高電平脈寬的思路:首先,設(shè)置TIM5_CH1捕獲上升沿,這在TIM5_Cap_Init 函數(shù)執(zhí)行的時(shí)候就設(shè)置好了,然后等待
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州國(guó)企招聘2025仁懷市交通運(yùn)輸服務(wù)有限公司招聘92人筆試參考題庫(kù)附帶答案詳解
- 江西豐城市紀(jì)委監(jiān)委招聘38名調(diào)查看護(hù)人員筆試歷年參考題庫(kù)附帶答案詳解
- 天津?yàn)I海職業(yè)學(xué)院《程序設(shè)計(jì)實(shí)訓(xùn)(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安財(cái)經(jīng)大學(xué)《功能高分子材料的設(shè)計(jì)與開(kāi)發(fā)》2023-2024學(xué)年第二學(xué)期期末試卷
- 隨州職業(yè)技術(shù)學(xué)院《網(wǎng)絡(luò)爬蟲(chóng)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 錫林郭勒職業(yè)學(xué)院《新媒體網(wǎng)絡(luò)營(yíng)銷劃寫(xiě)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京郵電大學(xué)世紀(jì)學(xué)院《現(xiàn)代大地測(cè)量學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京師范大學(xué)中北學(xué)院《人力資源管理實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 榆林能源科技職業(yè)學(xué)院《護(hù)理學(xué)基礎(chǔ)Ⅰ(實(shí)驗(yàn))》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南三一工業(yè)職業(yè)技術(shù)學(xué)院《現(xiàn)代環(huán)境監(jiān)測(cè)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年福建高考化學(xué)試卷(含答案解析)
- 實(shí)測(cè)實(shí)量專項(xiàng)方案
- 安徽彩色壓花地坪施工方案
- 二氧化碳與水反應(yīng)的實(shí)驗(yàn)改進(jìn)
- 建設(shè)工程施工合同GF-0201
- 吸收塔安裝施工方案
- 辛棄疾詞《青玉案·元夕》
- 年產(chǎn)鄰苯二甲酸二丁酯畢業(yè)設(shè)計(jì)
- 液壓傳動(dòng)連接 試驗(yàn)方法 第2部分:快換接頭
- 2024年重慶市初中學(xué)業(yè)水平考試生物試卷試題真題(含答案詳解)
- 整形外科診療規(guī)范
評(píng)論
0/150
提交評(píng)論