一、概述

        使用STM32F407实现计数的功能,其实本身例程里面有脉冲计数,这个功能就很好;但是目前一个定时器只能实现一路脉冲计数,不可以多路,这就造成如果有多个脉冲计数功能就会占用多个定时器。所以考虑使用定时器的输入捕获功能,可以实现同一个双通道或多通道的脉冲计数。

        这种方式也有缺点就是会一直进中断,所以这种计数最好是频率不高大约在1K以下的计数。

二、应用

void gtim_tim2_cap_Init(uint32_t arr, uint16_t psc)
{
    GPIO_InitTypeDef gpio_init_struct;
    TIM_IC_InitTypeDef tim2_ic_cap_ch1 = {0};
    TIM_IC_InitTypeDef tim2_ic_cap_ch2 = {0};
    GTIM_TIM2_CAP_CH1_CLK_ENABLE();                         /* 使能TIMx时钟 */
    GTIM_TIM2_CAP_CH1_GPIO_CLK_ENABLE();
    /* 初始化定时器 通道1 */
    g_tim2_cap_ch1_handle.Instance = GTIM_TIM2_CAP;                /* 定时器5 */
    g_tim2_cap_ch1_handle.Init.Prescaler = psc;                    /* 预分频系数 */
    g_tim2_cap_ch1_handle.Init.CounterMode = TIM_COUNTERMODE_UP;   /* 向上计数模式 */
    g_tim2_cap_ch1_handle.Init.Period = arr;                       /* 自动重装载值 */
    HAL_TIM_IC_Init( &g_tim2_cap_ch1_handle);
    gpio_init_struct.Pin = GTIM_TIM2_CAP_CH1_GPIO_PIN;      /* 输入捕获的GPIO口 */
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLDOWN;                  /* 下拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速 */
    gpio_init_struct.Alternate = GTIM_TIM2_CAP_CH1_GPIO_AF; /* 复用为捕获TIM5的通道1 */
    HAL_GPIO_Init(GTIM_TIM2_CAP_CH1_GPIO_PORT, &gpio_init_struct);
    tim2_ic_cap_ch1.ICPolarity = TIM_ICPOLARITY_RISING;     /* 上升沿捕获 */
    tim2_ic_cap_ch1.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上 */
    tim2_ic_cap_ch1.ICPrescaler = TIM_ICPSC_DIV1;           /* 配置输入分频,不分频 */
    tim2_ic_cap_ch1.ICFilter = 0;                           /* 配置输入滤波器,不滤波 */
    HAL_TIM_IC_ConfigChannel( &g_tim2_cap_ch1_handle, &tim2_ic_cap_ch1, GTIM_TIM2_CAP_CH1); /* 配置TIM5通道1 */
    /* 初始化定时器 通道2 */
    g_tim2_cap_ch2_handle.Instance = GTIM_TIM2_CAP;                /* 定时器5 */
    g_tim2_cap_ch2_handle.Init.Prescaler = psc;                    /* 预分频系数 */
    g_tim2_cap_ch2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;   /* 向上计数模式 */
    g_tim2_cap_ch2_handle.Init.Period = arr;                       /* 自动重装载值 */
    HAL_TIM_IC_Init( &g_tim2_cap_ch2_handle);
    gpio_init_struct.Pin = GTIM_TIM2_CAP_CH2_GPIO_PIN;      /* 输入捕获的GPIO口 */
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLDOWN;                  /* 下拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速 */
    gpio_init_struct.Alternate = GTIM_TIM2_CAP_CH2_GPIO_AF; /* 复用为捕获TIM5的通道1 */
    HAL_GPIO_Init(GTIM_TIM2_CAP_CH2_GPIO_PORT, &gpio_init_struct);
    tim2_ic_cap_ch2.ICPolarity = TIM_ICPOLARITY_RISING;     /* 上升沿捕获 */
    tim2_ic_cap_ch2.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上 */
    tim2_ic_cap_ch2.ICPrescaler = TIM_ICPSC_DIV1;           /* 配置输入分频,不分频 */
    tim2_ic_cap_ch2.ICFilter = 0;                           /* 配置输入滤波器,不滤波 */
    HAL_TIM_IC_ConfigChannel( &g_tim2_cap_ch2_handle, &tim2_ic_cap_ch2, TIM_CHANNEL_2); /* 配置TIM5通道1 */
    HAL_NVIC_SetPriority(TIM2_IRQn, 1, 3);         /* 抢占1,子优先级3 */
    HAL_NVIC_EnableIRQ(TIM2_IRQn);                 /* 开启ITMx中断 */
    //
    //
    __HAL_TIM_ENABLE_IT( &g_tim2_cap_ch1_handle, TIM_IT_CC1);
    __HAL_TIM_ENABLE_IT( &g_tim2_cap_ch2_handle, TIM_IT_CC2);
    HAL_TIM_IC_Start_IT( &g_tim2_cap_ch1_handle, TIM_CHANNEL_1);    /* 开始捕获TIM5的通道1 */
    HAL_TIM_IC_Start_IT( &g_tim2_cap_ch2_handle, TIM_CHANNEL_2);    /* 开始捕获TIM5的通道1 */
}

三、源码

STM32F407双通道捕获计数资源-CSDN下载

更多推荐