STM32芯片定时器输入捕获模式
时间:11-28
来源:互联网
点击:
stm32定时器有输入捕获模式,PWM输入模式,强输出模式,输出比较模式这几种。
#include"HC04.h" //这个文件保存了用户自己编写的应用程序
#include"SysTick.h"
extern uint32_t L; //主函数中,定义了L这个全局变量,想要在此文件中用到,应该进行声明
void HC04_Config1(void) //此函数完成HC04避障模块接收端的初始化,需要对定时器TIM2进行配置
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING; //将管脚设置为浮空输入模式,以此对应通用定时器TIM2~TIM7的使用,定时器将捕获来自这几个管脚的脉冲信号
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz; //将引脚的时钟设置为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开定时器TIM2的时钟
TIM_DeInit(TIM2); //复位TIM2定时器
TIM_TimeBaseStructure1.TIM_Period =0xFFFF; //设置计数溢出大小,每计65536个数就产生一个更新事件,此处的参数还得再改(TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间)
TIM_TimeBaseStructure1.TIM_Prescaler =1-1; //预分频系数为1,这样计数器时钟为72MHz/1 = 72MHz
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_div1; //TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up; //TIM_CounterMode选择了计数器模式。有TIM_CounterMode_Up(TIM向上计数模式)TIM_CounterMode_Down(TIM向下计数模式)TIM_CounterMode_CenterAligned1(TIM中央对齐模式1计数模式),TIM_CounterMode_CenterAligned2(TIM中央对齐模式2计数模式),IM_CounterMode_CenterAligned3(TIM中央对齐模式3计数模式)
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1); //本段代码配置了定时器的时基
TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1; //选择定时器TIM2的通道1,有四个通道可以选择,TI1选择意味着也选择了TI2,因为两者是组合在一起的
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发,还有TIM_ICPolarity(输入活动沿),TIM_ICPolarity_Falling输入捕获下降沿可以选择 ;一旦IC1为上升沿触发,则IC2就为下降沿触发,因为两者触发极性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection选择输入;TIM_ICSelection_DirectTI:TIM输入2,3或4选择对应的IC1或IC2或IC3或IC4相连;TIM_ICSelection_IndirectTI:TIM输入2,3或4选的对应与IC2或IC1或IC4或IC3相连;TIM_ICSelection_TRC:TIM输入2,3或3选择与TRC相连
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_div1; //输入预分频,意思是控制在多少个输入周期做一个捕获,如果输入的信号频率没有变,测得的周期也不会变,比如选择四分频,则每四个输入周期做一次捕获,这样在输入信号不频繁的情况下,可以减少软件被不断中断的次 TIM_ICPrescaler TIM_ICPSC_div1(TIM捕获在捕获输入行每探测到一个边沿执行一次)TIM_ICPS_div2(TIM捕获每2个事件执行一次)TIM_ICPS_div3TIM(捕获每3个事件执行一次)
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1); //本段代码配置了定时器通道的工作方式
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //选择时钟触发源,选择有效的触发输入信号TI1FP1,之前选择通道1,自然选择TI1FP1;还有TI1FP2,TI2FP1,TI2FP2可以选择
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //配置从模式控制器为复位模式,这样TI1捕获到上升沿和计数值m之后计数器开始从0计数(配置从模式控制器模式)
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发,使能捕获模式(配置主从模式控制器模式)
//以上配置让定时器处于PWM输入状态下工作
TIM_ClearFlag(TIM2, TIM_IT_CC2); //清除定时器的溢出标志,表示定时器计数从0开始
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //开启了定时器TIM2的中断
TIM_Cmd(TIM2, ENABLE); //打开TIM2定时器
NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPrio rity = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0为最高的优先级
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2); //NVIC配置,对定时器TIM2的中断进行优先级的配置
//这个函数中,加粗的代码对定时器TIM2进行了一次完整的配置
}
void HC04_Config2(void) //此函数完成HC04避障模块触发端的初始化
{
GPIO_InitTypeDef GPIO_InitStructure2;
//调用库函数,定义了一个结构体类型为GPIO_InitTypeDef的结构体,名为GPIO_InitStructure2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了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;
//将选择的管脚设置为推挽输出模式,此模式一般接逻辑器件
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
//将引脚的时钟设置为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure2);
//调用库函数GPIO_Init(),初始化GPIOA,关键利用GPIO_InitStructure中的参数进行初始化
GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
//调用GPIO_ResetBits()的话,是将端口设置为低电平
}
void HC04_Config(void)
{
HC04_Config2();
}
uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
} //让生命探测装置上的避障模块HC04测量长度
uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
} //让前方的避障模块测量长度
uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
}
uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
} stm32定时器有输入捕获模式,PWM输入模式,强输出模式,输出比较模式这几种。
#include"HC04.h" //这个文件保存了用户自己编写的应用程序
#include"SysTick.h"
extern uint32_t L; //主函数中,定义了L这个全局变量,想要在此文件中用到,应该进行声明
void HC04_Config1(void) //此函数完成HC04避障模块接收端的初始化,需要对定时器TIM2进行配置
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING; //将管脚设置为浮空输入模式,以此对应通用定时器TIM2~TIM7的使用,定时器将捕获来自这几个管脚的脉冲信号
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz; //将引脚的时钟设置为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开定时器TIM2的时钟
TIM_DeInit(TIM2); //复位TIM2定时器
TIM_TimeBaseStructure1.TIM_Period =0xFFFF; //设置计数溢出大小,每计65536个数就产生一个更新事件,此处的参数还得再改(TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间)
TIM_TimeBaseStructure1.TIM_Prescaler =1-1; //预分频系数为1,这样计数器时钟为72MHz/1 = 72MHz
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_div1; //TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up; //TIM_CounterMode选择了计数器模式。有TIM_CounterMode_Up(TIM向上计数模式)TIM_CounterMode_Down(TIM向下计数模式)TIM_CounterMode_CenterAligned1(TIM中央对齐模式1计数模式),TIM_CounterMode_CenterAligned2(TIM中央对齐模式2计数模式),IM_CounterMode_CenterAligned3(TIM中央对齐模式3计数模式)
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1); //本段代码配置了定时器的时基
TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1; //选择定时器TIM2的通道1,有四个通道可以选择,TI1选择意味着也选择了TI2,因为两者是组合在一起的
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发,还有TIM_ICPolarity(输入活动沿),TIM_ICPolarity_Falling输入捕获下降沿可以选择 ;一旦IC1为上升沿触发,则IC2就为下降沿触发,因为两者触发极性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection选择输入;TIM_ICSelection_DirectTI:TIM输入2,3或4选择对应的IC1或IC2或IC3或IC4相连;TIM_ICSelection_IndirectTI:TIM输入2,3或4选的对应与IC2或IC1或IC4或IC3相连;TIM_ICSelection_TRC:TIM输入2,3或3选择与TRC相连
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_div1; //输入预分频,意思是控制在多少个输入周期做一个捕获,如果输入的信号频率没有变,测得的周期也不会变,比如选择四分频,则每四个输入周期做一次捕获,这样在输入信号不频繁的情况下,可以减少软件被不断中断的次 TIM_ICPrescaler TIM_ICPSC_div1(TIM捕获在捕获输入行每探测到一个边沿执行一次)TIM_ICPS_div2(TIM捕获每2个事件执行一次)TIM_ICPS_div3TIM(捕获每3个事件执行一次)
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1); //本段代码配置了定时器通道的工作方式
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //选择时钟触发源,选择有效的触发输入信号TI1FP1,之前选择通道1,自然选择TI1FP1;还有TI1FP2,TI2FP1,TI2FP2可以选择
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //配置从模式控制器为复位模式,这样TI1捕获到上升沿和计数值m之后计数器开始从0计数(配置从模式控制器模式)
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发,使能捕获模式(配置主从模式控制器模式)
//以上配置让定时器处于PWM输入状态下工作
TIM_ClearFlag(TIM2, TIM_IT_CC2); //清除定时器的溢出标志,表示定时器计数从0开始
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //开启了定时器TIM2的中断
TIM_Cmd(TIM2, ENABLE); //打开TIM2定时器
NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPrio rity = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0为最高的优先级
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2); //NVIC配置,对定时器TIM2的中断进行优先级的配置
//这个函数中,加粗的代码对定时器TIM2进行了一次完整的配置
}
void HC04_Config2(void) //此函数完成HC04避障模块触发端的初始化
{
GPIO_InitTypeDef GPIO_InitStructure2;
//调用库函数,定义了一个结构体类型为GPIO_InitTypeDef的结构体,名为GPIO_InitStructure2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了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;
//将选择的管脚设置为推挽输出模式,此模式一般接逻辑器件
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
//将引脚的时钟设置为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure2);
//调用库函数GPIO_Init(),初始化GPIOA,关键利用GPIO_InitStructure中的参数进行初始化
GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
//调用GPIO_ResetBits()的话,是将端口设置为低电平
}
void HC04_Config(void)
{
HC04_Config2();
}
uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
} //让生命探测装置上的避障模块HC04测量长度
uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
} //让前方的避障模块测量长度
uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
}
uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3); //生成20us的脉冲宽度的触发信号
HC04_Config1();
return(L);
}
#include"HC04.h"
#include"SysTick.h"
extern uint32_t L;
void HC04_Config1(void)
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开定时器TIM2的时钟
TIM_DeInit(TIM2);
TIM_TimeBaseStructure1.TIM_Period =0xFFFF;
TIM_TimeBaseStructure1.TIM_Prescaler =1-1;
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_div1;
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);
TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发,还有TIM_ICPolarity(输入活动沿),TIM_ICPolarity_Falling输入捕获下降沿可以选择 ;一旦IC1为上升沿触发,则IC2就为下降沿触发,因为两者触发极性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection选择输入;TIM_ICSelection_DirectTI:TIM输入2,3或4选择对应的IC1或IC2或IC3或IC4相连;TIM_ICSelection_IndirectTI:TIM输入2,3或4选的对应与IC2或IC1或IC4或IC3相连;TIM_ICSelection_TRC:TIM输入2,3或3选择与TRC相连
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_div1;
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_ClearFlag(TIM2, TIM_IT_CC2);
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPrio
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0为最高的优先级
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);
//这个函数中,加粗的代码对定时器TIM2进行了一次完整的配置
}
void HC04_Config2(void)
{
GPIO_InitTypeDef GPIO_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure2);
GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
}
void HC04_Config(void)
{
HC04_Config2();
}
uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0);
HC04_Config1();
return(L);
}
uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1);
HC04_Config1();
return(L);
}
uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2);
HC04_Config1();
return(L);
}
uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3);
HC04_Config1();
return(L);
}
#include"HC04.h"
#include"SysTick.h"
extern uint32_t L;
void HC04_Config1(void)
{
GPIO_InitTypeDef GPIO_InitStructure1;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
TIM_ICInitTypeDef TIM_ICInitStructure1;
NVIC_InitTypeDef NVIC_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//调用库函数,开启了GPIOA的外设时钟,这句代码的意思应该是,开启了GPIOA的使用
GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure1);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开定时器TIM2的时钟
TIM_DeInit(TIM2);
TIM_TimeBaseStructure1.TIM_Period =0xFFFF;
TIM_TimeBaseStructure1.TIM_Prescaler =1-1;
TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_div1;
TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);
TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发,还有TIM_ICPolarity(输入活动沿),TIM_ICPolarity_Falling输入捕获下降沿可以选择 ;一旦IC1为上升沿触发,则IC2就为下降沿触发,因为两者触发极性相反
TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection选择输入;TIM_ICSelection_DirectTI:TIM输入2,3或4选择对应的IC1或IC2或IC3或IC4相连;TIM_ICSelection_IndirectTI:TIM输入2,3或4选的对应与IC2或IC1或IC4或IC3相连;TIM_ICSelection_TRC:TIM输入2,3或3选择与TRC相连
TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_div1;
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
TIM_ICInit(TIM2, &TIM_ICInitStructure1);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_ClearFlag(TIM2, TIM_IT_CC2);
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPrio
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0为最高的优先级
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);
//这个函数中,加粗的代码对定时器TIM2进行了一次完整的配置
}
void HC04_Config2(void)
{
GPIO_InitTypeDef GPIO_InitStructure2;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure2);
GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
}
void HC04_Config(void)
{
HC04_Config2();
}
uint32_t DistanceHDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig0);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig0);
HC04_Config1();
return(L);
}
uint32_t DistanceDDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig1);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig1);
HC04_Config1();
return(L);
}
uint32_t DistanceLDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig2);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig2);
HC04_Config1();
return(L);
}
uint32_t DistanceRDetect(void)
{
GPIO_SetBits(GPIOA,HC04_Trig3);
Delay_us(20);
GPIO_ResetBits(GPIOA,HC04_Trig3);
HC04_Config1();
return(L);
}
STM32芯片定时器输入捕获模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)