STM32 HAL HC-SR04使用OLED显示距离
时间: 2025-05-06 10:27:39 AIGC 浏览: 34
<think>好的,我需要帮助用户在STM32 HAL库中使用HC-SR04超声波传感器并通过OLED显示距离。首先,我得整理用户提供的引用资料,看看各个步骤怎么实现。
用户提到了四个引用,都是关于STM32和HC-SR04的配置。引用1和4提到了硬件接线,可能需要将Trig和Echo连接到特定的GPIO,比如PA0和PA1。同时,OLED使用I2C接口,通常是PB6和PB7,如引用2所说。
接下来是定时器的配置。引用3和4都提到了使用定时器来测量Echo的高电平时间。用户需要配置一个定时器,比如TIM2,设置成输入捕获模式,这样当Echo引脚电平变化时,定时器能记录时间。引用3还提到了微秒级延时函数,用定时器实现,这点需要注意,因为HAL_Delay只能处理毫秒级。
然后,代码部分需要初始化超声波模块,发送Trig信号,至少10us的高电平,这里必须用微秒延时函数。然后等待Echo的高电平持续时间,通过定时器计算时间差,再转换成距离。距离公式是时间乘以声速(340m/s)除以2,因为声音要来回。
OLED显示部分,引用2和4提到使用I2C驱动OLED,可能需要使用现有的库函数,比如SSD1306的驱动库,来显示字符串和数值。
可能的问题点包括定时器的正确配置,输入捕获的中断处理,以及微秒延时的准确性。需要确保定时器的预分频设置正确,比如72MHz的主频,预分频71,这样每个计数是1us。同时,输入捕获要配置成上升沿和下降沿触发,以测量脉冲宽度。
代码结构方面,主循环中循环触发Trig信号,然后读取Echo的时间,计算距离,再刷新OLED显示。可能需要处理超时情况,比如Echo没有返回信号,避免程序卡死。
最后,用户可能需要示例代码,结合HAL库的函数,包括GPIO控制、定时器配置、延时函数以及OLED的显示函数。需要确保代码结构清晰,步骤明确,用户能够按照步骤接线和配置。</think>### STM32 HAL库驱动HC-SR04超声波测距及OLED显示教程
#### 1. 硬件准备与接线
- **HC-SR04**:VCC接5V,GND接地,Trig接PA0,Echo接PA1[^4]
- **OLED(I2C接口)**:SCL接PB6,SDA接PB7,VCC接3.3V,GND接地[^2]
- **开发板**:STM32 Blue Pill(STM32F103C8T6)
#### 2. 系统配置(STM32CubeMX)
1. **定时器配置**(TIM2)
- 模式:输入捕获
- 预分频值:71(72MHz/72=1MHz,1计数=1μs)
- 捕获通道:通道1(PA0)
- 触发边沿:上升沿/下降沿[^3]
2. **GPIO配置**
```c
// Trig引脚输出配置(PA0)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// Echo引脚输入配置(PA1)
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
```
3. **I2C配置**
- I2C1模式:标准模式(100kHz)
- 引脚:PB6(SCL),PB7(SDA)
#### 3. 关键代码实现
```c
// 微秒延时函数(使用TIM2)
void delay_us(uint16_t us) {
__HAL_TIM_SET_COUNTER(&htim2, 0);
while(__HAL_TIM_GET_COUNTER(&htim2) < us);
}
// 超声波测距函数
float Get_Distance(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
delay_us(15); // 发送15μs高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
uint32_t start_time = 0, end_time = 0;
while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)); // 等待Echo高电平
start_time = __HAL_TIM_GET_COUNTER(&htim2);
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)); // 等待Echo低电平
end_time = __HAL_TIM_GET_COUNTER(&htim2);
return (end_time - start_time) * 0.034 / 2; // 距离计算公式[^4]
}
// OLED显示函数
void OLED_Display(float distance) {
char buf[20];
sprintf(buf, "Dist: %.2f cm", distance);
SSD1306_GotoXY(0, 0);
SSD1306_Puts(buf, &Font_7x10, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
}
```
#### 4. 主程序逻辑
```c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_TIM2_Init();
HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1);
SSD1306_Init();
while(1) {
float dist = Get_Distance();
OLED_Display(dist);
HAL_Delay(500); // 500ms刷新间隔
}
}
```
#### 注意事项
1. 需提前导入SSD1306 OLED驱动库
2. 声速计算需考虑温度补偿(默认按340m/s)
3. 建议添加超时检测(防止Echo持续高电平)
4. 硬件接线需确保5V供电稳定[^1]
阅读全文
相关推荐

















