微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32芯片定时器输入捕获模式

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_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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top