新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32芯片定時器輸入捕獲模式

STM32芯片定時器輸入捕獲模式

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
stm32定時器有輸入捕獲模式,PWM輸入模式,強(qiáng)輸出模式,輸出比較模式這幾種。

#include"HC04.h"//這個文件保存了用戶自己編寫的應(yīng)用程序
#include"SysTick.h"
extern uint32_t L;//主函數(shù)中,定義了L這個全局變量,想要在此文件中用到,應(yīng)該進(jìn)行聲明

void HC04_Config1(void)//此函數(shù)完成HC04避障模塊接收端的初始化,需要對定時器TIM2進(jìn)行配置
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//調(diào)用庫函數(shù),開啟了GPIOA的外設(shè)時鐘,這句代碼的意思應(yīng)該是,開啟了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設(shè)置為浮空輸入模式,以此對應(yīng)通用定時器TIM2~TIM7的使用,定時器將捕獲來自這幾個管腳的脈沖信號
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時鐘設(shè)置為50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);



RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開定時器TIM2的時鐘
TIM_DeInit(TIM2);//復(fù)位TIM2定時器

TIM_TimeBaseStructure1.TIM_Period =0xFFFF;//設(shè)置計(jì)數(shù)溢出大小,每計(jì)65536個數(shù)就產(chǎn)生一個更新事件,此處的參數(shù)還得再改(TIM_Period設(shè)置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間)
TIM_TimeBaseStructure1.TIM_Prescaler =1-1;//預(yù)分頻系數(shù)為1,這樣計(jì)數(shù)器時鐘為72MHz/1 = 72MHz
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_DIV1;//TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;//TIM_CounterMode選擇了計(jì)數(shù)器模式。有TIM_CounterMode_Up(TIM向上計(jì)數(shù)模式)TIM_CounterMode_Down(TIM向下計(jì)數(shù)模式)TIM_CounterMode_CenterAligned1(TIM中央對齊模式1計(jì)數(shù)模式),TIM_CounterMode_CenterAligned2(TIM中央對齊模式2計(jì)數(shù)模式),IM_CounterMode_CenterAligned3(TIM中央對齊模式3計(jì)數(shù)模式)
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);//本段代碼配置了定時器的時基


TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;//選擇定時器TIM2的通道1,有四個通道可以選擇,TI1選擇意味著也選擇了TI2,因?yàn)閮烧呤墙M合在一起的
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿觸發(fā),還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發(fā),則IC2就為下降沿觸發(fā),因?yàn)閮烧哂|發(fā)極性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection選擇輸入;TIM_ICSelection_DirectTI:TIM輸入2,3或4選擇對應(yīng)的IC1或IC2或IC3或IC4相連;TIM_ICSelection_IndirectTI:TIM輸入2,3或4選的對應(yīng)與IC2或IC1或IC4或IC3相連;TIM_ICSelection_TRC:TIM輸入2,3或3選擇與TRC相連
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_DIV1;//輸入預(yù)分頻,意思是控制在多少個輸入周期做一個捕獲,如果輸入的信號頻率沒有變,測得的周期也不會變,比如選擇四分頻,則每四個輸入周期做一次捕獲,這樣在輸入信號不頻繁的情況下,可以減少軟件被不斷中斷的次TIM_ICPrescaler TIM_ICPSC_DIV1(TIM捕獲在捕獲輸入行每探測到一個邊沿執(zhí)行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執(zhí)行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執(zhí)行一次)
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發(fā)源,選擇有效的觸發(fā)輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復(fù)位模式,這樣TI1捕獲到上升沿和計(jì)數(shù)值m之后計(jì)數(shù)器開始從0計(jì)數(shù)(配置從模式控制器模式)
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發(fā),使能捕獲模式(配置主從模式控制器模式)
//以上配置讓定時器處于PWM輸入狀態(tài)下工作
TIM_ClearFlag(TIM2, TIM_IT_CC2);//清除定時器的溢出標(biāo)志,表示定時器計(jì)數(shù)從0開始
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//開啟了定時器TIM2的中斷
TIM_Cmd(TIM2, ENABLE);//打開TIM2定時器


NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0為最高的優(yōu)先級
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進(jìn)行優(yōu)先級的配置
//這個函數(shù)中,加粗的代碼對定時器TIM2進(jìn)行了一次完整的配置

}


void HC04_Config2(void)//此函數(shù)完成HC04避障模塊觸發(fā)端的初始化
{
GPIO_InitTypeDef GPIO_InitStructure2;
//調(diào)用庫函數(shù),定義了一個結(jié)構(gòu)體類型為GPIO_InitTypeDef的結(jié)構(gòu)體,名為GPIO_InitStructure2

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//調(diào)用庫函數(shù),開啟了GPIOA的外設(shè)時鐘,這句代碼的意思應(yīng)該是,開啟了GPIOA的使用

GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
//開啟了GPIOA管腳的pin4,pin5,pin6,pin7

GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
//將選擇的管腳設(shè)置為推挽輸出模式,此模式一般接邏輯器件

GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
//將引腳的時鐘設(shè)置為50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure2);
//調(diào)用庫函數(shù)GPIO_Init(),初始化GPIOA,關(guān)鍵利用GPIO_InitStructure中的參數(shù)進(jìn)行初始化

GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
//調(diào)用GPIO_ResetBits()的話,是將端口設(shè)置為低電平
}

void HC04_Config(void)
{
HC04_Config2();
}


uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}//讓生命探測裝置上的避障模塊HC04測量長度


uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}//讓前方的避障模塊測量長度


uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}


uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}stm32定時器有輸入捕獲模式,PWM輸入模式,強(qiáng)輸出模式,輸出比較模式這幾種。

#include"HC04.h"//這個文件保存了用戶自己編寫的應(yīng)用程序
#include"SysTick.h"
extern uint32_t L;//主函數(shù)中,定義了L這個全局變量,想要在此文件中用到,應(yīng)該進(jìn)行聲明

void HC04_Config1(void)//此函數(shù)完成HC04避障模塊接收端的初始化,需要對定時器TIM2進(jìn)行配置
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//調(diào)用庫函數(shù),開啟了GPIOA的外設(shè)時鐘,這句代碼的意思應(yīng)該是,開啟了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設(shè)置為浮空輸入模式,以此對應(yīng)通用定時器TIM2~TIM7的使用,定時器將捕獲來自這幾個管腳的脈沖信號
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時鐘設(shè)置為50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);



RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開定時器TIM2的時鐘
TIM_DeInit(TIM2);//復(fù)位TIM2定時器

TIM_TimeBaseStructure1.TIM_Period =0xFFFF;//設(shè)置計(jì)數(shù)溢出大小,每計(jì)65536個數(shù)就產(chǎn)生一個更新事件,此處的參數(shù)還得再改(TIM_Period設(shè)置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間)
TIM_TimeBaseStructure1.TIM_Prescaler =1-1;//預(yù)分頻系數(shù)為1,這樣計(jì)數(shù)器時鐘為72MHz/1 = 72MHz
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_DIV1;//TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;//TIM_CounterMode選擇了計(jì)數(shù)器模式。有TIM_CounterMode_Up(TIM向上計(jì)數(shù)模式)TIM_CounterMode_Down(TIM向下計(jì)數(shù)模式)TIM_CounterMode_CenterAligned1(TIM中央對齊模式1計(jì)數(shù)模式),TIM_CounterMode_CenterAligned2(TIM中央對齊模式2計(jì)數(shù)模式),IM_CounterMode_CenterAligned3(TIM中央對齊模式3計(jì)數(shù)模式)
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);//本段代碼配置了定時器的時基


TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;//選擇定時器TIM2的通道1,有四個通道可以選擇,TI1選擇意味著也選擇了TI2,因?yàn)閮烧呤墙M合在一起的
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿觸發(fā),還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發(fā),則IC2就為下降沿觸發(fā),因?yàn)閮烧哂|發(fā)極性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection選擇輸入;TIM_ICSelection_DirectTI:TIM輸入2,3或4選擇對應(yīng)的IC1或IC2或IC3或IC4相連;TIM_ICSelection_IndirectTI:TIM輸入2,3或4選的對應(yīng)與IC2或IC1或IC4或IC3相連;TIM_ICSelection_TRC:TIM輸入2,3或3選擇與TRC相連
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_DIV1;//輸入預(yù)分頻,意思是控制在多少個輸入周期做一個捕獲,如果輸入的信號頻率沒有變,測得的周期也不會變,比如選擇四分頻,則每四個輸入周期做一次捕獲,這樣在輸入信號不頻繁的情況下,可以減少軟件被不斷中斷的次TIM_ICPrescaler TIM_ICPSC_DIV1(TIM捕獲在捕獲輸入行每探測到一個邊沿執(zhí)行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執(zhí)行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執(zhí)行一次)
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發(fā)源,選擇有效的觸發(fā)輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復(fù)位模式,這樣TI1捕獲到上升沿和計(jì)數(shù)值m之后計(jì)數(shù)器開始從0計(jì)數(shù)(配置從模式控制器模式)
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發(fā),使能捕獲模式(配置主從模式控制器模式)
//以上配置讓定時器處于PWM輸入狀態(tài)下工作
TIM_ClearFlag(TIM2, TIM_IT_CC2);//清除定時器的溢出標(biāo)志,表示定時器計(jì)數(shù)從0開始
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//開啟了定時器TIM2的中斷
TIM_Cmd(TIM2, ENABLE);//打開TIM2定時器


NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0為最高的優(yōu)先級
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進(jìn)行優(yōu)先級的配置
//這個函數(shù)中,加粗的代碼對定時器TIM2進(jìn)行了一次完整的配置

}


void HC04_Config2(void)//此函數(shù)完成HC04避障模塊觸發(fā)端的初始化
{
GPIO_InitTypeDef GPIO_InitStructure2;
//調(diào)用庫函數(shù),定義了一個結(jié)構(gòu)體類型為GPIO_InitTypeDef的結(jié)構(gòu)體,名為GPIO_InitStructure2

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//調(diào)用庫函數(shù),開啟了GPIOA的外設(shè)時鐘,這句代碼的意思應(yīng)該是,開啟了GPIOA的使用

GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
//開啟了GPIOA管腳的pin4,pin5,pin6,pin7

GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
//將選擇的管腳設(shè)置為推挽輸出模式,此模式一般接邏輯器件

GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
//將引腳的時鐘設(shè)置為50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure2);
//調(diào)用庫函數(shù)GPIO_Init(),初始化GPIOA,關(guān)鍵利用GPIO_InitStructure中的參數(shù)進(jìn)行初始化

GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
//調(diào)用GPIO_ResetBits()的話,是將端口設(shè)置為低電平
}

void HC04_Config(void)
{
HC04_Config2();
}


uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}//讓生命探測裝置上的避障模塊HC04測量長度


uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}//讓前方的避障模塊測量長度


uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}


uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3);//生成20us的脈沖寬度的觸發(fā)信號

HC04_Config1();
return(L);
}


評論


技術(shù)專區(qū)

關(guān)閉