新聞中心

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

STM32芯片定時(shí)器輸入捕獲模式

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

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

void HC04_Config1(void)//此函數(shù)完成HC04避障模塊接收端的初始化,需要對(duì)定時(shí)器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)用庫(kù)函數(shù),開(kāi)啟了GPIOA的外設(shè)時(shí)鐘,這句代碼的意思應(yīng)該是,開(kāi)啟了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設(shè)置為浮空輸入模式,以此對(duì)應(yīng)通用定時(shí)器TIM2~TIM7的使用,定時(shí)器將捕獲來(lái)自這幾個(gè)管腳的脈沖信號(hào)
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時(shí)鐘設(shè)置為50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);



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

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


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


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


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

}


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

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

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

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

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

GPIO_Init(GPIOA,&GPIO_InitStructure2);
//調(diào)用庫(kù)函數(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ā)信號(hào)

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


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

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


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

HC04_Config1();
return(L);
}


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

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

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

void HC04_Config1(void)//此函數(shù)完成HC04避障模塊接收端的初始化,需要對(duì)定時(shí)器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)用庫(kù)函數(shù),開(kāi)啟了GPIOA的外設(shè)時(shí)鐘,這句代碼的意思應(yīng)該是,開(kāi)啟了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設(shè)置為浮空輸入模式,以此對(duì)應(yīng)通用定時(shí)器TIM2~TIM7的使用,定時(shí)器將捕獲來(lái)自這幾個(gè)管腳的脈沖信號(hào)
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時(shí)鐘設(shè)置為50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);



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

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


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


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


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

}


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

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

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

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

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

GPIO_Init(GPIOA,&GPIO_InitStructure2);
//調(diào)用庫(kù)函數(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ā)信號(hào)

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


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

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


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

HC04_Config1();
return(L);
}


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

HC04_Config1();
return(L);
}


評(píng)論


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

關(guān)閉