嵌入式学习(41)-基于STM32F407Hal库的定时器输入捕获实现计数
·
一、概述
使用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 */
}
三、源码
更多推荐

所有评论(0)