STM32定时器捕获篇:
在这里插入代码片
在main函数里使能
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_IC_Start_IT (&htim2, TIM_CHANNEL_1);
`
在tim.c里面实现功能
uint8_t fall_flag = 0;
uint32_t cap_value = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
if(!fall_flag)
{
printf("捕获到下降沿\n");
HAL_Delay(20);//消抖
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
{
fall_flag = 1;
__HAL_TIM_DISABLE(htim);//关闭定时器
__HAL_TIM_SET_COUNTER(htim,0);//计数器清零
TIM_RESET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1);//清除原先计数所在的位置
TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);//设置成上升沿捕获
__HAL_TIM_ENABLE(htim);//使能定时器
}
}
else
{
printf("捕获到上升沿\n");
fall_flag = 0;
//时间是溢出时间+捕获到当前时间+延时的时间
cap_value = cap_value + HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1) + 20000;
//cap_value = value + n*ARR;
printf("捕获到的时间= %ds:%dms:%dus\n",cap_value/1000000,cap_value%1000000/1000,cap_value%1000);
cap_value = 0;
__HAL_TIM_DISABLE(htim);//关闭定时器
TIM_RESET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1);//清除原先计数所在的位置
TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);//设置成下降沿进行捕获
__HAL_TIM_ENABLE(htim);//使能定时器
HAL_Delay(20);//消抖防止松手的时候,触发捕获,这时间不需要加入捕获时间
}
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
if(fall_flag == 1)
{
printf("updata\n");
cap_value += 1000000;
}
}
}