TIM3_CAP.C
#include "TIM3_CAP.h"
//定时器3 通道1 输入捕获模式
u32 TIM3_RES;//保存2次高电平之间的时间
u16 TIM3_CAP;//保存第二次捕获高电平时候的计数器的数值
u8 TIM3_FLAG;//逻辑标志
void tim3_cap_init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//开启定时器3的时钟
RCC->APB2ENR|=1<<2;//开启PA时钟
GPIOA->CRL&=0XF0FFFFFF;//PA6配置清零
GPIOA->CRL|=0X08080000;//PA6下拉输入 默认下拉
GPIOA->ODR|=0<<6;//PA6下拉
TIM3->ARR=arr;//设置自动重载值
TIM3->PSC=psc;//设置预分频值
//*********通道1设置
TIM3->CCMR1|=1<<0;//选择输入端 IC1 映射到 TI1 上
TIM3->CCMR1|=0<<2;//输入不分频
TIM3->CCMR1|=0<<4;//不滤波
TIM3->CCER|=1<<0;//允许通道1捕获计数器的值到捕获寄存器中
TIM3->CCER|=0<<1;//通道1上升沿捕获
TIM3->DIER|=1<<0;//允许更新中断
TIM3->DIER|=1<<1;//允许通道1捕获中断
MY_NVIC_Init(2,0,TIM3_IRQn,2);//抢占2,子优先级0,组2
TIM3->CR1|=1<<0;//开启定时器3
}
void TIM3_IRQHandler(void)
{
if((TIM3_FLAG&0X80)==0)//还未成功捕获
{
if(TIM3->SR&0X01)//溢出
{
if(TIM3_FLAG&0X40)//已经捕获到高电平了
{
if((TIM3_FLAG&0X3F)==0X3F)//高电平太长了
{
TIM3_FLAG|=0X80;//标记成功捕获了一次
TIM3_CAP=0XFFFF;
}else TIM3_FLAG++;
}
}
if(TIM3->SR&0x02)//捕获1发生捕获事件
{
if(TIM3_FLAG&0X40) //捕获到一个上升沿
{
TIM3_FLAG|=0X80; //标记成功捕获到一次高电平脉宽
TIM3_CAP=TIM3->CCR1; //获取当前的捕获值.
}else//还未开始,第一次捕获上升沿
{
TIM3_FLAG=0; //清空
TIM3_CAP=0;
TIM3_FLAG|=0X40; //标记捕获到了上升沿
TIM3->CNT=0; //计数器清空
}
}
}
TIM3->SR=0;//清除中断标志位
}
|