stm32f103zet6 超声波测距hal
时间: 2025-05-01 11:32:38 浏览: 31
### 实现 STM32F103ZET6 基于 HAL 库的超声波测距功能
为了实现 STM32F103ZET6 使用 HAL 庿进行超声波测距,可以按照以下方法设计程序逻辑:
#### 1. **硬件连接**
HC-SR04 超声波模块具有四个引脚:`VCC`, `Trig`, `Echo`, 和 `GND`。
- 将 HC-SR04 的 VCC 连接到 STM32 的 5V 或者通过稳压电路提供稳定电压。
- 将 GND 接到 STM32 地线。
- Trig 引脚用于触发测量,需配置为 GPIO 输出模式。
- Echo 引脚用于接收回响信号,需配置为 GPIO 输入模式并启用外部中断或定时器输入捕获。
#### 2. **初始化外设**
在 HAL 中完成必要的外设初始化操作:
- 配置 TIMx 定时器作为输入捕获单元来记录高电平持续时间。
- 初始化 GPIO 口以控制 Trig 并读取 Echo 状态。
以下是具体的代码实现示例:
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init(); // 初始化GPIO
MX_TIM2_Init(); // 初始化定时器
while (1) {
// 发送触发信号
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET); // 设置TRIG为高电平
HAL_Delay(10); // 至少保持10微秒
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); // 拉低TRIG结束触发
uint32_t start_time = __HAL_TIM_GET_COUNTER(&htim2); // 获取计数初值
while (__HAL_TIM_IS_ACTIVE_FLAG_UPDATE(&htim2)); // 等待更新标志位激活
uint32_t end_time = __HAL_TIM_GET_COUNTER(&htim2); // 记录停止时刻
float distance = ((end_time - start_time) * 0.34 / 2); // 测量距离公式
printf("Distance: %.2f cm\r\n", distance); // 打印结果至串口调试工具
HAL_Delay(1000); // 每隔一秒重新测量一次
}
}
// 定时器初始化函数
static void MX_TIM2_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 79; // 设定预分频系数使频率达到1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535; // 自动重装载寄存器设置最大周期数值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) Error_Handler();
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) Error_Handler();
if (HAL_TIM_IC_Init(&htim2) != HAL_OK) Error_Handler();
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK) Error_Handler();
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) Error_Handler();
}
// GPIO初始化函数
static void MX_GPIO_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟供TRIG/ECHO使用
GPIO_InitTypeDef GPIO_InitStruct = {0};
// TRIG输出引脚定义
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
// ECHO输入引脚定义
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
}
```
上述代码实现了基本的超声波测距流程[^1][^2]。其中需要注意的是,实际应用中可能还需要考虑环境温度对声速的影响以及噪声干扰等因素。
---
####
阅读全文
相关推荐


















