本帖最后由 yanjinbin 于 2012-10-19 11:10 编辑
1.定时配置配置 TIM_TimeBaseStructure.TIM_Period = 0xFFFF -1;
//定时器每3.2768S溢出一次
TIM_TimeBaseStructure.TIM_Prescaler =3600-1 ; //预分频系数,72000 000/36000 = 2000,定时器时钟为2KHz=50us
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上+1模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
//定时器4通道4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
//上升沿捕获-TIM_ICPolarity_Rising
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
//通道方向选择-连接到IC2
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//每个时间都捕获,即每次上升沿都会触发定时器
TIM_ICInitStructure.TIM_ICFilter = 0x0;
//选择输入比较滤波器,滤波设置,经历几个周期跳变认定波形稳定0x0~0xF。
TIM_ICInit(TIM4,&TIM_ICInitStructure);
TIM_ClearFlag( TIM2, TIM_IT_Update|TIM_IT_CC4 ); //清除标志位
TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC4 , ENABLE);
//使能定时器4 溢出中断和捕获中断
TIM_Cmd(TIM4, ENABLE);
//使能定时器4计时
2.中断处理
void TIM4_IRQHandler(void)
{
static u32 ThisPluse = 0; //当前值
static u32 LastPluse = 0; //保存上一个值
u32 Tmp = 0;
if(TIM_GetITStatus(TIM4, TIM_IT_CC4) == SET) {
/* 清除TIM4捕获比较中断挂起位 */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
CntCount++;
ThisPluse = TIM_GetCapture4(TIM4); //获取脉冲间隔
if(ThisPluse > LastPluse) {
Tmp = ThisPluse - LastPluse;
}else{
Tmp = 0xFFFF-LastPluse + ThisPluse;
}
LastPluse = ThisPluse; //保存历史值
Tmp = Tmp*50/1000;
LOG_PR("%D-%Dms\r\n",CntCount,Tmp);
}
3.产看打印输出语句LOG_PR("%D-%Dms\r\n",CntCount,Tmp);
这里使用脉冲发生器,给其一个1Hz的脉冲。
采集输出时:"1-1971ms",输出间隔是2s,为什么不是1s.
这里设置TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每个事件都捕获,如果是每个脉冲的上边沿都会触发,那么脉冲宽度应该是1s.
这个参数设置的含义,到底是什么。 |