国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

這篇具有很好參考價(jià)值的文章主要介紹了嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

上一篇介紹了通用定時(shí)器的輸出比較部分,這一篇再來(lái)介紹一下輸入捕獲的相關(guān)內(nèi)容。

輸入捕獲的概述

輸入捕獲,見(jiàn)名知意,就用來(lái)對(duì)輸入信號(hào)進(jìn)行捕獲的,說(shuō)到捕獲輸入信號(hào),之前介紹過(guò)一個(gè)叫做外部中斷的片上外設(shè),它的作用也是捕獲輸入;它們的不同在于,外部中斷捕獲的只是邊沿,而定時(shí)器的輸入捕獲,捕獲的是信號(hào)的時(shí)間信息,可以用來(lái)測(cè)試脈沖寬度、高電平時(shí)間、低電平時(shí)間等,還可以利用這個(gè)輸入捕獲的功能來(lái)獲取一些模塊采集的數(shù)據(jù),典型代表就是HC-SR04超聲波模塊。
老規(guī)矩還是看看AI對(duì)于輸入捕獲的簡(jiǎn)介:
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
上面提到的四個(gè)部分都是在配置過(guò)程中需要進(jìn)行編程來(lái)實(shí)現(xiàn)的,
輸入捕獲:捕獲輸入到芯片中的脈沖寬度,捕獲的是單個(gè)脈沖的寬度
捕獲的原理:通過(guò)邊沿觸發(fā)捕獲
可以通過(guò)計(jì)算得到:上升沿和下降之間的時(shí)間
輸出比較:調(diào)整脈沖寬度
輸入捕獲:計(jì)算脈沖寬度 捕獲一個(gè)脈沖的有效時(shí)間

框圖

對(duì)輸入捕獲有了一個(gè)大致的概念后,來(lái)看看框圖,簡(jiǎn)易版的框圖再上上篇中提到過(guò),那個(gè)還看不出具體的配置流程,所以這里再將詳細(xì)的框圖做個(gè)分析,和輸出比較一樣,輸入捕獲部分的詳細(xì)框圖也很復(fù)雜,具體的如下圖所示:
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
這里還是將框圖拆分開(kāi)了看。

輸入通道部分

首先來(lái)看框圖的前半段,輸入信號(hào)進(jìn)來(lái)后,第一個(gè)需要經(jīng)過(guò)的就是數(shù)字濾波器,如下圖紅框中的位置。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
該濾波器是通過(guò)TIMx_CCMR1的ICF[3:0]位控制的,功能是“每N個(gè)事件視為一個(gè)有效邊沿”,舉個(gè)栗子來(lái)說(shuō)就是,假設(shè)編程了這個(gè)N為4,而我們檢測(cè)的高電平有效,那么就需要四個(gè)高電平才會(huì)生成一次有效邊沿。
具體的控制寄存器描述如下:
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
需要注意的是,這里的頻率分為了兩部分,一部分是fck_INT也就是初始化的時(shí)鐘,另一部分是fDTS,這里的f都是頻率的意思,是對(duì)應(yīng)的周期分之一;這里的fdts與fck_int的關(guān)系取決于TIMx 控制寄存器 1 (TIMx_CR1)的第八第九位的配置,這里配置的是周期的關(guān)系。t=1/f.
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
經(jīng)過(guò)數(shù)字濾波器后,信號(hào)需要經(jīng)過(guò)一個(gè)邊沿計(jì)測(cè)器,檢測(cè)對(duì)應(yīng)的上升沿還是下降沿,注意上方或門(mén)以及后面的一個(gè)向上的箭頭都是到從模式控制器的,與輸入捕獲無(wú)關(guān),所以可以忽略。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
進(jìn)一步簡(jiǎn)化后如下圖所示,通道1的輸入信號(hào)經(jīng)過(guò)邊沿檢測(cè)器后,會(huì)有一個(gè)數(shù)據(jù)選擇器,這個(gè)選擇器的控制寄存器是CC1P/CC1NP。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
對(duì)應(yīng)的是TIMx_CCER寄存器的第一位與第三位,這里需要特別注意,雖然也是兩位進(jìn)行配合,來(lái)控制此處的是上升沿有效、下降沿有效還是雙邊沿都有效,但是是間隔開(kāi)的兩位,位2是不做配置的,在編寫(xiě)代碼的時(shí)候需要特別小心。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
然后就是后面橙色框內(nèi)的大的數(shù)據(jù)選擇器,這個(gè)選擇器是用來(lái)選輸入信號(hào)的,一共三個(gè)輸入,根據(jù)上上篇的簡(jiǎn)略框圖,我們知道這三個(gè)輸入分別是來(lái)自通道一的輸入信號(hào)、來(lái)自通道二的輸入信號(hào),以及從模式控制器來(lái)的信號(hào);此時(shí)配置的是輸入捕獲,而且為了避免交叉使用通道導(dǎo)致配置出錯(cuò),后兩個(gè)輸入信號(hào)在此處是不考慮的,可以直接不看。也就是說(shuō),在配置過(guò)程中,需要將TIMx_CCMR1的CC1s的兩位配置為“01”——選擇通道一作為輸入。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
最后就是藍(lán)色框內(nèi)的分頻器了,這個(gè)分頻器的作用于前面的數(shù)字濾波器的效果類(lèi)似,假設(shè)配置為2分頻,則需要有兩個(gè)對(duì)應(yīng)事件產(chǎn)生才會(huì)生成一個(gè)有效邊沿。一般都配置為了不分頻,檢測(cè)到一個(gè)邊沿就進(jìn)行捕獲。他的控制寄存器對(duì)應(yīng)的是TIMx_CCMR1的IC1PSC的兩位:
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
最后還有一個(gè)控制器,TIMx_CCER的CC1E控制位,這個(gè)想必大家也都猜到了,是使能位的意思,細(xì)心的同學(xué)可能發(fā)現(xiàn)了,上一篇的PWM輸出,在輸出通道最后也是這個(gè)CC1E位做的使能,其實(shí)他們使用一個(gè)寄存器,只是在不同模式中有著不同的含義。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

比較捕獲寄存器與事件生成

在輸入捕獲中,除了上面的通道配置以外還有兩個(gè)需要配置的,如下圖,第一個(gè)框內(nèi)CCR1比較捕獲寄存器需要寫(xiě)入對(duì)應(yīng)的比較值,這與PWM模式下的CCR1的寫(xiě)法其實(shí)一樣。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
還有一個(gè)是CC1G,這個(gè)對(duì)應(yīng)的是TIMx 事件生成寄存器 (TIMx_EGR)的第1位,這里后面是個(gè)或門(mén),由于CC1E和IC1PS已經(jīng)配置了,上面的那個(gè)輸入是真,所以這一位其實(shí)不配置也可以。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
至于時(shí)基部分,與之前的一樣,所以在此就不做贅述了,接下來(lái)總結(jié)一下具體使用到的寄存器有哪些。

寄存器

1.TIMx 控制寄存器 1 (TIMx_CR1):
寫(xiě)法:TIMx->CR1
位 9:8 CKD:時(shí)鐘分頻 (Clock division)
和濾波器的采樣頻率有關(guān)

2.TIMx 從模式控制寄存器 (TIMx_SMCR)
寫(xiě)法:TIMx->SMCR
時(shí)鐘源選擇

3.TIMx DMA/中斷使能寄存器 (TIMx_DIER)
寫(xiě)法:TIMx->DIER
配置更新中斷
配置捕獲中斷

4.TIMx 事件生成寄存器 (TIMx_EGR)
寫(xiě)法:TIMx->EGR
人為生成更新事件

5.TIMx 捕獲/比較模式寄存器 1 (TIMx_CCMR1)
寫(xiě)法:TIMx->CCMR1
位 1:0 CC1S:捕獲/比較 1 選擇 (Capture/Compare 1 selection)
選擇輸入還是輸出
選擇輸入中的第一個(gè)信號(hào)源

位 3:2 IC1PSC:輸入捕獲 1 預(yù)分頻器 (Input capture 1 prescaler)
配置無(wú)預(yù)分頻

位 7:4 IC1F:輸入捕獲 1 濾波器 (Input capture 1 filter)
選擇對(duì)應(yīng)采樣頻率 1111

6.TIMx 捕獲/比較使能寄存器 (TIMx_CCER)
寫(xiě)法:TIMx->CCER
位 0 CC1E:捕獲/比較 1 輸出使能 (Capture/Compare 1 output enable)。
使能位

位 1 CC1P:捕獲/比較 1 輸出極性 (Capture/Compare 1 output Polarity)。
位 3 CC1NP:捕獲/比較 1 輸出極性 (Capture/Compare 1 output Polarity)。
可讀可寫(xiě)
00:上升沿觸發(fā)
01:下降沿觸發(fā)
11:雙邊觸發(fā) ----- 通過(guò)進(jìn)入中斷的次數(shù)來(lái)判斷

編程思路

根據(jù)上面的框圖解析以及寄存器介紹,我們可以大致總結(jié)出配置為輸入捕獲是時(shí)的代碼思路,
偽代碼:

輸入捕獲初始化函數(shù)
{
  //打開(kāi)時(shí)鐘  GPIO  TIM5
  
  GPIO控制器配置
  //GPIO模式
  復(fù)用功能寄存器

  定時(shí)器的時(shí)基單元
  //更新禁止
  //更新請(qǐng)求源
  //關(guān)閉單脈沖
  //方向
  //重裝載值得影子寄存器
  //分頻    4分頻
  //選擇時(shí)鐘源
  //預(yù)分頻器配置
  //重裝載值配置
  //產(chǎn)生更新事件
  
  定時(shí)器得輸入部分
  //選擇輸入模式  TI1
  //輸入捕獲分頻器 無(wú)分頻器
  //采樣頻率配置   1111
  //邊沿觸發(fā)
  //使能捕獲

  中斷配置
  //更新中斷使能
  //捕獲中斷使能
  //NVIC控制器
  //計(jì)數(shù)器使能
}

而對(duì)應(yīng)的功能則需要到對(duì)應(yīng)的中斷服務(wù)函數(shù)去進(jìn)行,中斷服務(wù)函數(shù)的思路如下:

中斷服務(wù)函數(shù)
{
    判斷位更新中斷
    {
        N++;//記錄產(chǎn)生更新事件的次數(shù),依次來(lái)計(jì)算時(shí)間
    }
    判斷為捕獲中斷
    {
       判斷為上升沿捕獲   
       {
          N=0;
          或者這時(shí)刻得CCR得值
          切換下降沿捕獲  //flag=1
       }




       判斷為下降沿捕獲 
       {
          直接計(jì)算整個(gè)時(shí)間
          切換回上升沿捕獲 下一次進(jìn)來(lái)還是先捕獲上升沿
       }
    }
}

實(shí)際需求

上面總結(jié)了輸入捕獲的編程流程,這里借助兩個(gè)小需求,來(lái)具體編程實(shí)現(xiàn)對(duì)應(yīng)的功能。
需求1:
檢測(cè)開(kāi)發(fā)板上Key_UP的按下時(shí)間,并通過(guò)串口輸出。
需求分析:
首先,要檢測(cè)按鍵按下的時(shí)間,肯定需要使用到上面的輸入捕獲功能了,具體怎么實(shí)現(xiàn)呢,第一步查看原理圖找到KEY_UP按下時(shí)的輸入信號(hào)是什么樣子的。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
如上圖所示,在按鍵輸入的時(shí)候使用過(guò)這個(gè)按鍵,當(dāng)時(shí)是配置為了下拉,使得空閑狀態(tài)是低電平,按下按鍵會(huì)產(chǎn)生一個(gè)脈沖,我們需要捕獲時(shí)間長(zhǎng)度的就是這個(gè)高脈沖的時(shí)間。具體的捕獲過(guò)程應(yīng)該是:

  1. 捕獲按下時(shí)的高電平,并記錄此時(shí)的計(jì)數(shù)值;
  2. 記錄高電平期間產(chǎn)生的更新事件的個(gè)數(shù)(也就是計(jì)數(shù)器從0計(jì)數(shù)到重裝載值的循環(huán)次數(shù));
  3. 記錄松手時(shí)的計(jì)數(shù)器的計(jì)數(shù)值,
  4. 計(jì)算時(shí)間:更新事件的次數(shù)X重裝載值+松手時(shí)的計(jì)數(shù)器值-按下時(shí)的計(jì)數(shù)器值

嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

舉個(gè)栗子:假設(shè)定時(shí)器的分頻系數(shù)是84分頻,每秒會(huì)計(jì)數(shù)84M/84=1 000 000次,重裝載數(shù)是1000;也就是每1ms計(jì)數(shù)1000次,每一次計(jì)數(shù)時(shí)間等于1us;
此時(shí)按鍵按下時(shí)對(duì)應(yīng)的計(jì)數(shù)值是800,從按下按鍵到松手期間一共產(chǎn)生了6個(gè)更新事件,松手時(shí)的計(jì)數(shù)值為400;則此次按鍵按下的時(shí)間為:
TIME = 6*1000+400-800=5600us=5.6ms

配置流程

分析清楚了捕獲過(guò)程后,我們來(lái)看看具體的配置流程,由于定時(shí)器是片上外設(shè),捕獲按鍵按下時(shí)常需要有GPIO的參與,所以對(duì)應(yīng)的GPIO需要配置為復(fù)用模式。前面提到過(guò),通用定時(shí)器至少都有兩個(gè)通道,怎么知道KEY_UP具體的定時(shí)器和通道是哪個(gè)呢,這就有需要使用到引腳復(fù)用表了。通過(guò)查詢(xún)?cè)韴D,或者根據(jù)經(jīng)驗(yàn),KEY_UP的引腳應(yīng)該是GPIOA0;在引腳復(fù)用表中可以看出它對(duì)應(yīng)的是TIM5的CH1。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

打開(kāi)對(duì)應(yīng)的時(shí)鐘

根據(jù)以前的配置經(jīng)驗(yàn),第一步應(yīng)該打開(kāi)對(duì)應(yīng)的片上外設(shè)的時(shí)鐘,GPIOA的對(duì)應(yīng)的時(shí)鐘線(xiàn)是AHB1;TIM5對(duì)應(yīng)的時(shí)鐘線(xiàn)是APB1,然后到對(duì)應(yīng)的編程手冊(cè)找到對(duì)應(yīng)位,寫(xiě)入1即可,具體的配置請(qǐng)看后面的代碼。

配置GPIO為復(fù)用模式

打開(kāi)時(shí)鐘后,就需要將GPIOA的0號(hào)管腳配置為復(fù)用模式,且要對(duì)照復(fù)用表映射到對(duì)應(yīng)的功能,TIM5的CH1,GPIOA0對(duì)應(yīng)的應(yīng)該是低位的復(fù)用功能寄存器的0-3四位,寫(xiě)入AF2對(duì)應(yīng)的0010即可配置為復(fù)用TIM5的通道1。

定時(shí)器的時(shí)基部分配置

緊接著就是定時(shí)器的時(shí)基部分了,這個(gè)也是很熟悉的了,前面配置過(guò)多次,需要配置CR1、SMCR、預(yù)分頻和重裝載而且還需要手動(dòng)操作EGR產(chǎn)生一次更新事件,讓數(shù)據(jù)寫(xiě)入影子寄存器已生效。

定時(shí)器輸入通道部分配置

再這后就是輸入通道的配置了,具體的配置流程參考上面的框圖流程,主要配置CCMR1、CCER。

定時(shí)器中斷配置

這需要使用到兩個(gè)中斷,一個(gè)是更新事件的中斷,用來(lái)記錄脈沖的期間內(nèi)的更新事件個(gè)數(shù),還有一個(gè)是捕獲中斷,利用捕獲中斷來(lái)獲取對(duì)應(yīng)邊沿的計(jì)數(shù)器值。
再就是中斷源使能,優(yōu)先級(jí)配置,最后的最后,一定不要忘記使能計(jì)數(shù)器。

代碼:

/*******************************
函數(shù)名:Time5_Interrupt
函數(shù)功能:Time5_上升沿捕獲
函數(shù)形參:u32 arr   u16 psc預(yù)分頻系數(shù)
函數(shù)返回值:void
備注:
預(yù)分頻系數(shù)  重裝載值
********************************/
void Time5_Capture(u16 psc, u32 arr)
{
/*-----------開(kāi)始時(shí)鐘使能-----------------------------------------------------------------*/
	RCC->AHB1ENR |=(1<<0);//開(kāi)啟GPIOA對(duì)應(yīng)的時(shí)鐘
	RCC->APB1ENR |=(1<<3);//開(kāi)啟TIM5對(duì)應(yīng)的時(shí)鐘
/*-----------初始化GPIO-----------------------------------------------------------------*/
	GPIOA->MODER &=~(3<<0);
	GPIOA->MODER |=(1<<1);//GPIOA為復(fù)用模式
	
	GPIOA->AFR[0] &=~(0xf<<0);
	GPIOA->AFR[0] |=(0X2<<0);//GPIOA復(fù)用為T(mén)IM5
/*-----------時(shí)基配置-----------------------------------------------------------------*/
	TIM5->CR1 &=~(0Xf<<1);	//更新禁止,更新請(qǐng)求源,關(guān)閉單脈沖,向上計(jì)數(shù)
	TIM5->CR1 |=(1<<7);     //重裝載影子寄存器
	TIM5->CR1 &=~(3<<8);    //不分頻
//	TIM5->CR1 |=(2<<8);			//四分頻
	
	TIM5->SMCR &=~(7<<0);   //選擇內(nèi)部時(shí)鐘
	TIM5->PSC = psc-1;			//預(yù)分頻值
	TIM5->ARR = arr-1;      //重裝載值
	TIM5->EGR |= (1<<0);//更新事件,寫(xiě)入預(yù)分頻和重裝載值
/*-----------定時(shí)器輸入部分-----------------------------------------------------------------*/	
	TIM5->CCMR1 &=~(0X3<<0);//
	TIM5->CCMR1 |=(1<<0);//模式選擇輸入 TI1線(xiàn)
	TIM5->CCMR1 &=~(3<<2);//輸入捕獲無(wú)預(yù)分頻
	TIM5->CCMR1 &=~(0XF<<4);
	TIM5->CCMR1 |=(0xf<<4);//采樣頻率為最低1111
	TIM5->CCER &=~(1<<1);//上升沿觸發(fā)
	TIM5->CCER &=~(1<<3);//上升沿觸發(fā)
	TIM5->CCER |=(1<<0);//捕獲使能
/*-----------中斷配置-----------------------------------------------------------------*/	
	TIM5->DIER |=(1<<0);//更新中斷使能
	TIM5->DIER |=(1<<1);//捕獲中斷使能
	
/*-----------NVIC配置-----------------------------------------------------------------*/				
	u32 pri=NVIC_EncodePriority(7-2,2,3);
	NVIC_SetPriority(TIM5_IRQn,pri);
	NVIC_EnableIRQ(TIM5_IRQn);
	
	TIM5->CR1 |=(1<<0);//使能計(jì)數(shù)器
}

實(shí)現(xiàn)功能的中斷服務(wù)函數(shù):



/*******************************
函數(shù)名:TIM5_IRQHandler
函數(shù)功能:定時(shí)器5中斷服務(wù)函數(shù)函數(shù)
函數(shù)形參:無(wú)
函數(shù)返回值:void
備注:
********************************/
void TIM5_IRQHandler(void)
{
	static u32 cnt;
	static u32 cnt_data;
	static u32 timer=0;
	if(TIM5->SR & (1<<0))//更新中斷
	{
		TIM5->SR &=~(1<<0);
		cnt++;//更新中斷的次數(shù)
	}
	if(TIM5->SR &(1<<1))//捕獲中斷
	{
		TIM5->SR &=~(1<<1);
		if(!(TIM5->CCER&(1<<1)))
		{
			cnt=0;//讓更新中斷的次數(shù)清零
			cnt_data = TIM5->CCR1;//獲取當(dāng)前值
			TIM5->CCER |=(1<<1);//下降升沿觸發(fā)
		}
		else if(TIM5->CCER & (1<<1))
		{
			timer =cnt*1000-cnt_data+TIM5->CCR1;
			if(timer/1000>30)//將抖動(dòng)的誤觸發(fā)舍棄
			{
				printf("按鍵按下時(shí)間為%d\r\n",timer/1000);//單位是MS
			}
			TIM5->CCER &=~(1<<1);//上降升沿觸發(fā)
		}
	}
} 

運(yùn)行效果:

嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

需求2

利用HC-SR04實(shí)現(xiàn)超聲波測(cè)距。
需求分析:
這里使用到了超聲波模塊,首先一定要看看他對(duì)應(yīng)的手冊(cè),如下圖,簡(jiǎn)介里面我們需要注意的描述,一個(gè)是測(cè)量周期,最低最低50ms,也就是說(shuō),采集一次后最低要給它50ms的休息時(shí)間才可以開(kāi)始下一次采集,然后就是說(shuō)它支持UART、IIC、單總線(xiàn)的協(xié)議,但是需要修改對(duì)應(yīng)的電阻,這里我們不改,就用它最原始的通信方式。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

測(cè)試時(shí)序圖

在手冊(cè)的后面有一個(gè)GPIO模式的時(shí)序圖,這里就告訴了我們測(cè)距流程,中間紅色框的那一條線(xiàn)是模塊內(nèi)部的,不需要我們操作,也就是說(shuō),要驅(qū)動(dòng)這個(gè)模塊,我們需要使用到的就是兩個(gè)腳一個(gè)觸發(fā)信號(hào)一個(gè)輸出響應(yīng)信號(hào)。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
注意距離的計(jì)算是根據(jù)模塊輸出的高電平脈沖信號(hào)的時(shí)間T來(lái)計(jì)算的,說(shuō)白了就是采集超聲波模塊輸出的高電平時(shí)間,利用這個(gè)時(shí)間與音速的關(guān)系就可計(jì)算出對(duì)應(yīng)的距離。高電平時(shí)間的采集與上一個(gè)需求中的按鍵按下時(shí)間是一樣的。
只是在這個(gè)模塊需要我們提供一個(gè)觸發(fā)信號(hào)后才會(huì)輸出對(duì)應(yīng)的脈沖,剛剛的按鍵是按下就會(huì)有對(duì)應(yīng)的脈沖。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

選擇GPIO

這個(gè)模塊由于是外接,所以可以由我們自己選擇管腳來(lái)實(shí)現(xiàn),其中需要一個(gè)GPIO配置為通用推挽輸出為T(mén)rlg提供觸發(fā)信號(hào);還需要一個(gè)具有定時(shí)器捕獲通道GPIO來(lái)采集超聲波模塊Echo脈沖輸出腳的脈沖持續(xù)的時(shí)間。
還是打開(kāi)引腳復(fù)用表進(jìn)行查詢(xún),
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
這里筆者選用了PD12作為輸入捕獲,為了方便,選擇了PD13作為脈沖觸發(fā)信號(hào)。
具體的配置代碼如下:

#include "Ultrasonic.h"
/*******************************************
*函數(shù)名    :Ult_Init
*函數(shù)功能  :超聲波初始化函數(shù)
*函數(shù)參數(shù)  :void 
*函數(shù)返回值:無(wú)
*函數(shù)描述  :
PD12-------檢測(cè)電平時(shí)間
PD13-------發(fā)送起始信號(hào)通用模式
*********************************************/
void Ult_Init(void)
{
	Time4_Capture(84,1000);//定時(shí)器4的輸入捕獲(用于超聲波檢測(cè))
	
	GPIOD->MODER &=~(3<<26);
	GPIOD->MODER |=(1<<26);//GPIOD13為通用模式
	
	/*端口輸出推挽模式*/
	GPIOD->OTYPER &= ~(1<<13);
	/*端口輸出速度2MHz*/
	GPIOD->OSPEEDR &= ~(1<<26);//清零OSPEEDR
	GPIOD->PUPDR   &= ~(1<<26);//默認(rèn)無(wú)上下拉
	/* 端口輸出寄存器*/
	GPIOD->ODR &=~(1<<13);//置零拉低
}

/*******************************
函數(shù)名:Time4_Interrupt
函數(shù)功能:Time4_上升沿捕獲
函數(shù)形參:u16 arr   u16 psc預(yù)分頻系數(shù)
函數(shù)返回值:void
備注:
預(yù)分頻系數(shù)  重裝載值
********************************/
void Time4_Capture(u16 psc, u16 arr)
{
/*-----------開(kāi)始時(shí)鐘使能-----------------------------------------------------------------*/
	RCC->AHB1ENR |=(1<<3);//開(kāi)啟GPIOD對(duì)應(yīng)的時(shí)鐘
	RCC->APB1ENR |=(1<<2);//開(kāi)啟TIM4對(duì)應(yīng)的時(shí)鐘
/*-----------初始化GPIO-----------------------------------------------------------------*/
	
	GPIOD->MODER &=~(3<<24);
	GPIOD->MODER |=(1<<25);//GPIOD12為復(fù)用模式
	
	GPIOD->AFR[1] &=~(0xf<<16);
	GPIOD->AFR[1] |=(0X2<<16);//GPIOD12復(fù)用為T(mén)IM4
	
/*-----------時(shí)基配置-----------------------------------------------------------------*/
	TIM4->CR1 &=~(0Xf<<1);	//更新禁止,更新請(qǐng)求源,關(guān)閉單脈沖,向上計(jì)數(shù)
	TIM4->CR1 |=(1<<7);     //重裝載影子寄存器
	TIM4->CR1 &=~(3<<8);    //不分頻
//	TIM5->CR1 |=(2<<8);			//四分頻
	
	TIM4->SMCR &=~(7<<0);   //選擇內(nèi)部時(shí)鐘
	TIM4->PSC = psc-1;			//預(yù)分頻值
	TIM4->ARR = arr-1;      //重裝載值
	TIM4->EGR |= (1<<0);//更新事件,寫(xiě)入預(yù)分頻和重裝載值
/*-----------定時(shí)器輸入部分-----------------------------------------------------------------*/	
	TIM4->CCMR1 &=~(0X3<<0);//
	TIM4->CCMR1 |=(1<<0);//模式選擇輸入 TI1線(xiàn)
	TIM4->CCMR1 &=~(3<<2);//輸入捕獲無(wú)預(yù)分頻
	TIM4->CCMR1 &=~(0XF<<4);
	TIM4->CCMR1 |=(0xf<<4);//采樣頻率為最低1111  84 000 000/32/8
	TIM4->CCER &=~ (1<<1);//上升沿觸發(fā)
	TIM4->CCER &=~ (1<<3);//上升沿觸發(fā)
	TIM4->CCER |=(1<<0);//捕獲使能
/*-----------中斷配置-----------------------------------------------------------------*/	
	TIM4->DIER |=(1<<0);//更新中斷使能
	TIM4->DIER |=(1<<1);//捕獲中斷使能
	
/*-----------NVIC配置-----------------------------------------------------------------*/				
	u32 pri=NVIC_EncodePriority(7-2,2,3);
	NVIC_SetPriority(TIM4_IRQn,pri);
	NVIC_EnableIRQ(TIM4_IRQn);
	
	TIM4->CR1 |=(1<<0);//使能計(jì)數(shù)器
}

//頭文件
#ifndef _ULTRASONIC_H
#define _ULTRASONIC_H
#include "stm32f4xx.h"
#define TRIG_OFF GPIOD->ODR &=~(1<<13);//置零拉低對(duì)應(yīng)端口
#define TRIG_ON GPIOD->ODR |= (1<<13);//置1拉高對(duì)應(yīng)端口
void Ult_Init(void);
void Time4_Capture(u16 psc, u16 arr);

#endif

主函數(shù)中產(chǎn)生觸發(fā)信號(hào):每隔50ms產(chǎn)生一次觸發(fā)信號(hào)。
嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
中斷服務(wù)函數(shù)實(shí)現(xiàn)功能:

/*******************************
函數(shù)名:TIM4_IRQHandler
函數(shù)功能:定時(shí)器4中斷服務(wù)函數(shù)函數(shù)
函數(shù)形參:無(wú)
函數(shù)返回值:void
備注:
********************************/
void TIM4_IRQHandler(void)
{
	static u32 cnt;
	static u32 cnt_data;
	static float timer=0;
	if(TIM4->SR & (1<<0))//更新中斷
	{
		TIM4->SR &=~(1<<0);
		cnt++;//更新中斷的次數(shù)
	}
	if(TIM4->SR &(1<<1))//捕獲中斷
	{
		TIM4->SR &=~(1<<1);
		if(!(TIM4->CCER&(1<<1)))
		{
			cnt=0;//讓更新中斷的次數(shù)清零
			cnt_data = TIM4->CCR1;//獲取當(dāng)前值
			TIM4->CCER |=(1<<1);//下降沿觸發(fā)
		}
		else if(TIM4->CCER & (1<<1))
		{
			timer =cnt*1000-cnt_data+TIM4->CCR1;
			printf("物體的距離為:%.2fcm\r\n",timer/58.0f);
			TIM4->CCER &=~(1<<1);//上升沿觸發(fā)
		}
	}
}

實(shí)現(xiàn)效果:

嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)

總結(jié)

關(guān)于定時(shí)器輸入捕獲與輸出比較的介紹就記錄到這,從這開(kāi)始,配置都會(huì)比之前的復(fù)雜,寫(xiě)起來(lái)也會(huì)比較麻煩,所以更新速度會(huì)變慢,大家諒解,然后就是文中如有不足歡迎批評(píng)指正。

M4系列目錄

1.嵌入式學(xué)習(xí)筆記——概述
2.嵌入式學(xué)習(xí)筆記——基于Cortex-M的單片機(jī)介紹
3.嵌入式學(xué)習(xí)筆記——STM32單片機(jī)開(kāi)發(fā)前的準(zhǔn)備
4.嵌入式學(xué)習(xí)筆記——STM32硬件基礎(chǔ)知識(shí)
5.嵌入式學(xué)習(xí)筆記——認(rèn)識(shí)STM32的 GPIO口
6.嵌入式學(xué)習(xí)筆記——使用寄存器編程操作GPIO
7.嵌入式學(xué)習(xí)筆記——寄存器實(shí)現(xiàn)控制LED小燈
8.嵌入式學(xué)習(xí)筆記——使用寄存器編程實(shí)現(xiàn)按鍵輸入功能
9.嵌入式學(xué)習(xí)筆記——STM32的USART通信概述
10.嵌入式學(xué)習(xí)筆記——STM32的USART相關(guān)寄存器介紹及其配置
11.嵌入式學(xué)習(xí)筆記——STM32的USART收發(fā)字符串及串口中斷
12.嵌入式學(xué)習(xí)筆記——STM32的中斷控制體系
13.嵌入式學(xué)習(xí)筆記——STM32寄存器編程實(shí)現(xiàn)外部中斷
14.嵌入式學(xué)習(xí)筆記——STM32的時(shí)鐘樹(shù)
15.嵌入式學(xué)習(xí)筆記——SysTick(系統(tǒng)滴答)
16.嵌入式學(xué)習(xí)筆記——M4的基本定時(shí)器
17.嵌入式學(xué)習(xí)筆記——通用定時(shí)器
18.嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(上)
19.嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
20.嵌入式學(xué)習(xí)筆記——ADC模數(shù)轉(zhuǎn)換器
21.嵌入式學(xué)習(xí)筆記——DMA
22.嵌入式學(xué)習(xí)筆記——SPI通信
23.嵌入式學(xué)習(xí)筆記——SPI通信的應(yīng)用
24嵌入式學(xué)習(xí)筆記——IIC通信文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-461232.html

到了這里,關(guān)于嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【嵌入式學(xué)習(xí)筆記】嵌入式入門(mén)2——中斷(外部中斷)

    【嵌入式學(xué)習(xí)筆記】嵌入式入門(mén)2——中斷(外部中斷)

    打斷CPU執(zhí)行正常的程序,轉(zhuǎn)而處理緊急程序,然后返回原暫停的程序繼續(xù)運(yùn)行,就叫中斷 作用1: 實(shí)時(shí)控制在確定時(shí)間內(nèi)對(duì)相應(yīng)事件作出響應(yīng) ——定時(shí)器中斷 作用2: 故障處理檢測(cè)到故障,需要第一時(shí)間處理 ——外部中斷 作用3: 數(shù)據(jù)傳輸不確定數(shù)據(jù)何時(shí)會(huì)來(lái) ——串口中斷

    2024年02月08日
    瀏覽(66)
  • 嵌入式PWM實(shí)驗(yàn)報(bào)告

    嵌入式PWM實(shí)驗(yàn)報(bào)告

    實(shí)驗(yàn)報(bào)告書(shū) 一、實(shí)驗(yàn)內(nèi)容與目的 實(shí)驗(yàn)內(nèi)容 : 通過(guò)對(duì) Exynos4412 的 PWM 的操作,控制實(shí)驗(yàn)箱的蜂鳴器實(shí)現(xiàn)發(fā)聲,并播放音樂(lè)。 實(shí)驗(yàn)?zāi)康?: 掌握使用 Cortex-A9 控制 PWM 的方法。 掌握 Cortex-A9 的 PWM 寄存器的配置方法。 掌握驅(qū)動(dòng)的編寫(xiě)步驟。 熟悉 VMware+RedHat+XShell+ARM-Linux 交叉編譯開(kāi)

    2024年02月07日
    瀏覽(25)
  • 【嵌入式學(xué)習(xí)筆記】嵌入式基礎(chǔ)9——STM32啟動(dòng)過(guò)程

    【嵌入式學(xué)習(xí)筆記】嵌入式基礎(chǔ)9——STM32啟動(dòng)過(guò)程

    程序段交叉引用關(guān)系(Section Cross References):描述各文件之間函數(shù)調(diào)用關(guān)系 刪除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被刪除的冗余程序段(函數(shù)/數(shù)據(jù)) 映像符號(hào)表(Image Symbol Table):描述各符號(hào)(程序段/數(shù)據(jù))在存儲(chǔ)器中的地址、類(lèi)

    2024年02月15日
    瀏覽(64)
  • 嵌入式學(xué)習(xí)筆記匯總

    嵌入式學(xué)習(xí)筆記匯總

    本文整理STM32、STM8和uCOS-III的所有文章鏈接。 源碼:mySTM32-learn STM32學(xué)習(xí)筆記(1)——LED和蜂鳴器 STM32學(xué)習(xí)筆記(2)——按鍵輸入實(shí)驗(yàn) STM32學(xué)習(xí)筆記(3)——時(shí)鐘系統(tǒng) STM32學(xué)習(xí)筆記(4)——NVIC中斷優(yōu)先級(jí)管理和外部中斷EXTI STM32學(xué)習(xí)筆記(5)——系統(tǒng)定時(shí)器SysTick STM32學(xué)習(xí)筆

    2023年04月20日
    瀏覽(91)
  • 嵌入式學(xué)習(xí)筆記——IIC通信

    嵌入式學(xué)習(xí)筆記——IIC通信

    本文接著之前的M4系列介紹,對(duì)另外一個(gè)十分常見(jiàn)的通信總線(xiàn)進(jìn)行一個(gè)介紹,就是IIC總線(xiàn)。 首先,還是找個(gè)免費(fèi)勞動(dòng)力來(lái)做一個(gè)官方的介紹,下面這一段話(huà)非常全面的介紹了IIC的各個(gè)特征,用之前提到的通信特征來(lái)總結(jié),IIC是一種串行,同步,半雙工,板級(jí)有線(xiàn)通信。與SPI對(duì)

    2024年02月06日
    瀏覽(92)
  • 嵌入式學(xué)習(xí)筆記——SPI通信

    嵌入式學(xué)習(xí)筆記——SPI通信

    之前已經(jīng)介紹了STM32的ADC、DMA、EXTI、TIME、NVIC、USART以及普通IO模式,此系列筆者還打算寫(xiě)最后三個(gè)大的內(nèi)容,分別是SPI通信、IIC通信以及看門(mén)狗,后面就看大家的需求了,需要什么可以留在評(píng)論區(qū),本文首先來(lái)介紹SPI的有關(guān)知識(shí)。 在通信協(xié)議分類(lèi)的介紹中,提到過(guò)SPI,它是一

    2023年04月09日
    瀏覽(30)
  • 嵌入式學(xué)習(xí)筆記——SysTick(系統(tǒng)滴答)

    嵌入式學(xué)習(xí)筆記——SysTick(系統(tǒng)滴答)

    上一篇中,介紹了關(guān)于STM32F407的時(shí)鐘系統(tǒng),在了解了系統(tǒng)的時(shí)鐘后,最重要的內(nèi)容就是搞定定時(shí)器的操作,本文從最基本的定時(shí)器,也是內(nèi)核里面自帶的一個(gè)定時(shí)器——SysTick(系統(tǒng)滴答)來(lái)進(jìn)行介紹。旨在搞清楚什么是系統(tǒng)滴答,系統(tǒng)滴答有什么用,系統(tǒng)滴答怎么用。 SysTick這

    2024年01月21日
    瀏覽(30)
  • 【嵌入式】Thumb指令集(學(xué)習(xí)筆記)

    【嵌入式】Thumb指令集(學(xué)習(xí)筆記)

    ARM開(kāi)發(fā)工具完全支持Thumb指令,應(yīng)用程序可以靈活的將ARM和Thumb子程序混合編程以便在例程的基礎(chǔ)上提高性能或代碼密度。在編寫(xiě)Thumb指令時(shí),先要用偽指令CODE16聲明(ADS的編譯環(huán)境下),而且在ARM指令中要使用BX指令跳轉(zhuǎn)到Thumb指令,以切換處理器狀態(tài)。 Thumb指令集編碼如下:

    2023年04月22日
    瀏覽(25)
  • 【嵌入式算法】學(xué)習(xí)筆記(一):數(shù)字濾波算法

    【嵌入式算法】學(xué)習(xí)筆記(一):數(shù)字濾波算法

    最近在做直流電機(jī)的畢設(shè)中,由于需要采集轉(zhuǎn)速,電流,電壓,溫度等參數(shù),常規(guī)的采集容易受到干擾,所以特意復(fù)習(xí)了一下關(guān)于數(shù)字濾波有關(guān)的知識(shí),并作出相應(yīng)的整理。 本文對(duì)數(shù)字濾波進(jìn)行簡(jiǎn)單介紹,講解七種常用的濾波算法并用C語(yǔ)言實(shí)現(xiàn),并比較其優(yōu)缺點(diǎn) 。由于篇幅

    2023年04月22日
    瀏覽(27)
  • 嵌入式學(xué)習(xí)筆記(17)代碼重定位實(shí)戰(zhàn) 上篇

    嵌入式學(xué)習(xí)筆記(17)代碼重定位實(shí)戰(zhàn) 上篇

    3.5.1任務(wù):在iSRAM中將代碼從0xd0020010重定位到0xd0024000 注解:本練習(xí)對(duì)代碼本身運(yùn)行無(wú)實(shí)際意義,我們做這個(gè)重定位純粹是為了練習(xí)重定位技能。但是某些情況重定位就是必須的,譬如在uboot中。 3.5.2思路 (1)通過(guò)鏈接腳本將代碼鏈接到0xd0024000(鏈接地址) (2)使用dnw下載時(shí)將

    2024年02月09日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包