您的位置 首页 观点

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

stm32定时器有输入捕获模式,PWM输入模式,强输出模式,输出比较模式这几种。includeHC04h这个文件保存了用户自己编写的应用程序inc

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/255716.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部