1.使用TIM5的通道1设置为输入捕获模式。
uint8_t rising_flag=0;
uint8_t falling_flag=0;
uint8_t over_flow_value=0;
uint16_t cnt_val=0;
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
if(falling_flag==1)
{
__HAL_TIM_DISABLE(htim);
falling_flag=0;
cnt_val=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
printf("get ok\r\n");
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
temp= cnt_val+ 65536*over_flow_value;
printf("temp is %ld us\r\n",temp);
over_flow_value=0;
cnt_val=0;
temp=0;
__HAL_TIM_ENABLE(htim);
rising_flag=0;
}
else
{
printf("get first down\r\n");
falling_flag=1;
over_flow_value=0;
cnt_val=0;
__HAL_TIM_SetCounter(htim,0);
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
}
}
}
//更新中断的回调函数 Period周期 Elapsed 过去
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
if(falling_flag==1)
{
//printf("0");
over_flow_value++;
if((over_flow_value&0xff)==0xff)
{
over_flow_value = 0xff;
falling_flag=0;
printf("get over");
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
}
}
}
}
HAL_TIM_Base_Start_IT(&htim5);//启动基础定时器中断 ,计数器计满会触发中断
HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1); //IC :input capture 输入捕获的意思 ,启动输入捕获中断
//__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//输入捕获方向设置
//__HAL_TIM_SetCounter(&htim5,0);//设定计数器的当前值
//HAL_TIM_ReadCapturedValue();读取捕获值