学习野火stm32 HAL库的tim5 ch1输入捕获功能,代码和例程代码一样,按下PA0控制的按键,只能进入中断捕获到一次上升沿,松开按键捕获不到下降沿,中断服务函数配置了下降沿的情况,捕获不到下降沿,没办法执行else之后的语句,这该怎么办呢
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
TIM_ICUserValueStructure .usPeriod ++;
printf("Update %d! \r\n",TIM_ICUserValueStructure .usPeriod); //每次中断打印一次值
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
TIM_IC_InitTypeDef sConfigIC;
if ( TIM_ICUserValueStructure .ucStartFlag == 0 )
{
LED1_TOGGLE;
__HAL_TIM_SET_COUNTER(htim,0); // 清零定时器计数
TIM_ICUserValueStructure .usPeriod = 0;
TIM_ICUserValueStructure .usCtr = 0;
// 配置输入捕获参数,主要是修改触发电平
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;//这里设置了捕获下降沿,但是没有触发
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1);
// 清除中断标志位
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
// 启动输入捕获并开启中断
// HAL_TIM_Base_Start_IT(&htim5);
HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);
TIM_ICUserValueStructure .ucStartFlag = 1;
// printf("ucStartFlag是 %d! \r\n",TIM_ICUserValueStructure .ucStartFlag);
}
else
{
// printf("ucStartFlag是 %d! \r\n",TIM_ICUserValueStructure .ucStartFlag);//执行不到else之后的代码
LED2_TOGGLE;
// 获取定时器计数值
TIM_ICUserValueStructure .usCtr = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);
// 配置输入捕获参数,主要是修改触发电平
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1);
// 清除中断标志位
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
// 启动输入捕获并开启中断
HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);
TIM_ICUserValueStructure .ucStartFlag = 0;
TIM_ICUserValueStructure .ucFinishFlag = 1;
}
}