void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP)
{
if ((g_timxchy_cap_sta & 0X80) == 0) /* 还未成功捕获 */
{
if (g_timxchy_cap_sta & 0X40) /* 捕获到一个下降沿 */
{
g_timxchy_cap_sta |= 0X80; /* 标记成功捕获到一次高电平脉宽 */
g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 获取当前的捕获值 */
TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */
TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING); /* 配置TIM5通道1上升沿捕获 */
}
else /* 还未开始,第一次捕获上升沿 */
{
g_timxchy_cap_sta = 0; /* 清空 */
g_timxchy_cap_val = 0;
g_timxchy_cap_sta |= 0X40; /* 标记捕获到了上升沿 */
__HAL_TIM_DISABLE(&g_timx_cap_chy_handle); /* 关闭定时器5 */
__HAL_TIM_SET_COUNTER(&g_timx_cap_chy_handle, 0); /* 定时器5计数器清零 */
TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置!! */
TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING); /* 定时器5通道1设置为下降沿捕获 */
__HAL_TIM_ENABLE(&g_timx_cap_chy_handle); /* 使能定时器5 */
}
}
}
}
进入这个函数表示捕获到了上升沿或者下降沿
- 这个函数分两步来测量高电平脉宽:
- 第一步是捕获上升沿,也就是信号从低变高的时候,这时候把g_timxchy_cap_sta的第6位(0-7 共8位)设为1,表示开始测量,然后把定时器清零,让它从0开始计数,然后把定时器设置为检测下降沿,也就是信号从高变低的时候
- 第二步是捕获下降沿,也就是信号从高变低的时候,这时候把g_timxchy_cap_sta的第7位设为1,表示结束测量,然后把定时器当前的计数值读出来,这个值就是高电平脉宽,然后把定时器设置为检测上升沿,也就是信号从低变高的时候
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP)
{
if ((g_timxchy_cap_sta & 0X80) == 0) /* 还未成功捕获 */
{
if (g_timxchy_cap_sta & 0X40) /* 已经捕获到高电平了 */
{
if ((g_timxchy_cap_sta & 0X3F) == 0X3F) /* 高电平太长了 */
{
TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */
TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */
g_timxchy_cap_sta |= 0X80; /* 标记成功捕获了一次 */
g_timxchy_cap_val = 0XFFFF;
}
else /* 累计定时器溢出次数 */
{
g_timxchy_cap_sta++;
}
}
}
}
}
- 这个函数是当一个计时器溢出的时自动运行的
- 这个函数只对一个特定的计时器有效,其他的计时器不管
- 这个函数在计时器满了的时候,会检查是否已经开始测量高电平脉宽,如果是,就会把g_timxchy_cap_sta的后6位加1,表示计时器满了一次
- 这个函数会判断g_timxchy_cap_sta的后6位是否都是1,如果是,表示计时器满了很多次,也就是高电平持续了很长时间,如果高电平持续了很长时间,就会把g_timxchy_cap_sta的第一位设为1,表示结束测量高电平脉宽
- 然后把g_timxchy_cap_val设为65535,表示高电平脉宽很大