定时器配置为外部计数【库函数】---求解答。

2019-08-13 19:51发布

背景:
要测一个方波信号的频率,频率范围是35k---45k。
之前我的思路是:外部中断+定时器中断。
信号来一个上升沿,触发一次外部中断,在外部中断函数里让计数变量(Ex_interrupts)加1.
定时器配置为定时模式,每1s中断一次,每次中断的时候,把(Ex_interrupts)的值记录下来。

这样做的效果不是很理想,测1Hz-1000Hz还挺准的,到了10k之后误差就越来越大,20kHz时差不多有1.1kHz的误差。


下面是我从网上查到的一些提示。
基本思路跟我上面的思路差不多。
区别在于:他是把一个定时器(TIM1)配置成外部计数模式,另一个定时器(TIM2)配置成定时模式.
TIM1负责计数。
TIM2负责定时(比如1s)中断,每次中断时, TIM_GetCounter(TIM1)=记录外部计数的次数(之后再清零,下次在从0开始计数)。

代码如下:
void TIM2_Configuration(void) //只用一个外部脉冲端口
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
    TIM_SetCounter(TIM2, 0);
   TIM_Cmd(TIM2, ENABLE);
}

对于TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);这个函数调用不是很清楚
请有识之士,不吝赐教!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。