tim.c/* TIM5CH1_CAP_STA 各数据位说明
** bit7 捕获完成标志
** bit6 捕获到高电平标志
** bit5~0 捕获高电平后定时器溢出的次数*/
uint8_t TIM5CH1_CAP_STA = 0; // 输入捕获状态
uint16_t TIM5CH1_CAP_VAL; // 输入捕获值
// 中断服务函数里面会自动调用这个回调函数,这个是定时器更新中断处理的函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3) // 判断定时器5是否发生中断
{
if((TIM5CH1_CAP_STA & 0X80) == 0) // 还未成功捕获
{
if(TIM5CH1_CAP_STA & 0X40) // 已经捕获到高电平
{
if((TIM5CH1_CAP_STA & 0X3F) == 0X3F)// 高电平时间太长了,做溢出处理
{
TIM5CH1_CAP_STA |= 0X80; // 标记为完成一次捕获
TIM5CH1_CAP_VAL = 0XFFFF; // 计数器值
}
else
{
TIM5CH1_CAP_STA++; // 若没有溢出,就只让TIM5CH1_CAP_STA自加
}
}
}
}
}
// 定时器输入捕获中断处理回调函数,该函数在 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if((TIM5CH1_CAP_STA & 0X80) == 0) // 还未成功捕获
{
if(TIM5CH1_CAP_STA & 0X40) // 捕获到一个下降沿
{
TIM5CH1_CAP_STA |= 0X80; // 标记成功捕获到一次高电平脉宽
TIM5CH1_CAP_VAL = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3); // 获取当前的计数器值
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_3); // 清除原来的设置
TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3, TIM_ICPOLARITY_RISING);// 设置上升沿捕获
}
else
{
TIM5CH1_CAP_STA = 0; // 清空自定义的状态寄存器
TIM5CH1_CAP_VAL = 0; // 清空捕获值
TIM5CH1_CAP_STA |= 0X40; // 标记捕获到上升沿
__HAL_TIM_DISABLE(&htim3); // 关闭定时器
__HAL_TIM_SET_COUNTER(&htim3, 0); // 计数器值清零
TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3); // 一定要先清除原来的设置 !!
TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING); // 设置下降沿捕获
__HAL_TIM_ENABLE(&htim3); // 使能定时器
}
}
}
|