stm32 hc-sr04
时间: 2024-12-25 10:23:10 浏览: 3
### STM32 使用 HC-SR04 超声波传感器教程
#### 初始化硬件连接
为了使STM32能够通过HC-SR04超声波传感器测量距离,需先完成物理连线。具体来说,VCC和GND分别接至电源正负极;Trig端子接到STM32的一个GPIO输出引脚用于触发测距信号;Echo则应连到另一个可配置成输入模式并支持外部中断功能的GPIO引脚以便接收回响脉冲宽度表示的距离信息[^2]。
#### 配置 GPIO 和 TIM 定时器
在程序初始化阶段,要设定好相应的GPIO管脚属性以及TIM定时器参数来实现精确的时间间隔控制与捕获:
```c
// 设置 Trig 输出引脚 (PA8)
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8;
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);
// Echo 输入引脚 (PB7),开启上升沿/下降沿中断
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
对于时间戳捕捉,则依赖于通用定时器(比如TIM1),它能记录下每次电平变化发生的时刻从而计算出往返时间差:
```c
TIM_HandleTypeDef htim1;
void MX_TIM1_Init(void){
__HAL_RCC_TIM1_CLK_ENABLE();
htim1.Instance = TIM1;
htim1.Init.Prescaler = 79;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
HAL_TIM_Base_Init(&htim1);
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
}
```
#### 编写主循环逻辑
当一切准备就绪之后,在`main()`函数里就可以编写核心算法了——即每隔一定周期发出一次触发指令,并等待回应以更新当前检测到的目标物体间的实际间距值:
```c
uint32_t start_time_us,end_time_us,distance_cm=0;
while(1){
// 发送10us以上的高电平给TRIG引脚启动测量过程
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_DelayMicroseconds(10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
// 等待ECHO变为低电平前后的两个时间节点作为计数起点终点
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)==RESET){} // 等待上升沿到来
start_time_us=__HAL_TIM_GET_COUNTER(&htim1);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)){ } // 等待下降沿到来
end_time_us=__HAL_TIM_GET_COUNTER(&htim1);
distance_cm=(end_time_us-start_time_us)/58; // 计算得到厘米单位下的距离数值
// 将结果打印出来或显示在OLED屏幕上...
}
// 中断服务例程处理
void TIM1_CC_IRQHandler(void){
HAL_TIM_IRQHandler(&htim1);
}
```
上述代码片段展示了如何利用STM32平台配合HC-SR04模块来进行基本的距离感测操作。
阅读全文