STM32F103定时器中断、输入捕获(寄存器版本)(绝对干货)

使用环境(蓝色粗体字为特别注意内容)
1、软件环境:Win7 32 bit,Keil MDK V5.15
2、硬件环境:ALIENTEK MiniSTM32开发板、STM32F103RCT6

STM32输入捕获调试了几个小时,找了很多的参考代码,发现总是存在各种各样的问题,在此记录一下STM32F103RCT6的定时器输入捕获以及定时器中断,鉴于寄存器版本的程序执行效率很高,故此处采用寄存器版本实现。

Step1,初始化

//初始化TIM2定时器及中断
//每次进入中断服务程序间隔时间为
//((1+arr )/72M)*(1+psc )=((1+1999)/72M)*(1+35999)=1秒
//TIM2_Config(1999,35999); // 1s
void TIM2_Config(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   
     _STRACE_
}

Step2:定时器中断函数

/*
函数功能:基本定时器终端服务函数
返回值:无
形参:无
*/
void TIM2_IRQHandler(void)
{
    if(TIM2->SR & 0x02) //捕获1发生捕获事件
    {
        // cishu++;
    }
    else if(TIM2->SR & 0x1) //溢出
    {
        LED0 = !LED0;
    }
    TIM2->SR = 0; //清除中断标志位
}

 

你可能感兴趣的:(STM32F103定时器中断、输入捕获(寄存器版本)(绝对干货))