踩了个坑
定时器中断的正确写法!!!
HAL_TIM_IC_CaptureCallback(&htimx)
发现回调函数没有反应时,可以进入stm32f1xx_it.c中查看其对应的中断函数,如:TIM1_CC_IRQHandler
参考博客中步骤可以简化为如下
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
switch (capture_Cnt){
case 0:
capture_Cnt++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); //启动输入捕获 或者: __HAL_TIM_ENABLE(&htim5);
break;
}
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(TIM5 == htim->Instance)
{
switch(capture_Cnt){
case 1:
capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING); //设置为下降沿捕获
capture_Cnt++;
break;
case 2:
capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
HAL_TIM_IC_Stop_IT(&htim5,TIM_CHANNEL_1); //停止捕获
high_time = capture_Buf[1]- capture_Buf[0]; //高电平时间
HAL_UART_Transmit(&huart1, (uint8_t *)high_time, 1, 0xffff); //发送高电平时间
HAL_Delay(1000); //延时1S
capture_Cnt = 0; //清空标志位
}
}
}
/* USER CODE END 4 */
经过测试,该代码没有考虑定时器溢出,于是补充定时器溢出回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //溢出中断函数
{
if(TIM1==htim->Instance)
{
if(capture_Cnt==2){
capture_flow++;
}
}
}
不要忘记在使用溢出中断前添加以下函数
HAL_TIM_Base_Start_IT(&htim1); //使能定时器,开启中断,使用溢出中断必需要