STM32超声波测距(HC_SR04)

目录

配置引脚

1.超声波控制脚        推挽输出,GPIO无上下拉

 2.超声波返回脚        中断模式,上升下降沿都触发

3. 使能超声波返回脚中断 ​编辑

4.打开头文件修改参数

5.测试结果

源代码

HC_SR04.c

HC_SR04.h


        说明:本方法适用于所有Cortex-M3内核的单片机,使用Cortex-M3内核DWT外设,不占用定时器资源,实现精确测量距离。方便移植,简单配置一下输入输出引脚即可。时钟树和其他参数正常配置。博主节省大家时间,从引脚配置开始,文章末尾附源代码

配置引脚

1.超声波控制脚        推挽输出,GPIO无上下拉

 2.超声波返回脚        中断模式,上升下降沿都触发

3. 使能超声波返回脚中断 

这些配置完直接生成代码就行


4.打开头文件修改参数

 加入代码,下载编译

5.测试结果


源代码

HC-SR04超声波测距资源-CSDN文库

一键三连关注私聊博主有例程哦~

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给出以下步骤: 1. 配置超声波模块的引脚,将Trig引脚连接到STM32的一个GPIO输出引脚,将Echo引脚连接到STM32的一个GPIO输入引脚。 2. 在代码中初始化GPIO引脚,并设置Trig引脚为输出模式,Echo引脚为输入模式。 3. 在代码中循环执行以下操作: a. 将Trig引脚输出高电平持续10us,然后拉低。 b. 等待Echo引脚输出高电平,并记录当前时间戳。 c. 等待Echo引脚输出低电平,并记录当前时间戳。 d. 计算时间差,即为超声波从发射到接收返回的时间。 e. 根据声速和时间差计算距离。 以下是示例代码: ```c #include "stm32f4xx.h" #define TRIG_PIN GPIO_Pin_0 #define ECHO_PIN GPIO_Pin_1 #define TRIG_PORT GPIOA #define ECHO_PORT GPIOA void delay_us(uint32_t us) { uint32_t ticks = us * (SystemCoreClock / 1000000); while (ticks--); } float get_distance(void) { GPIO_ResetBits(TRIG_PORT, TRIG_PIN); delay_us(2); GPIO_SetBits(TRIG_PORT, TRIG_PIN); delay_us(10); GPIO_ResetBits(TRIG_PORT, TRIG_PIN); uint32_t start_time = 0, end_time = 0; while (!GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN)); start_time = SysTick->VAL; while (GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN)); end_time = SysTick->VAL; float distance = (float)(start_time - end_time) * 10 / (SystemCoreClock / 1000000) * 340 / 2; return distance; } int main(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = TRIG_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TRIG_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = ECHO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(ECHO_PORT, &GPIO_InitStruct); while (1) { float distance = get_distance(); // do something with distance } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值