关于定时器ETR计数功能

关于使用定时器计算外部脉冲的方式,除却使用输入捕获方式之外,还可以使用定时器的ETR计数方式。
如下图,首先关于定时器的时钟输入来源,可以分为4类,如下图:

当使用选择外部时钟源模式2时,可在外部时钟输入引脚的每一个上升沿或者下降沿计数,如下图介绍:

关于使用ETR计数功能的初始化配置程序,具体如下:

 void TIM_ETR_Init()
 {
     GPIO_InitTypeDef         GPIO_InitStructure={0};
     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure={0};

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1, ENABLE);

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

     TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
     TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  // Time base configuration

     //注意使用ETR引脚脉冲计数时,需要选择时钟外部模式2
     TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

     TIM_SetCounter(TIM1, 0);
     TIM_Cmd(TIM1, ENABLE);
 }

注意使用ETR计数功能,要选择使用对应的ETR引脚,例程选择使用PA12引脚,如下图。

 获取计数器的值,程序如下:

 uint32_t Get_TIM1_ETR_Counter(void)
 {
     uint32_t u32Counter;

     u32Counter = TIM_GetCounter(TIM1);
     TIM_SetCounter(TIM1, 0);
     return u32Counter;
 }

关于脉冲频率的计算:
脉冲频率 = 定时器计数个数/计数时间

 

posted @ 2023-04-17 14:47  ZaiLi  阅读(354)  评论(0编辑  收藏  举报