STM32F103输入捕获的实现

目的:实现对边沿信号的捕捉并及时,可用作计算脉宽,或者频率等功能;

需要外设:TIM8

需求:测量TIM8_CH2的输入频率;

操作:

  1.配置TIM8外设;

  2.读取两次下降沿的时间间隔

1.编写相关函数

//  IO口的配置
void IO_Init(void)
{
 RCC->APB2ENR |= 1<<4;    //使能GPIOC时钟

 GPIOC->CRL &= 0X0FFFFFFF;  //清除GPIO PC7的配置;
 GPIOC->CRL |= 0X40000000;  //PC7浮空输入
}

//定时器8配置

//定时器8配置为输入捕获模式
//开启APB2中TIM8时钟
//设定分频1Mhz ,计数值为65535
//使能CH2 ,IC2
//允许到CCR2中
void TIM8_INIT(u16 arr, u16 psc){
 
 RCC->APB2ENR |= 0x00002000;   //TIM8时钟使能
 TIM8->ARR = arr;
 TIM8->PSC = psc;
 
 TIM8->CCMR1 |= 1<<8;   //IC2映射到CH2上
 TIM8->CCMR1 |= 0<<10;  //IC1输入捕获无预分频
 TIM8->CCMR1 |= 0<<12;  //输入捕获无滤波
 
 TIM8->CCER  |= 0<<5;  //上升沿捕获
 TIM8->CCER  |= 1<<4;  //输入捕获使能  允许捕获后到CCR2中
 
 TIM8->CR1   &= ~(1<<0); //关闭定时器8;
}

//读取脉宽时间
int Speed(void){          
 u16 temp1,temp2,temp ;
 TIM8->SR =0;                         //清除标志位
 TIM8->CR1   |= 0X01;             //开启定时器8;
 while(!(TIM8->SR&0X04));         //读取IC2状态 第一个上升沿
 temp1 = TIM8->CCR2;              //读取缓存区数据
 while(!(TIM8->SR&0X04));         //读取IC2状态 第二个上升沿
 temp2 = TIM8->CCR2;              //读取缓存区数据
 TIM8->CR1   &=  ~(1<<0);         //关闭定时器8;
 if(temp1<temp2)
  temp =temp2-temp1;
 else if(temp1>temp2)
  temp=(0xffff-temp1)+temp2;
 else
  temp=0;                         //f=10的6次方/7*t  //t的单位为us
 
 return temp;  //返回时间 单位us
}

2.    使用函数

  在主函数中配置IO与TIM8,即可调用读取时间的函数实现测量时间功能,时间单位为us;

  如果想要更短的时间可以修改分频系数,当前使用的分频为1Mhz;

猜你喜欢

转载自www.cnblogs.com/ctu11/p/11520762.html