1. 项目概述与硬件选型
最近在做一个基于STM32的超声波测距项目,手头正好有STM32F407ZET6开发板和常见的HC-SR04超声波模块。这个组合在嵌入式开发中很典型,但实际调试过程中遇到了不少坑,特别是关于定时器输入捕获和HAL库配置的问题。下面我会详细记录整个实现过程,包括CubeMX配置、代码编写、调试过程以及最终解决方案。
HC-SR04超声波模块的工作原理很简单:给Trig引脚一个10μs以上的高电平脉冲,模块会自动发送8个40kHz的超声波脉冲,然后通过Echo引脚输出一个高电平,高电平的持续时间与距离成正比。我们需要做的就是精确测量这个高电平的持续时间。
选择STM32F407的原因是其强大的定时器资源,特别是输入捕获功能非常适合这种脉冲宽度测量场景。而HAL库配合CubeMX工具可以大幅提升开发效率,不过在实际使用中发现自动生成的代码有时需要手动调整才能正常工作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32CubeMX详细配置
2.1 工程创建与时钟配置
打开CubeMX新建工程,选择STM32F407ZET6芯片。第一步要确保时钟配置正确:
- 在System Core > RCC中,将High Speed Clock (HSE)设置为Crystal/Ceramic Resonator,使用外部8MHz晶振
- 进入Clock Configuration标签页,配置系统时钟为168MHz(STM32F4的最高主频)
- 确认APB2定时器时钟也是168MHz(TIM9挂载在APB2上)
注意:时钟配置直接影响定时器的计数频率,后续的输入捕获精度依赖于此。如果使用内部时钟源,精度会有所下降。
2.2 串口配置
在Connectivity > USART1中:
- Mode设置为Asynchronous(异步通信)
- 波特率保持默认9600(需与PC端串口助手一致)
- 数据位8位,无校验,1位停止位
- 硬件流控制禁用
CubeMX会自动分配USART1_TX(PA9)和USART1_RX(PA10)引脚,无需手动调整。
2.3 GPIO配置
超声波模块需要两个GPIO:
- Trig引脚(PB6):配置为GPIO_Output,初始状态低电平
- Echo引脚(PE6):需要连接定时器的输
