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配置
//开启APB2中TIM8时钟
//设定分频1Mhz ,计数值为65535
//使能CH2 ,IC2
//允许到CCR2中
void TIM8_INIT(u16 arr, u16 psc){
RCC->APB2ENR |= 0x00002000; //TIM8时钟使能
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;