脉冲计数检测的目的:
将定时器对应对通道输入的低电平脉冲作为定时器的时钟,并通过串口输出脉冲的次数
配置步骤:
1、时基工作参数配置
counter_init();
TIM_HandleTypeDef tim_handle = {0};
SlaveConfigTypeDef slave_config = {0};
tim_handle.Instance = TIM2;
tim_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE ;
tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
tim_handle.Init.Period = arr;
tim_handle.Init.Prescaler = psc;
HAL_TIM_IC_Init(&tim_handle);
这里的配置不多说了,之前的文章里有过介绍,可以去翻翻看
2、MSP初始化
初始化GPIO、NVIC、CLOCK
函数:HAL_TIM_IC_MspInit();
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio_initstruct;
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_initstruct.Pin = GPIO_PIN_0;
gpio_initstruct.Mode = GPIO_MODE_AF_PP;
gpio_initstruct.Pull = GPIO_PULLUP;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio_initstruct);
3、定时器从模式配置
配置外部始终模式1,触发选择,上升沿触发,不分频,不滤波
HAL_TIM_SlaveConfigSynchro();这个函数在初始化函数里配置
slave_config.InputTrigger = TIM_TS_TI2FP2;
slave_config.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
slave_config.TriggerFilter = 0;
slave_config.TriggerPolarity = TIM_TRIGGERPOLARITY_FALLING;
HAL_TIM_SlaveConfigSynchro(&tim_handle,&slave_config);
4、使能捕获,并启动计数器
HAL_TIM_IC_Start();
5、获取CNT的值
这里我们自己写一个获取值的函数
void count_get(void)
{
new_counter = __HAL_TIM_GET_COUNTER(&tim_handle);
if(old_counter != new_counter)
{
old_counter =new_counter;
printf("CNT:%d 次\n",new_counter);
}
}
6、实验效果
这个脉冲计数需要检测到65535个脉冲才能清零,代码成功显示了按键按下的脉冲次数。