18 定时器的ETR脉冲计数

 

主要内容

     STM32定时器ETR脉冲计数的原理、结构、库函数及编程

教学目标:

     掌握定时器ETR脉冲计数的库函数及编程

教学重点

1 定时器ETR脉冲计数的库函数

2定时器ETR脉冲计数的编程

教学难点  

1   定时器ETR脉冲计数的编程

 

定时器有如下几种功能用法:

1>定时。使用内部时钟源

2>PWM调制输出。使用内部时钟源

3>脉冲宽度(频率)测量。使用内部时钟源,外部边沿触发

4>脉冲数计数。使用外部时钟输入

STM32外部脉冲ETR引脚:

TIM1-->PA12;TIMER2-->PA0TIMER3-->PD2;TIMER4-->PE0…

1.TIM2 PA0计数 配置步骤

开启TIM2时钟,配置PA0输入

  APB1外设复位寄存器 (RCC_APB1RSTR)

  APB2外设时钟使能寄存器(RCC_APB2ENR)

1开启。清0关闭。

  EgRCC->APB1ENR|=1<<0;  //使能TIM2时钟

     RCC->APB2ENR|=1<<2;     //使能PORTA时钟

配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

  EgGPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置 
     GPIOA->CRL|=0X00000008; //PA0 输入 
     GPIOA->ODR|=0<<0; //PA0 下拉

 

设置TIM2ARRPSC

  自动重装载寄存器(TIMx_ARR)

  预分频器(TIMx_PSC)

设置TIM2CCMR1

  TIM2_CCMR1寄存器控制着输入捕获12的模式,包括映射关系、滤波和分频等。这里需要设置通道1为输入模式,且IC1映射到TI1(通道1)上,并且不使用滤波(提高响应速度)器。

  捕获/比较模式寄存器1(TIMx_CCMR1)

输入捕获模式:

  EgTIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1

     TIM2->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效
     TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频

 

设置TIM2CCER,开启输入捕获,并设置上升沿捕获

TIM2_CCER寄存器是定时器的开关,并且可以设置输入捕获的边沿。

  捕获/比较使能寄存器(TIMx_CCER) 

  Eg: TIM2->CCER|=0<<1; //CC1P=0 上升沿捕获

    TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中

 设置TIM2DIER,使能捕获和更新中断,并编写中断服务函数

   DMA/中断使能寄存器(TIMx_DIER)

  EgTIM2->DIER|=1<<1; //允许捕获中断 

     TIM2->DIER|=1<<0; //允许更新中断

 

设置TIM2CR1使能定时器

最后打开定时器的计数器开关,启动TIM2计数器,开始输入捕获。

  控制寄存器1(TIMx_CR1)

 2.TIM2 PA0计数应用

 //定时器2通道1输入捕获配置

 //arr:自动重装值

 //psc:时钟预分频数

 void TIM2_Cap_Init(u16 arr,u16 psc)

  {   RCC->APB1ENR|=1<<0;       //TIM2 时钟使能

      RCC->APB2ENR|=1<<2;        //使能PORTA时钟 

      GPIOA->CRL&=0XFFFFFFF0;    //PA0 清除之前设置 

      GPIOA->CRL|=0X00000008;    //PA0 输入  

      GPIOA->ODR|=0<<0;        //PA0 下拉

     

      TIM2->ARR=arr;          //设定计数器自动重装值  

      TIM2->PSC=psc;          //预分频器

      TIM2->CCMR1|=1<<0;        //CC1S=01     选择输入端 IC1映射到TI1

      TIM2->CCMR1|=1<<4;  //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效

      TIM2->CCMR1|=0<<10;     //IC2PS=00     配置输入分频,不分频

     TIM2->CCER|=0<<1;         //CC1P=0    上升沿捕获

     TIM2->CCER|=1<<0;         //CC1E=1     允许捕获计数器的值到捕获寄存器中

     TIM2->DIER|=1<<1;       //允许捕获中断               

    TIM2->DIER|=1<<0;       //允许更新中断   

    TIM2->CR1|=0x01;        //使能定时器2

     MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2      

 }

  //定时器2中断服务程序    

 void TIM2_IRQHandler(void)

 {      u16 tsr;

        tsr=TIM2->SR;

        if(tsr&0x02)//捕获1发生捕获事件

         {    cishu++;            

         }                                               

       TIM2->SR=0;//清除中断标志位        

 }

 //测试.c

TIM2_Cap_Init(25,0);       

while(1)

{

    printf("cishu:%d us\r\n",cishu);   

        

}