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); // 使能定时器
- }
- }
- }
|