代码如下:
#define Trig_L HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, 0);
#define Trig_H HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, 1);
void delay_us(uint16_t us)//微秒延迟函数
{
uint16_t i=0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim3,i);
HAL_TIM_Base_Start(&htim3);
while(i<0xffff-5)
{
i=__HAL_TIM_GET_COUNTER(&htim3);
}
HAL_TIM_Base_Stop(&htim3);
}
void Set_Trig()//触发超声波函数
{
Trig_L;
Trig_H;
delay_us(20);
// HAL_Delay(1);
Trig_L;
}
void HAL_GPIO_EXTI_Callback(uint16_t a)//外部中断中断处理函数替代void EXTI9_5_IRQHandler(void)
{
float distance;
static float cnt=0;
if(HAL_GPIO_ReadPin(GPIOD, Echo_Pin)==1)//Echo引脚为低电平则停在此处循环
{
HAL_TIM_Base_Start(&htim2); //开启定时器
__HAL_TIM_SetCounter(&htim2,0); //清空定时器的值
}
if(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin)==0)
{
HAL_TIM_Base_Stop(&htim2); // 停止定时器
cnt=__HAL_TIM_GetCounter(&htim2); //获取当前计数值
distance= cnt*340.0/2*0.000001*100;
printf("%.3fcm\r\n",distance);
cnt=0;
}
}
主函数:
int main(void)
{
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int SR04_tick = 0;
if(HAL_GetTick() - SR04_tick > 50)/*滴答定时器50ms发射一次超声波*/
{
SR04_tick = HAL_GetTick();
Set_Trig();
}
}
}