娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月13日(星期四)

正在發(fā)生

2019年03月13日 | 【STM32】通用定時器的輸入捕獲(實例:輸入捕獲)

發(fā)布者:自由漫步 來源: eefocus關(guān)鍵字:STM32  通用定時器  輸入捕獲 手機看文章 掃描二維碼
隨時隨地手機看文章

STM32F1xx官方資料:


《STM32中文參考手冊V10》-第14章  通用定時器


通用定時器輸入捕獲概述

輸入捕獲的工作原理



在通用定時器框圖中,主要涉及到最頂上的一部分(計數(shù)時鐘的選擇)、中間部分(時基單元)、左下部分(輸入捕獲)這三個部分。這里主要講解一下左下部分(輸入捕獲),其他兩個部分可以參考文章:【STM32】通用定時器的基本原理(實例:定時器中斷)。


輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。STM32的定時器,除了TIM6、TIM7,其他的定時器都有輸入捕獲的功能。下面以一個簡單的脈沖輸入為例,簡單地講述一下輸入捕獲用于測量脈沖寬度的工作原理:



先設(shè)置輸入捕獲為上升沿檢測,記錄發(fā)生上升沿時TIMx_CNT的值。然后配置捕獲信號為下降沿捕獲,當(dāng)下降沿到來的時候發(fā)生捕獲,并記錄此時的TIMx_CNT的值。這樣,前后兩次TIMx_CNT的值之差就是高電平的脈寬。同時根據(jù)TIM的計數(shù)頻率,我們就能知道高電平脈寬的準(zhǔn)確時間。


輸入捕獲的通道概覽

每一個捕獲/比較通道都是圍繞著一個捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器),和輸出部分(比較器和輸出控制)。


捕獲/比較模塊由一個預(yù)裝載寄存器和一個影子寄存器組成。讀寫過程僅操作預(yù)裝載寄存器。


在捕獲模式下,捕獲發(fā)生在影子寄存器上,然后再復(fù)制到預(yù)裝載寄存器中。 

在比較模式下,預(yù)裝載寄存器的內(nèi)容被復(fù)制到影子寄存器中,然后影子寄存器的內(nèi)容和計數(shù)器進行比較。



輸入部分對相應(yīng)的TIx輸入信號采樣,并產(chǎn)生一個濾波后的信號TIxF。然后,一個帶極性選擇的邊緣檢測器產(chǎn)生一個信號(TIxFPx),它可以作為從模式控制器的輸入觸發(fā)或者作為捕獲控制。該信號通過預(yù)分頻進入捕獲寄存器(ICxPS)。


一句話總結(jié)工作過程:通過檢測TIMx_CHx通道上的邊沿信號,在邊沿信號發(fā)生跳變(比如上升沿/下降沿)的時候,將當(dāng)前定時器的值(TIMx_CNT)存放到對應(yīng)的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。同時,還可以配置捕獲時是否觸發(fā)中斷/DMA等。


輸入捕獲的工作過程

將輸入捕獲的通道圖進行分解,分解成四個部分,下面對這四個部分進行分析來了解輸入捕獲的工作過程:



設(shè)置輸入捕獲濾波器

輸入捕獲濾波器IC1F[3:0],這個用于設(shè)置采樣頻率和數(shù)字濾波器長度。其中:fCK_INT是定時器的輸入頻率,fDTS是根據(jù)TIMx_CR1的CKD[1:0]的設(shè)置來確定的。


這里濾波器的作用是什么意思呢?數(shù)字濾波器由一個事件計數(shù)器組成,它記錄到N個事件后會產(chǎn)生一個輸出的跳變。也就是說連續(xù)N次采樣,如果都是高電平,則說明這是一個有效的觸發(fā),就會進入輸入捕捉中斷(如果設(shè)置了的話)。這樣就可以濾除那些高電平脈寬低于8個采樣周期的脈沖信號,從而達到濾波的作用。


設(shè)置輸入捕捉極性

這里是設(shè)置捕捉事件是發(fā)生在上升沿還是下降沿。


設(shè)置輸入捕獲映射關(guān)系

由于我們只顯示了一路通道的通道圖,如果在幾條通路的情況下:



在TIMx_CH1和TIMx_CH2兩條通道的情況下,我們可以看出除了TIMx_CH1捕捉到的信號可以連接到IC1,TIMx_CH2捕捉到的信號可以連接到IC2之外,TIMx_CH1捕捉到的信號也可以連接到IC2,TIMx_CH2捕捉到的信號也可以連接到IC1。


一般情況下,我們設(shè)置成TIMx_CH1捕捉到的信號可以連接到IC1,TIMx_CH2捕捉到的信號可以連接到IC2。


設(shè)置輸入捕獲分頻器

這里設(shè)置的是每N個事件觸發(fā)一次捕捉。也就是說,我們可以設(shè)置成,每2次上升沿事件觸發(fā)一次捕捉。


輸入捕獲相關(guān)配置寄存器

捕獲/比較模式寄存器1(TIMx_CCMR1)



作用:在輸入捕獲模式下,確定數(shù)字濾波器、通道映射、預(yù)分頻系數(shù)。


捕獲/比較使能寄存器(TIMx_CCER)



作用:在輸入捕獲模式下,確定捕捉極性和捕捉使能。


捕獲/比較寄存器1(TIMx_CCR1)



作用:在輸入捕獲模式下,確定上一次輸入捕捉事件傳輸?shù)挠嫈?shù)值。


輸入捕獲相關(guān)配置庫函數(shù)

1個輸入初始化函數(shù)

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

作用:初始化捕獲通道、濾波器、捕獲極性、映射關(guān)系、分頻系數(shù)等參數(shù)。


注意:由于輸出初始化函數(shù)將所有的4個通道的函數(shù)分開各自定義了一個函數(shù),而輸入初始化函數(shù)并沒有這么做。所以在輸入初始化函數(shù)中,需要指定捕獲通道。


1個參數(shù)獲取函數(shù)

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);

uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);

uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);

uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

作用:在四個通道中選擇一個,確定上一次輸入捕捉事件傳輸?shù)挠嫈?shù)值。


1個參數(shù)設(shè)置函數(shù)

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

作用:在四個通道中選擇一個,設(shè)置通道極性。通常在初始化函數(shù)中已經(jīng)設(shè)置了通道極性,此函數(shù)用于除初始化之外的修改。


輸入捕獲的一般步驟

實例要求:使用TIM5的通道1(PA0)來作為輸入捕獲,捕獲PA0上高電平的脈寬(用WK_UP按鍵輸入高電平),通過串口打印高電平脈沖時間。


初始化定時器和通道對應(yīng)IO的時鐘;

初始化IO口,模式為輸入。調(diào)用函數(shù):GPIO_Init();

初始化定時器ARR,PSC。調(diào)用函數(shù):TIM_TimeBaseInit();

初始化輸入捕獲通道。調(diào)用函數(shù):TIM_ICInit();

如果要開啟捕獲中斷。調(diào)用函數(shù):TIM_ITConfig();NVIC_Init();

使能定時器。調(diào)用函數(shù):TIM_Cmd();

編寫中斷服務(wù)函數(shù)。調(diào)用函數(shù):TIMx_IRQHandler()。

下面按照這個一般步驟來進行一個簡單的輸入捕獲程序:


//定時器5通道1輸入捕獲配置

 

TIM_ICInitTypeDef  TIM5_ICInitStructure;

 

void TIM5_Cap_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5時鐘

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA時鐘


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前設(shè)置  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 輸入  

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉


//初始化定時器5 TIM5  

TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)定計數(shù)器自動重裝值 

TIM_TimeBaseStructure.TIM_Prescaler =psc; //預(yù)分頻器   

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式

TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位

  

//初始化TIM5輸入捕獲參數(shù)

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 選擇輸入端 IC1映射到TI1上

  TIM5_ICInitStructure.TIM_ICPolarity = 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);


//中斷分組初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占優(yōu)先級2級

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //從優(yōu)先級0級

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器 


TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷


    TIM_Cmd(TIM5,ENABLE ); //使能定時器5

 

}

 

u8  TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)    

u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值

 

//定時器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)捕獲到高電平了

{

if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了

{

TIM5CH1_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次

TIM5CH1_CAPTURE_VAL=0XFFFF;

}else TIM5CH1_CAPTURE_STA++;

}  

}

if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件

{

if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿

{  

TIM5CH1_CAPTURE_STA|=0X80; //標(biāo)記成功捕獲到一次高電平脈寬

TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);

    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲

}else  //還未開始,第一次捕獲上升沿

{

TIM5CH1_CAPTURE_STA=0; //清空

TIM5CH1_CAPTURE_VAL=0;

TIM_SetCounter(TIM5,0);

TIM5CH1_CAPTURE_STA|=0X40; //標(biāo)記捕獲到了上升沿

    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設(shè)置為下降沿捕獲

}     

}              

  }

 

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中斷標(biāo)志位

 

}

extern u8  TIM5CH1_CAPTURE_STA; //輸入捕獲狀態(tài)    

extern u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值

 int main(void)

 {

  u32 temp=0; 

delay_init();     //延時函數(shù)初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級

uart_init(115200); //串口初始化為115200

 

  TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計數(shù) 

    while(1)

{

  delay_ms(10);

 

  if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿

{

temp=TIM5CH1_CAPTURE_STA&0X3F;

temp*=65536;//溢出時間總和

temp+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間

printf("HIGH:%d us\r\n",temp);//打印總的高點平時間

TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲

}

}

 }

代碼邏輯

這里關(guān)于輸入捕獲的初始化部分比較簡單,對照著一般步驟來就行了。但是在中斷處理函數(shù)TIM5_IRQHandler()部分就有所難度了,為什么會比較復(fù)雜呢?


由于我們進行輸入捕獲,一旦捕捉到了上升沿,就設(shè)置計數(shù)器當(dāng)前值為0,讓它從0開始重新計數(shù):


TIM_SetCounter(TIM5,0);

但是如果脈沖的長度過于寬了,也就是說,從0開始計數(shù)到自動重加載值一個循環(huán)結(jié)束了,脈沖還是沒有結(jié)束。這個情況下,顯而易見不能只記錄一下最后的計數(shù)器當(dāng)前值。


解決這個問題的辦法:


設(shè)置一個變量TIM5CH1_CAPTURE_STA,bit5-0為捕捉高電平后定時器溢出的次數(shù),bit6為捕捉到高電平標(biāo)志,bit7為捕獲完場標(biāo)志。


同時設(shè)置兩個中斷(更新中斷和捕獲中斷):


TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷

在中斷處理函數(shù)中,先判斷是否捕獲成功,如果捕獲成功了,說明是在脈沖低電平的階段,什么都不需要做;如果捕獲沒有成功,說明是在脈沖高電平的階段,就需要繼續(xù)判斷中斷類型,然后再分別進行處理。在更新中斷中,表示此時脈沖長度過長,TIM5CH1_CAPTURE_STA加1。在捕獲中斷中,判斷捕捉到的是否為上升沿,如果是,計數(shù)器當(dāng)前值清零,TIM5CH1_CAPTURE_STA清零,同時標(biāo)記標(biāo)志,設(shè)置極性下降沿捕捉;如果不是,標(biāo)記捕獲完成,保存當(dāng)前計數(shù)器的值,設(shè)置極性上升沿捕獲。


extern關(guān)鍵字

C語言中,extern可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此類變量和函數(shù)時在其他模塊中尋找其定義。


注意:對于extern申明變量可以多次,但是定義只有一次。

關(guān)鍵字:STM32  通用定時器  輸入捕獲 引用地址:【STM32】通用定時器的輸入捕獲(實例:輸入捕獲)

上一篇:【STM32】RTC實時時鐘概述、寄存器、庫函數(shù)(RTC一般步驟)
下一篇:【STM32】通用定時器的PWM輸出(實例:PWM輸出)

推薦閱讀

2018年3月7日20:00央視少兒頻道推出《大手牽小手》學(xué)雷鋒特別節(jié)目。本期節(jié)目能力風(fēng)暴攜手央視少兒一起走進四川涼山彝族自治州昭覺縣三岔河鄉(xiāng)中心校,為孩子們帶來了酷炫的機器人舞蹈表演,帶孩子們一起體驗教育機器人。為了讓喜歡教育機器人的孩子有機會繼續(xù)學(xué)習(xí),能力風(fēng)暴還向?qū)W校贈送了價值10萬元的教育機器人產(chǎn)品??吹絺髡f中的機器人翩翩起舞,孩子們...
單片機開放附贈的學(xué)習(xí)資料里面很少見到顯示浮點數(shù)的函數(shù),顯示浮點數(shù)的操作也相當(dāng)煩墜!一般轉(zhuǎn)換顯示法拿STM32單片機資源,我們選取ADC采樣部分函數(shù)來看顯示過程adcx=Get_Adc_Average(ADC_Channel_5,20);LCD_ShowxNum(134,130,adcx,4,16,0); temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(...
電網(wǎng)企業(yè)可開展的業(yè)務(wù)包括管制類業(yè)務(wù)和市場化業(yè)務(wù)兩大類。這兩類業(yè)務(wù)適用的法規(guī)政策、業(yè)務(wù)性質(zhì)、盈利模式等方面存在明顯差異,因此,對這兩類業(yè)務(wù)需要開展差異化監(jiān)管和精準(zhǔn)監(jiān)管。 1、電網(wǎng)業(yè)務(wù) 《關(guān)于推進售電側(cè)改革的實施意見》規(guī)定,電網(wǎng)企業(yè)是指擁有輸電網(wǎng)、配電網(wǎng)運營權(quán)(包括地方電力公司、躉售縣供電公司),承擔(dān)其供電營業(yè)區(qū)保底供電服務(wù)的企業(yè)...
據(jù)國家能源局3月12日消息,針對“《能源技術(shù)創(chuàng)新“十四五”規(guī)劃》何時發(fā)布的相關(guān)問題”的留言,國家能源局回應(yīng)稱,國家能源局正在組織研究編制《能源技術(shù)創(chuàng)新“十四五”規(guī)劃》(以下簡稱《規(guī)劃》),支撐能源領(lǐng)域重大技術(shù)裝備創(chuàng)新發(fā)展。 《規(guī)劃》的主要思路是聚焦保障能源安全、促進能源轉(zhuǎn)型和引領(lǐng)能源革命等重大需求,以實現(xiàn)能源科技自立自強為目標(biāo),...

史海拾趣

問答坊 | AI 解惑

D類音頻放大器如何工作

D類音頻放大器如何工作…

查看全部問答∨

發(fā)一個multism的鏈接,可以下載看看

http://www.verycd.com/topics/2754295/ [ 本帖最后由 open82977352 于 2010-2-10 16:33 編輯 ]…

查看全部問答∨

關(guān)于中九升級

請教高手,我拆開一山寨版衛(wèi)星直播解碼器只看到HTV903和AVL1108EGA.還有一芯片上寫著AV2020,請問是5810單晶振的嗎?我怎么也找不到5810或5812的字樣.因此也不敢確定該用哪個升級文件.請高手幫忙.萬分感謝!…

查看全部問答∨

Local Bus 地址線問題

從mpc8313e的LA[0:25]的LA22 LA23 LA24引出三根線接到DSP的HPI管腳,請問如果DSP的片選基地址設(shè)為0xF2000000,那么這個UHPI的基地址是怎么算的? 基地址是0xF2000000 + (1 << (25 - 24))還是0xF200000 + (1 << 22U) 也就是說這個地址該從 ...…

查看全部問答∨

關(guān)于LCD顯示原理問題

液晶顯示是怎么樣顯示的!!還有COM0,COM1,COM2,COM3 SEG0```SEG31 在屏目中是怎么樣的對應(yīng)關(guān)系! 我的思維定死,空間想像不出,那些顯示字的定位 …

查看全部問答∨

ATD撥號后如何發(fā)送LCP應(yīng)答包?

諸位神仙~~小弟乃剛?cè)氲婪踩耍龅街T多困惑,求各位幫忙:)。 最近在編寫串口實現(xiàn)ppp撥號時遇到 atd*99***1#撥號后無法發(fā)送lcp應(yīng)答包問題。(c 編寫) AT+CGCLASS="B" AT+CGDCONT=1,"IP","CMWAP" AT+CGACT=1,1 ATDT*99***1# CONNEC ...…

查看全部問答∨

一個USB枚舉的問題

我把硬件插上后提示發(fā)現(xiàn)新硬件,我測D+ 線上的電壓沒有上拉到3.3V,只有2.6V,請問這會不會影響我驅(qū)動的安裝???固件程序單步運行時沒有發(fā)現(xiàn)有什么問題,USB初始化都正常進行的。但就是驅(qū)動安裝時就裝不上了,驅(qū)動是和板子配套的應(yīng)該不會有什么問題 ...…

查看全部問答∨

DIY MP3活動發(fā)起

讀大學(xué)的時候就打算自己做個MP3玩的,搞了一堆的資料來看。 后來參加了電子大賽,DIY  MP3的想法就擱置在一邊了。 電子大賽完了就基本上開始找工作,直到現(xiàn)在MP3連個影子都木有。 要不大家就一起DIY一個MP3玩玩吧。 雖然現(xiàn)在買一個MP ...…

查看全部問答∨

給大家分享一本非常經(jīng)典的書《 MSP430單片機原理與應(yīng)用實例詳解》

這本書,挺適合初學(xué)者的,推薦給大家,以前的不全,現(xiàn)在將全的分享出來。 [ 本帖最后由 651076842 于 2013-12-16 11:35 編輯 ]…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 重庆市| 礼泉县| 阳城县| 锡林郭勒盟| 民勤县| 惠东县| 太仓市| 保山市| 大庆市| 长武县| 云阳县| 巴林左旗| 莱州市| 隆回县| 皮山县| 乌恰县| 桃园县| 桂平市| 周宁县| 合肥市| 宁都县| 沙田区| 安康市| 峨眉山市| 巩留县| 泽库县| 鸡东县| 靖江市| 镇平县| 句容市| 渭南市| 苗栗市| 永泰县| 牟定县| 清远市| 虎林市| 甘洛县| 广丰县| 泽库县| 濉溪县| 炉霍县|