超声波部分
将下面代码添加到tim.c中,复制粘粘到最下面、
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
uint8_t TIM3CH2_CAPTURE_STA; // 输入捕获状态
uint16_t TIM3CH2_CAPTURE_VAL; //输入捕获值
//溢出回调函数和捕获回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if ((TIM3CH2_CAPTURE_STA & 0x80) == 0) // 还未捕获成功
{
if (TIM3CH2_CAPTURE_STA & 0x40) // 捕获到一个下降沿
{
if ((TIM3CH2_CAPTURE_STA & 0x3F) == 0x3F) // 高电平的时间太长
{
TIM3CH2_CAPTURE_STA |= 0X80; // 标记为成功捕获一次
TIM3CH2_CAPTURE_VAL = 0XFFFF;
}
else
TIM3CH2_CAPTURE_STA++; // 否则标记溢出数加1
}
}
}
// 捕获中断发生时执行 上升沿复位开始计时,下降沿获取捕获值计算
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ((TIM3CH2_CAPTURE_STA & 0X80) == 0) //还未捕获成功 [7]:0,没有成功的捕获;1,成功捕获到一次.
{
if (TIM3CH2_CAPTURE_STA & 0X40) // 成功率捕获到1个下降沿 [6]:0,还没捕获到低电平;1,已经捕获到低电平了.
{
// usart_printf("get down\r\n");
TIM3CH2_CAPTURE_STA |= 0X80; // 标记成功,捕获到1次高电平完成
TIM3CH2_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2); // 捕获当前设置捕获值
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2); // 清除原来设置
TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING); // 捕获到下降沿之后,将捕获到复位为上升沿
}
else // 捕获到一个上升沿
{
// usart_printf("get up\r\n");
TIM3CH2_CAPTURE_STA = 0;
TIM3CH2_CAPTURE_VAL = 0;
TIM3CH2_CAPTURE_STA |= 0X40; //将STA置为0x40 当下一次触发中断时,会进入上面的if语句
__HAL_TIM_DISABLE(&htim3);
__HAL_TIM_SET_COUNTER(&htim3, 0);
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2);
TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2, TIM_ICPOLARITY_FALLING);
__HAL_TIM_ENABLE(&htim3);
}
}
}
|