×
单片机 > 单片机程序设计 > 详情

STM32芯片定时器输入捕获模式

发布时间:2020-05-22 发布时间:
|
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_IRQChannelPreemptionPriority = 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_IRQChannelPreemptionPriority = 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芯片  定时器输入  捕获模式 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码