通用定时器_stm32通用定时器 - CSDN
精华内容
参与话题
  • 通用定时器原理

    千次阅读 2016-09-26 14:59:50
    4个通用定时器 2个基本定时器 二,定时器的计数模式向上计数模式: 计数器从0开始计数,当计数到自动装载值(TIMx_ARR)时产生向上溢出事件 向下计数模式: 计数器从自动装载值(TIMx_ARR)开始向下计数,当计数到0时产生...

    一,STM32三种定时器区别

    三种定时器

     2个高级定时器
     4个通用定时器
     2个基本定时器
    

    二,定时器的计数模式

    定时器的三种工作模式

    向上计数模式:
        计数器从0开始计数,当计数到自动装载值(TIMx_ARR)时产生向上溢出事件
    向下计数模式:
        计数器从自动装载值(TIMx_ARR)开始向下计数,当计数到0时产生向下溢出事件
    中央对齐模式(向上/向下计数):
        计数器从0开始计数,到自动装载值(TIMx_ARR)-1时,产生计数器溢出事件,
        然后向下计数到1,产生计数器溢出事件,然后再从0开始重新计数
    

    三,通用定时器的介绍

    对于总线时钟有疑问请查看 STM32时钟系统

    通用定时器包括:TIM2,TIM3,TIM4,TIM5

    位于低速APB1总线上 
    16位定时器,支持向上,向下,中央对齐
    自动重装载寄存器TIMx_CNT
    16位可编程(1-65535.可实时修改)预分频器 TIMx_PSC
    4个独立通道(TIMx_CH1-CH4),彼此不影响
    独立通道作用:
        1,输入捕获
        2,输出比较
        3,PWM生成(边缘或中间对齐模式)
        4,单脉冲模式输出
    每个定时器有4个独立通道,每个通道同一时间只能使用输入捕获和输出比较的一种
    支持定时器互联
    STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源
    

    产生中断和/DMA的事件:(6个独立的IRQ/DMA请求生成器)

    1,更新: 计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部外部触发)
    2,触发事件(计数器启动,停止,初始化,由内部/外部触发计数)
    3,输入捕获
    4,输出比较
    5,支持针对定位的增量(正交)编码器和霍尔传感电路
    6,触发输入作为外部时钟或按周期的电流管理
    

    STM32通用定时器被用于:

     测量输入信号的脉冲长度(输入捕获)或产生输出波形(输出比较和PWM)等
    
     使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整
    

    四,通用定时器框图

    通用定时器框图


    1,第一部分:时钟发生器

    这里写图片描述

    主要作用:产生时基单元的时钟


    1)时基单元的时钟来源来自内部时钟

    来自内部时钟

    来自内部时钟:
        触发控制器将内部APB1总线通过倍频得到的时钟作为时基单元的时钟来源
    

    2)时基单元的时钟来源来自外部时钟

    来自外部时钟

    来自外部时钟:
        外部引脚输入信号,TIMx_ETR(定时器2 3 4,定时器5没有这个寄存器),
        通过极性选择,边沿检测,和预分频器,再通过输入滤波产生时钟
        作为时基单元的时钟来源
    

    3)时基单元的时钟来源来自其他定时器

    来自其他定时器

    来自其他定时器:
        ITR0-ITR4内部触发输入口,通过定时器的级联,来自其他定时器的时钟,
        通过选择器,触发控制器,作为时基单元的时钟来源
        由其他定时器的TRGO,输入到ITR1-ITR4,定时器的级联
    

    4)时基单元的时钟来源来自外部通道

    这里写图片描述

    外部通道输入:
        通过选择器,通过触发控制器,作为时基单元的时钟来源
    

    总结:
        使用较多的应用场景是:内部时钟
    

    2,时基单元部分

    这里写图片描述

    CK_PSC时钟信号进行预分频,产生CK_CNT时钟为计数器最终时钟
    计数器在这个时钟的控制下进行计数,向上/向下/中央对齐计数是在触发控制器的相应寄存器中配置的
    当计数器向上计数到重装载值或向下计数到0将触发中断或DMA请求
    

    3,输入捕获部分

    输入捕获部分

    应用场景:计算脉冲宽度
        先设置为捕获上升沿,输入信号进行输入滤波(抗干扰)和边沿检测,检测到上升沿,捕获比较寄存器会将这个值记下来
        再设置为捕获下降沿,检测到下降沿,又记录下这个值,
        通过这两个值可以计算脉冲宽度
    每个定时器有4个独立通道,每个通道同一时间只能使用输入捕获和输出比较的一种
    

    4,输出比较部分

    输出比较部分

    PWM输出:
        设置捕获/比较寄存器为一个置,当计数器比这个值大输出高电平,比这个值小输出低电平
        这样可以产生一个波,通过调整占空比(捕获/比较寄存器的值),可以输出PWM
    
    展开全文
  • STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则...

    STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。

    时钟源问题:

    名为TIMx的有八个,其中TIM1TIM8挂在APB2总线上,而TIM2-TIM7则挂在

    APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz

     

    定时器的时钟不是直接来自APB1APB2,而是来自于输入为APB1APB2的一个倍频器。

    下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为24816)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

    假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHzTIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz

    有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

    再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

    展开全文
  • TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入...

    TIM1TIM8定时器的功能包括【增强型】:

    ● 16位向上、向下、向上/下自动装载计数器
    ● 16
    位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为165535之间的任意数值
    多达4个独立通道:输入捕获 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 
    死区时间可编程的互补输出
    使用外部信号控制定时器和定时器互联的同步电路 
    允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
    刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
    如下事件发生时产生中断/DMA更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 输出比较刹车信号输入 
    支持针对定位的增量(正交)编码器和霍尔传感器电路 
    触发输入作为外部时钟或者按周期的电流管理

    TIMx主要功能通用TIMx (TIM2TIM3TIM4TIM5)定时器功能包括【通用型】:

    ● 16位向上、向下、向上/向下自动装载计数器 
    ● 16
    位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为165536之间的任意数值 
    ● 4
    个独立通道:输入捕获 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 
    使用外部信号控制定时器和定时器互连的同步电路 
    如下事件发生时产生中断/DMA更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 输出比较
    支持针对定位的增量(正交)编码器和霍尔传感器电路 
    触发输入作为外部时钟或者按周期的电流管理

    TIM6TIM7定时器的主要功能包括【精简型】: 

    ● 16位自动重装载累加计数器 
    ● 16
    位可编程(可实时修改)预分频器,用于对输入的时钟按系数为165536之间的任意数值分频 
    触发DAC的同步电路 :此项是TIM6/7独有功能.
    在更新事件(计数器溢出)时产生中断/DMA请求

    展开全文
  • STM32通用定时器使用详解

    万次阅读 多人点赞 2019-06-29 19:12:46
    1.通用定时器基本介绍 通用定时器包括TIM2、TIM3、TIM4和TIM5 STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。...

    1.通用定时器基本介绍

    • 通用定时器包括TIM2、TIM3、TIM4和TIM5
    • STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
    • 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
    • 定时器可以进行定时器基本定时输出4路PWM输入捕获
    • 本文详细介绍这三个功能并且利用定时器3并且示例代码使用

    2.开发环境

    开发平台:keil5
    单片机:STM32F103ZET6


    #3.基本定时功能

    ## 3.1定时器时钟来源分析
    STM32部分时钟树:
    定时器部分时钟树
      3.1.1 首先我们我们的系统时钟(SYSCLK 72MHz) 经过AHB分频器给APB1外设,但是APB1外设最大的只能到36Mhz,所以必须要系统时钟的二分频。下面又规定了如果APB1预分频系数为1则频率不变,否则频率X2至定时器27**,**所以定时器27的时钟频率为还是72MHz

      3.1.2 分配给我们定时器的时钟是72MHz,我们可以根据自己的需求再设置定时器的分频,设置它的定时值

    /*
    	* 初始化定时器的时候指定我们分频系数psc,这里是将我们的系统时钟(72MHz)进行分频
    	* 然后指定重装载值arr,这个重装载值的意思就是当 我们的定时器的计数值 达到这个arr时,定时器就会重新装载其他值.
    		例如当我们设置定时器为向上计数时,定时器计数的值等于arr之后就会被清0重新计数
    	* 定时器计数的值被重装载一次被就是一个更新(Update)
    	* 计算Update时间公式
    	Tout = ((arr+1)*(psc+1))/Tclk
    	公式推导详解:
    		Tclk是定时器时钟源,在这里就是72Mhz 
    		我们将分配的时钟进行分频,指定分频值为psc,就将我们的Tclk分了psc+1,我们定时器的最终频率就是Tclk/(psc+1) MHz
    		这里的频率的意思就是1s中记 Tclk/(psc+1)M个数 (1M=10的6次方) ,每记一个数的时间为(psc+1)/Tclk ,很好理解频率的倒数是周期,这里每一个数的周期就是(psc+1)/Tclk 秒
    		然后我们从0记到arr 就是 (arr+1)*(psc+1)/Tclk
    	举例:比如我们设置arr=7199,psc=9999
    	我们将72MHz (1M等于10的6次方) 分成了(9999+1)等于 7200Hz
    	就是一秒钟记录9000数,每记录一个数就是1/7200秒
    	我们这里记录9000个数进入定时器更新(7199+1)*(1/7200)=1s,也就是1s进入一次更新Update
    */
    //简单进行定时器初始化,设置 预装载值 和 分频系数
    void MY_TIM3_Init(u16 arr,u16 psc){
    	
    	//初始化结构体
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    	
    	//1.分配时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	
    	//2.初始化定时器相关配置
    	TIM_TimeBaseStructure.TIM_Period = arr;
    	TIM_TimeBaseStructure.TIM_Prescaler = psc;
    	
    	/*在这里说一下这个TIM_ClockDivision 是设置与进行输入捕获相关的分频
    		设置的这个值不会影响定时器的时钟频率,我们一般设置为TIM_CKD_DIV1,也就是不分频*/
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
    	
    	//3.打开定时器
    	TIM_Cmd(TIM3,ENABLE);
    }
    
    /****************** 主函数 ********************/
    //在主函数中我们可以调用初始化
    int main(){
    	//定时器初始化
    	MY_TIM3_Init(7199,9999);
    	while(1){
    		
    		//检测更新标志位
    		if(TIM_GetFlagStatus(TIM3,TIM_IT_Update)){
    			//清除标志位
    			TIM_ClearFlag(TIM3,TIM_IT_Update);
    			//....(每隔一秒执行任务)
    		}
    		
    	}
    }
    

    #4.定时器输出PWM # 4.1基本介绍   **4.1.1** **PWM**是脉冲宽度调制,我们是通过改变**脉冲的宽度**来达到改变**输出电压**的效果,本质上就是调节**占空比**实现的,STM32除了**基本定时器(TIM6,TIM7)不能输出PWM**以外,其它的定时器都具有输出PWM,其中**高级定时器(TIM1和TIM8)**还能输出**7**路PWM,**基本定时器(TIM2,TIM3,TIM4,TIM5)**也可以输出**4**路PWM > 输出**PWM**是很有用的,比如我们可以通过**控制电机**来玩小车,或者通过输出PWM改变LED的亮度,制造**呼吸灯**等等

      4.1.2 我们通用定时器能输出PWM的IO口是固定的,虽然我们可以通过重映射可以改变引脚,具体是哪一些IO口我们要通过查阅STM32的参考手册

    这里涉及到一个重映射的概念,重映射就是管脚的外设功能映射到另一个管脚,但是不是可以随便映射的,具体对应关系参考手册上的管脚说明。这样优点是可以优化电路设计;扩展功能,减少外设芯片资源

    /**
    	定时器3,可产生四路的PWM输出,四个通道分别对应的引脚情况如下
    	TIM3_CH1,TIM3_CH2,TIM3_CH3,TIM3_CH4
    	没有重映像的对应情况:
    	PA6,PA7,PB0,PB1
    	部分重映像:
    	PB4,PB5,PB0,PB1
    	完全重映像:
    	PC6,PC7,PC8,PC9	
    
    	当我们的IO口不仅仅是做普通的输入输出使用的时候,作为别的外设(AD,串口,定时器等)的特定功能引脚,就需要开启外设.
    	这里我们还需要开启APB2外设上的复用时钟AFIO,同时IO口采用的是复用输出!
    
    	我们这里是没有使用重映射功能.
    */
    // 宏定义
    //判断当前是处于哪一种模式,以便于我们初始化IO口
    #define NO_REAMP   0
    #define PART_REAMP 1
    #define FULL_REAMP 2
    
    // ---> 这里是需要制定的参数
    
    //指定这里的 当前的模式,我们给她默认指定是 没有重映射
    #define CURRENT_MODE NO_REAMP 
    
    //*************根据当前模式初始化IO口 函数
    void MY_TIM3_GPIO_Init(void){
    	
    	GPIO_InitTypeDef 	GPIO_InitStructure;
    	
    	//1.开启AFIO时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    	
    	//2. 根据当前的重映像的模式 配置时钟 和 初始化相关引脚
    	switch(CURRENT_MODE){
    		
    		//2.1 如果没有重映射
    		case NO_REAMP:{
    			
    			// 时钟分配
    			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
    			// 初始化IO口
    			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    			GPIO_Init(GPIOA,&GPIO_InitStructure);
    			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    			GPIO_Init(GPIOB,&GPIO_InitStructure);
    			
    			break;
    		}
    		//2.2 部分重映射
    		case PART_REAMP:{
    			
    			// 时钟分配
    			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    			// 初始化IO口
    			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;
    			GPIO_Init(GPIOB,&GPIO_InitStructure);
    			
    			break;
    		}
    		//2.3 全映射
    		case FULL_REAMP:{
    			
    			// 时钟分配
    			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    			// 初始化IO口
    			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
    			GPIO_Init(GPIOB,&GPIO_InitStructure);
    			
    			break;
    		}
    		default:break;
    	}	
    }
    
    //***************** 定时器PWM输出初始化函数
    void MY_TIM3_PWM_Init(u16 arr,u16 psc){
    	
    	//初始化结构体
    	TIM_OCInitTypeDef TIM_OCInitstrcuture;
    	
    	//1.初始化定时器 和 相关的IO口
    	MY_TIM3_Init(arr,psc); 
    	MY_TIM3_GPIO_Init();
    	
    	//2.初始化PWM的模式
    	
    	/**
    	选择PWM模式:
    		PWM1模式:
    			向上计数时,当我们 当前的 计数值 小于我们的设置阈值为有效电平,否则为无效电平,向下计数时与向上计数时相反
    		PWM2模式:
    			与PWM1模式向上向下计数时完全相反
    	*/
    	TIM_OCInitstrcuture.TIM_OCMode = TIM_OCMode_PWM1;
    	TIM_OCInitstrcuture.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInitstrcuture.TIM_OCPolarity = TIM_OCPolarity_High;   //输出电平为高,也就是有效电平为高
    	TIM_OC1Init(TIM3,&TIM_OCInitstrcuture);						//这里是设置利用通道1输出
    	
    	//这里只初始化通道1,我们可以根据自己需求初始化其它通道
    	
    //	TIM_OC2Init(TIM3,&TIM_OCInitstrcuture);
    //	TIM_OC3Init(TIM3,&TIM_OCInitstrcuture);
    //	TIM_OC4Init(TIM3,&TIM_OCInitstrcuture);
    
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器
    }
    
    //*********************主函数调用
    int main(){
    	
    	//因为我们单片机引脚输出电压3.3V左右,我们设置预装载值为330
    	MY_TIM3_PWM_Init(330,0);
    	
    	//我们初始化的时候选择的是PWM1模式,当计数值小于我们的设定值100时为有效电平,这里是高电平
    	//所以对于的1通道(PA6)电压是大概就是 3.3 * (100/330) = 1V 左右,我们可以用万用表测量
    	TIM_SetCompare1(TIM3,100);
    	
    	while(1);
    }
    
    

    #5.定时器输入捕获
    ## 5.1基本介绍

    • 上面介绍了定时器的四路通道可以输出PWM,同样的我们也可以捕获该定时器这四路通道上的边沿状态(上升沿,下降沿)

    • 由此可见基本定时器也不能进行输入捕获,没有思路通道

    我们可以通过输入捕获的来测量高电平脉宽时间,首先捕获到高电平,记录下改时间,然后切换为捕获低电平,得到时间
    ## 5.2开发步骤
    ###   输入捕获 (捕获边沿信号,上升沿和下降沿)
       首先我们需要以一定的频率检测电平的跳变,然后对部分跳变(也就是部分输入的波形)进行过滤
          ------ 这就是定时器里面的滤波器的任务

    1. 指定输入滤波器时钟频率,首先是系统时钟分给定时器72Mhz,我们首先初始化定时器的时候指定了TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 没有分频,输入给滤波器的时钟频率还是72MHz,TIM_ClockDivision也可以指定为2分频或者4分频
    2. 波形过滤(TIM_ICFilter),这里有一个指定过滤器的参数(参考芯片手册),例如我们设置参数为0101(二进制),采样频率(fsampling)为 滤波器频率/2 = 36Mhz,N=8.当检测到一个上升沿的时候,再以fsampling频率连续8次检测到高电平才确认是一个有效的上升沿,这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤高频波的效果。
      这里写图片描述
    3. 配置输入分频(TIM_ICPrescaler),如果我们设置不分频,一个边沿(上升沿或者下降沿)就触发一次捕获,二分频就是两次边沿触发捕获,这里这个分频可以为1,2,4,8
    //定时器输入捕获初始化
    void MY_TIM3_Cap_Init(u16 arr,u16 psc){
    
    	//初始化结构体
    	TIM_ICInitTypeDef TIM_ICInitStructure;
    	
    	//1.初始化定时器 和 相关的IO口
    	MY_TIM3_Init(arr,psc); 
    
    	//这里的IO口根据自己需求改成输入,我这改成下拉输入,具体代码就不展现了
    	MY_TIM3_GPIO_Init();
    	
    	//2.初始化定时器输入捕获
    	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ; // 设置输入捕获的通道
    	
    	//不使用过滤器,假设我们想使用,例如上述举例使用0101
    	//我们就给TIM_ICFilter  = 0x05 ,(0000 0101),根据上表可以知道这个值范围(0x00~0x0F)
    	TIM_ICInitStructure.TIM_ICFilter = 0x00;
    	
    	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
    	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;		//配置输入分频,这里不分频,1次检测到边沿信号就发生捕获
    
    	/*
    		这里说一下定时器通道可以进行交叉捕获,通道1捕获通道2引脚上的边沿信号,通道2捕获通道1引脚,通道3可以捕获通道4对应引脚,... 
    		但是只能相邻一对可以相互捕获,例如通道2不能捕获通道3引脚边沿信号
    		TIM_ICSelection_DirectTI 表示直接捕获,通道1对应通道1引脚,通道2对应通道2引脚
    		TIM_ICSelection_IndirectTI 表示进行交叉捕获
    	*/
    	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射捕获对应通道的引脚
    	TIM_ICInit(TIM3,&TIM_ICInitStructure);													
    	
    }
    //****************主函数
    int main(){
    	//初始化输入捕获
    	MY_TIM3_Cap_Init(1000,0);
    	
    	while(1){
    		//检测是否捕获到上升沿
    		if(TIM_GetFlagStatus(TIM3,TIM_IT_CC1)){
    			TIM_ClearFlag(TIM3,TIM_IT_CC1);
    			//捕获到上升沿之后的任务...
    			//一般测量高电平脉宽,我们可以先捕获上升沿再捕获下降沿
    			//TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); 修改为下降沿捕获
    		}
    		
    	}
    }
    
    

    #6.定时器中断
     1.谈及到中断,我们就必须涉及到NVIC,具体关于NVIC请参考我的另外一篇,这里是直接使用,我们使能定时器3中断并且配置完抢占优先级和响应优先级之后,再在主函数中使能其更新中断和输入捕获中断

    //使能更新中断和输入捕获通道1的中断
    TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);
    

     2.我们使用中断的一个主要目的就是能够及时处理信息,不用在主函数的while循环里面等待

    //定时器3的中断处理函数
    void TIM3_IRQHandler(void){
    	
    	//1.判断是什么中断
    	
    	// 1.1定时器更新中断
    	if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
    		//...处理定时器更新之后任务
    	}
    	// 1.2如果是定时器 通道1的捕获中断
    	else if( TIM_GetITStatus(TIM3,TIM_IT_CC1) ){
    			//处理输入捕获之后的任务
    			//TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);更改为下降沿捕获
    	}
    	
    	//2.最后将中断标志位都清理掉
    	TIM_ClearITPendingBit(TIM3,TIM_IT_Update|TIM_IT_CC1);
    }
    
    展开全文
  • 31.通用定时器

    2018-09-01 15:49:57
    F1含有四个通用定时器,两个高级定时器,两个基本定时器 定时器种类 位数 计数器模式 产生DMA请求 捕获比较通道 互补输出 特殊应用场景 高级定时器TIM1,TIM8 16 向上,向下,向上/下 可以 4 有...
  • STM32通用定时器

    2020-08-16 18:01:34
    1.stm32共有8个定时器,分为三种(高级定时器TIM1,TIM8、通用定时器TIM2~TIM5、基本定时器TIM6,TIM7),区别如下: 2.通用TIMx(TIM2\TIM3\TIM4\TIM5)定时器完全独立,没有任何公用的资源,都挂载在APB1总线上,...
  • 通用定时器的介绍

    千次阅读 2018-05-03 12:36:03
    1、STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。2、通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能通用...
  • 通用定时器基本原理

    千次阅读 2017-05-09 15:35:56
    1、参考资料  《STM32F1开发指南-库函数... 《STM32中文参考手册V10》-第14章通用定时器 2、通用定时器概述  ·STM32定时器    ·三种STM32定时器区别    ·通用定时器功能特点描述  STM32的通用TIMx
  • 目录 一、STM32的定时器资源 1、STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能 ...STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有
  • stm32f407之通用定时器

    万次阅读 2013-11-20 19:06:41
    通用定时器  通用定时器(TIM2 to TIM5)包括由可编程的分频器驱动一个的16位或32位自动重载计数器。它们可用于多种用途,包括测量输入信号的脉冲长度(输入捕获)或生成的输出波形(输出比较和PWM)。可以使用...
  • DSP之时钟与定时器之二通用定时器

    万次阅读 2012-08-15 10:49:22
    C55x DSP片内有两个2通用定时器,利用定时器可向CPU产生周期性中断或向DSP片外的器件提供周期信号。其中TMS320VC5503/5507/5509/5510 DSP提供的是2个20位通用定时器. 1 结构框图 20位的定时器由两部分组成:...
  • 通用定时器挂载在APB1总线,高级定时器挂载在APB2总线。配置NVIC中断分组时,利用NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQN;可以配置全部通用定时器中断,但是高级定时器的中断配置是分开的,如定时器1分别是...
  • stm32定时器的配置步骤

    千次阅读 2019-04-10 19:02:46
    基本定时器结构功能简单,类似于51单片机中的定时器,通用定时器在基本定时器基础上扩展而来,增加了输入捕获和输出比较等功能,高级定时器在通用定时器的基础上扩展而来,增加了可编程死区互补输出、重复计数器、带...
  • 《STM32中文参考手册V10》-第14章通用定时器   STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为: 高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 ...
  • STM32定时器详解(定时器中断实验)

    千次阅读 2019-04-18 21:22:54
    文章目录STM32定时器分类定时器中断实验计数器时钟频率计数器模式向上计数模式库函数操作 STM32定时器分类 STM32的定时器分为很多类,按照功能的不同可以...STM32通用定时器主要是通过可编程预分频器(PSC)驱动的16...
  • STM32定时器学习---基本定时器

    万次阅读 2017-12-02 20:49:33
    TIM2/3/4/5:通用定时器 TIM1、TIM8:高级定时器三种定时器的区别: 基本定时器: 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地...
  • 结论:通用有的,高级都有,正常使用。但是基本定时器真的只有计算一下时间,产生更新中断的作用。下面是具体细节TIM1和TIM8定时器的功能包括【增强型】:● 16位向上、向下、向上/下自动装载计数器● 16位可编程...
  • 关于STM32F4定时器时钟频率问题

    万次阅读 2017-05-16 15:13:54
    从时钟树中我们可以得知 ...(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知, (1)当APB1和APB2分频数为1的时候,T
  • STM32----高级定时器、通用定时器(TIMx)、基本定时器(TIM6和TIM7)的区别 我觉得总的来说应该没多大区别,似乎是高级定时器多了三相电机控制所需的功能,还请各位高人指点吧~~   TIM1和TIM8主要特性...
1 2 3 4 5 ... 20
收藏数 30,172
精华内容 12,068
关键字:

通用定时器