hcsr04超声波传感器stm32外部触发中断
时间: 2025-01-05 13:15:12 浏览: 9
### 使用 STM32 外部中断触发 HCSR04 超声波传感器测距
为了实现使用外部中断触发 HC-SR04 超声波传感器并完成测距,可以按照如下方法配置 STM32 的 GPIO 和 TIM 定时器。此方案能够确保当检测到 Trig 引脚上的有效触发信号时启动定时器,并在 Echo 引脚上捕获返回的时间间隔。
#### 配置 GPIO 及外设初始化
首先定义用于连接 HC-SR04 的 GPIO 引脚:
- **Trig Pin**: 输出引脚,用来发送至少 10μs 的高电平脉冲以触发测量过程。
- **Echo Pin**: 输入引脚,设置为上升沿/下降沿触发的外部中断源,以便捕捉回响信号的到来时刻。
```c
// 初始化GPIO和TIM
void MX_GPIO_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Trig pin (PA0) as output push-pull mode
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void MX_TIM_Init(TIM_HandleTypeDef *htim){
htim->Instance = TIM2; // 假定使用TIM2作为计数器实例
htim->Init.Prescaler = 79; // 设置预分频系数使得计数频率为1MHz(假设系统时钟80MHz)
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = 65535; // 自由运行模式下最大周期值
htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(htim) != HAL_OK){
Error_Handler();
}
}
```
#### 实现外部中断服务程序
编写 EXTI 中断处理函数来响应来自 Echo 引脚的变化事件,并据此更新全局变量 `start_time` 或者停止定时器读取当前数值保存至 `end_time`:
```c
uint32_t start_time = 0, end_time = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
static uint8_t state = 0;
switch(state){
case 0:// 上升沿到来
if(HAL_GetTick() - last_interrupt >= DEBOUNCE_DELAY){
__HAL_TIM_SET_COUNTER(&htim2, 0); // 清零计数寄存器
start_time = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
state++;
}
break;
case 1:// 下降沿到来
if(HAL_GetTick() - last_interrupt >= DEBOUNCE_DELAY){
end_time = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
state=0;
float distance_cm = ((float)(end_time-start_time)/58.0); // 计算距离
printf("Distance measured is %f cm\n",distance_cm);
}
break;
default:
state=0;
break;
}
}
```
上述代码片段展示了如何利用 STM32 的硬件资源配合软件逻辑实现对外界物理量——即物体间相对位置变化的有效监测[^1]。
阅读全文