stm32f407超声波测距使用库函数
时间: 2025-05-24 10:19:54 浏览: 34
### STM32F407 使用 HAL 库实现超声波测距
为了在 STM32F407 上使用 HAL 库实现 HC-SR04 超声波测距功能,可以按照以下方式设计代码逻辑。HC-SR04 的工作流程包括触发信号的生成以及回响信号的时间测量。
#### 主要步骤解析
1. **触发信号生成**
需要向 TRIG 引脚发送一个至少 10μs 的高电平信号来启动测距过程[^2]。这可以通过 `HAL_GPIO_WritePin()` 函数配合短延时函数实现。
2. **回响信号捕获**
测量 ECHO 引脚上的高电平持续时间,该时间为超声波往返所需时间。此部分通常借助定时器中断或者轮询的方式获取精确计数值[^3]。
3. **距离计算**
利用公式 `(高电平时间 × 声速(340m/s)) / 2` 计算实际距离[^1]。
以下是完整的示例代码:
```c
#include "stm32f4xx_hal.h"
// 定义 GPIO 和 TIM 处理句柄
TIM_HandleTypeDef htimX;
void Delay_us(uint32_t us) {
__HAL_TIM_SET_COUNTER(&htimX, 0); // 清零定时器计数器
while (__HAL_TIM_GET_COUNTER(&htimX) < us);
}
uint32_t Distance_Calculate(uint32_t timeUs) {
float distance = ((float)(timeUs * 340) / 1e6) / 2;
return (uint32_t)distance; // 返回厘米级的距离值
}
void SR04_Init(void) {
// 初始化 Trig 和 Echo 引脚
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置 Trig 引脚为推挽输出模式
GPIO_InitStruct.Pin = GPIO_PIN_X; // 替换为实际使用的 PIN 号
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 Echo 引脚为输入浮空模式
GPIO_InitStruct.Pin = GPIO_PIN_Y; // 替换为实际使用的 PIN 号
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_RectStruct);
}
uint32_t Measure_Distance(void) {
uint32_t pulseWidthUs = 0;
// 发送触发信号
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_X, GPIO_PIN_SET); // 拉高 Trig 引脚
Delay_us(10); // 至少保持 10 μs
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_X, GPIO_PIN_RESET); // 拉低 Trig 引脚
// 等待 Echo 引脚变为高电平
while (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_Y));
// 开始记录高电平持续时间
__HAL_TIM_SET_COUNTER(&htimX, 0); // 清零定时器计数器
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_Y)); // 循环直到 Echo 引脚变低
pulseWidthUs = __HAL_TIM_GET_COUNTER(&htimX); // 获取计数值并转换为微秒
return Distance_Calculate(pulseWidthUs); // 计算距离
}
```
#### 关键点解释
- **延迟函数**:由于 HAL 提供的 `HAL_Delay()` 是毫秒级别的延时,因此需要自定义一个微秒级别延时函数 `Delay_us()` 来满足 HC-SR04 对触发信号的要求[^2]。
- **定时器配置**:建议启用一个通用定时器(如 TIM2 或 TIM3),用于精准捕捉 ECHO 引脚的高电平持续时间[^3]。
- **错误处理**:如果 ECHO 引脚长时间未响应,则应设置最大等待时间以防止程序卡死。
---
###
阅读全文
相关推荐


















