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

发布者:快乐时刻最新更新时间:2015-09-07 来源: eefocus关键字:STM32芯片  定时器输入  捕获模式 手机看文章 扫描二维码
随时随地手机看文章
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芯片定时器输入捕获模式

上一篇:微型四旋翼飞行器的设计与制作
下一篇:STM32的NVIC理解

推荐阅读最新更新时间:2024-03-16 14:30

ARM芯片stm32中的AHB和APB是什么意思
AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”。 AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。 APB,是Advanced Peripheral Bus的缩写,这是一种外围总线。 APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。 这两者都是总线,符合AMBA规范。
[单片机]
正点原子 第6讲 STM32芯片解读
1.芯片的资源 选型手册可以看到 芯片的资源 Flash size 是 片上flash的大小 这样一直对应 下去。都可以在 选型手册中来查找 比如他们的内核都是用的 cortex m3内核 一般情况下外部晶振用8M DMA用于高速的数据传输 系统定时器 通常用于ucos的延时 APB2 一般挂载高速外设 APB1挂载低速外设 芯片的引脚与功能是怎么定义的 我们可以在数据手册中找到 引脚对应的功能。 端口的功能会在后面进行介绍。 标注FT的引脚代表容忍5V VDD 连到 3.3V VBAT接电源 VDDA 也是接到3.3V VDD 和 VSS就是数字
[单片机]
正点原子 第6讲 <font color='red'>STM32</font><font color='red'>芯片</font>解读
使用STM32定时器进行输入脉冲的计数
STM32的定时器具有计数功能,在实际应用中可以用来对引脚上的输入信号进行统计。其输入信号作为计数时钟,输入引脚为ETR引脚。 本例程使用Timer 2,其ETR输入引脚为PA1,初始化是设置该引脚工作模式为输入模式,Timer2的工作模式为从模式。 为了方便测试,另外使用PC6模式输出一个时钟信号。测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码如下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #3366ff #ifdef DEBUG debug(); #3366ff #endif RC
[单片机]
基于STM32的DS1302时钟芯片驱动
/************************************************************************************************************************* * 函数 : DS1302.H * 功能 : DS1302头文件 * 参数 : 无 * 返回 : 无 * 依赖 : 底层读写函数 * 最后修改时间 : * 说明 : DS1302采用GPIO模拟SPI的方式DS1302 LSB格式,上升沿写 下降沿读 BCD码存储 * 参考 : ********************************************************
[单片机]
STM32 定时器输入捕获注意点
使用的是stm32f103rct6. 最近在写一个单定时器捕获4路pwm波的程序,那就必须在中断函数中改变检测边沿,通过手动记录捕获值来手动计算pwm的频率和脉宽值。 网上也有很多相关程序,但是我在写的时候却碰到了一个对于初学者来说非常不起眼的问题,导致结果怎么都不对: 如图中所示,我正在用TIM4_CH1,因为看见其他的结构体都是自己定义一边再使用的,于是我将‘TIM_TypeDef’这个结构体也自己定义了一个对象‘TIM4_Type’然后就发现结果不对。 后来仔细分析后发现这个结构体已在stm32f10x.h中有了对象实例:TIM4。并且这个TIM4所在的地方正是那些寄存器所处的地方,而我自己定义的对象‘TIM4_Type’是
[单片机]
<font color='red'>STM32</font> <font color='red'>定时器</font><font color='red'>输入</font><font color='red'>捕获</font>注意点
通用定时器-输入捕获实验
本节定时器PWM输出主要涉及到定时器框图左下方部分,即输入捕获部分 输入捕获工作过程(以通道1为例) 一个通道的框图: 作用:捕获TIMx_CH1通道信号的跳变,并触发捕获中断 我们将此过程拆分为4个部分 1,设置输入捕获滤波器 fDTS是根据TIMx_CR1-CKD 的设置确定的 如果TIMx_CR1-CKD 设置为00,则fTDS=fCK_INT = 72Mhz 如果TIMx_CR1-CKD 设置为10,则fTDS=fCK_INT / 4 = 18Mhz TIMx_CCMR1-ICF 输入捕获1滤波器,设置输入采样频率和数字滤波长度 如果TIMx_CCMR1-IC1F =0011,采样频率fSAMP
[单片机]
通用<font color='red'>定时器</font>-<font color='red'>输入</font><font color='red'>捕获</font>实验
STM32芯片超低功耗设计思路
对于给定的制造工艺和晶片区域,微控制器的功耗主要取决于两个因素(动态可控):电压和频率。 ST公司L系列超低功耗芯片为130nm超低泄漏工艺,在超低功耗所做的设计思路如下: 1、围绕Cortex-M3内核构建,具有领先的处理性能和代码密度,其处理性能使得运行模式时间更少,因此可以使深度睡眠模式的时间更长。 2、提供3个动态可选电压范围,从1.8V到1.2V,可在能耗上提供超过25%的增益。 3、提供7种低功耗模式,逐步禁用与频率无关的电流源(时钟源、非易失性存储器、调压器),直至大部分外设掉电。 4、灵活的门控技术,超低功耗模式下只激活必要的逻辑门。a)闲置的引脚配置为模拟输入;b)连接外围电路的引脚,提供有效的Pull
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved