• stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)


      STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0;TIMER3-->PD2;TIMER4-->PE0…

    1.TIM2 PA0计数 配置步骤

    ①开启TIM2时钟,配置PA0输入

      APB1外设复位寄存器 (RCC_APB1RSTR)

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

    置1开启。清0关闭。

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

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

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

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

    ②设置TIM2的ARR和PSC

      自动重装载寄存器(TIMx_ARR)

      预分频器(TIMx_PSC)

    ③设置TIM2的CCMR1

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

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

    输入捕获模式:

      Eg: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,开启输入捕获,并设置上升沿捕获

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

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

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

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

    ⑤设置TIM2的DIER,使能捕获和更新中断,并编写中断服务函数

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

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

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

    ⑥设置TIM2的CR1使能定时器

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

      控制寄存器1(TIMx_CR1)

    2.TIM2 PA0计数应用

     1 //定时器2通道1输入捕获配置
     2 //arr:自动重装值
     3 //psc:时钟预分频数
     4 void TIM2_Cap_Init(u16 arr,u16 psc)
     5 {         
     6     RCC->APB1ENR|=1<<0;       //TIM2 时钟使能 
     7     RCC->APB2ENR|=1<<2;        //使能PORTA时钟  
     8      
     9     GPIOA->CRL&=0XFFFFFFF0;    //PA0 清除之前设置  
    10     GPIOA->CRL|=0X00000008;    //PA0 输入   
    11     GPIOA->ODR|=0<<0;        //PA0 下拉
    12       
    13      TIM2->ARR=arr;          //设定计数器自动重装值   
    14     TIM2->PSC=psc;          //预分频器 
    15 
    16     TIM2->CCMR1|=1<<0;        //CC1S=01     选择输入端 IC1映射到TI1上
    17      TIM2->CCMR1|=1<<4;         //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效
    18      TIM2->CCMR1|=0<<10;     //IC2PS=00     配置输入分频,不分频 
    19 
    20     TIM2->CCER|=0<<1;         //CC1P=0    上升沿捕获
    21     TIM2->CCER|=1<<0;         //CC1E=1     允许捕获计数器的值到捕获寄存器中
    22 
    23     TIM2->DIER|=1<<1;       //允许捕获中断                
    24     TIM2->DIER|=1<<0;       //允许更新中断    
    25     TIM2->CR1|=0x01;        //使能定时器2
    26     MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2       
    27 }
    28 
    29 //定时器2中断服务程序     
    30 void TIM2_IRQHandler(void)
    31 {             
    32     u16 tsr;
    33     tsr=TIM2->SR;
    34         if(tsr&0x02)//捕获1发生捕获事件
    35         {    
    36             cishu++;
    37             
    38         }                                                
    39     TIM2->SR=0;//清除中断标志位         
    40 }
    //测试.c
    TIM2_Cap_Init(25,0);        
    while(1)
    {
        printf("cishu:%d us
    ",cishu);    
             
    }

    //不知为何cnt读数为0.。。

  • 相关阅读:
    15 个 Android 通用流行框架大全
    android将drawable下的图片转换成bitmap
    android横屏布局文件设置
    高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享
    高级运维(四):Nginx常见问题处理、安装部署Tomcat服务器、使用Tomcat部署虚拟主机
    高级运维(三):部署Lnmp环境、构建Lnmp平台、地址重写
    高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理
    高级运维(一):反向代理&使用Varnish加速Web
    Linux 软硬链接区别
    Linux 常用的一些操作
  • 原文地址:https://www.cnblogs.com/kuotian/p/5657554.html
Copyright © 2020-2023  润新知