工具

1. 开发板stm32f429(f4系列的应该都可以)

2. 超声波传感器,型号为HC-SR04

HC-SR04接线
HC-SR04 stm32f4
VCC VCC(5V)
GND GND
Trig 推挽普通输出模式
Echo 上拉输入,需开启外部中断

代码实现逻辑:

1. 配置定时器TIM4用于计算Echo高电平信号的时长

void TIM4_Init(u16 arr,u16 psc) // TIM4 rewrite
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //定时器参数初始化//初始化定时器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);      //TIM4时钟使能 TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //输入捕获会用到TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//初始化定时器4
}

2. 配置两个IO给Trig和Echo
1)使能 IO 口时钟,包括使能 SYSCFG 时钟用于外部中断
2)初始化Echo的 IO 口为上拉输入,初始化Trig的 IO 口为上拉推挽普通输出
3)设置 Echo的 IO 口与中断线的映射关系,设置中断线上升沿触发中断模式
4)配置中断优先级分组(NVIC),并使能中断
5)编写中断服务函数

void HCSR04_GPIO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;EXTI_InitTypeDef  EXTI_InitStructure;NVIC_InitTypeDef  NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);  //使能PORTD时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 时钟,外部中断// GPIO PD1 输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;// PD1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOD,&GPIO_InitStructure);  //初始化IO口// GPIO PD0 推挽普通输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOD,&GPIO_InitStructure);  //初始化IO口SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource1); // 配置 GPIO 与中断线的映射关系: 将中断线 1 与 GPIOD 映射起来,即GPIOD.1 与 EXTI1 中断线连接//外部中断配置EXTI_InitStructure.EXTI_Line=EXTI_Line1;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //上升沿触发EXTI_Init(&EXTI_InitStructure);//配置中断分组(NVIC),并使能中断NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; //使能外部中断通道 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级 2NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //响应优先级 2NVIC_Init(&NVIC_InitStructure);
}void EXTI1_IRQHandler(void)
{delay_us(10);if(EXTI_GetITStatus(EXTI_Line1)!=RESET) //判断中断线1上的中断是否发生(标志位是否置位){TIM_SetCounter(TIM4,0); TIM_Cmd(TIM4,ENABLE);while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1));  //等待PD1低电平 TIM_Cmd(TIM4,DISABLE);Distance=(TIM_GetCounter(TIM4)*340)/200.0;printf("Distance:%f cm\r\n",Distance); EXTI_ClearITPendingBit(EXTI_Line1); // 清除中断线1的中断标志位}
}

3. 编写函数:使能超声波传感器,测算距离一次

void HCSR04_Start(void)
{GPIO_SetBits(GPIOD,GPIO_Pin_0);   //将Trig设置为高电平delay_us(12);               //持续大于10us触发,触发超声波模块工作GPIO_ResetBits(GPIOD,GPIO_Pin_0);
}

4. 如何在main中调用

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "hc_sr04.h"int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(180);  //初始化延时函数 USART1_init(9600);//初始化串口波特率为9600TIM4_Init(9998,7199); //定时器初始化HCSR04_GPIO_Init(); //超声波传感器初始化while(1){u8 i=0;while(i<10){delay_ms(100); // 超声波工作周期建议在60ms以上,以防止发射信号对回响信号的影响i++;}HCSR04_Start(); // 使能超声波传感器,测算距离一次}
}

声明:

1. 代码不完全,基于正点原子F4的项目文件编写

2. 此文参照他人的分享(STM32学习笔记——HC—SR04(超声波模块)_精神小火君-CSDN博客_正点原子超声波)/如若侵犯请联系删除

3. 以上代码已在传感器上经过验证没有问题

4. 项目文件上传到github(GitHub - Liqing-Ye/stm32f4-HC-SR04: stm32f4+HC-SR04超声波测距)

stm32f429+超声波传感器HC-SR04 -- 测距相关推荐

  1. 使用Arduino和超声波传感器实现简单测距

    使用HC-SR04超声波传感器和Arduino MEGA 2560实现简单测距 一.一个超声波传感器的使用 1.接线部分 2.代码部分 3.在串口看测到的数据 二.两个超声波传感器的使用 1.接线部分 ...

  2. hc sr04流程图_超声波传感器HC-SR04完整应用以及程序讲解

    带有Arduino的超声波传感器HC-SR04完整应用指南 本文是有关流行的超声波传感器HC – SR04的应用指南.我们将解释其工作原理,向您展示其某些功能,并分享一个您可以遵循的Arduino项目 ...

  3. 超声波传感器介绍及其使用(STM32)

    超声波传感器介绍及其使用(STM32) 超声波传感器型号 实物图 引脚 超声波传感器原理图 特点 工作原理 超声波传感器时序图 测量误差的产生 注意 超声波传感器部分代码 实验现象 源码获取 超声波传 ...

  4. 【外设1】超声波传感器的驱动

    一.简介 本文介绍如何用51STC单片机驱动超声波传感器来实现测距等功能. 二.实验平台 单片机型号:STC12C5A60S2 外设模块型号:HC-SR04 编译软件:KEIL 硬件平台:达芬奇51开 ...

  5. hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解

    超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...

  6. 【雕爷学编程】Arduino动手做(58)---SR04超声波传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  7. 收发一体超声波测距离传感器模块_空气中70KHZ超声波换能器传感器探头DYA-70-03A测距探头3米量程...

    空气中70KHZ超声波换能器传感器探头DYA-70-03A测距探头3米量程 CT50数字式超声波探伤仪 焊缝探伤测量仪器 金属探伤检测仪 现货,上海身高体重秤 超声波身高体重秤 全自动身高体重称测量仪 ...

  8. US100超声波测距传感器linux,US100超声波传感器手册

    US100超声波传感器手册 (2011-08-13 17:42:47) 标签: 杂谈 US-100 超声波测距模块 1. 概述 US-100 超声波测距模块可实现2cm~4.5m 的非接触测距功 能, ...

  9. arduino超声波测距接线图详细_使用Arduino UNO开发板和超声波传感器测量距离

    超声波传感器不仅提供距离测量实用程序,而且没有任何物理接触,但需要我们在无噪音和光线的情况下进行测量,与基于激光的距离测量仪器不同.此外,即使在基于激光的仪器经常降低其效率的日光下,这些仪器也便宜且更 ...

最新文章

  1. java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  2. @ConfigurationProperties与@Value的区别
  3. Hazelcast分布式
  4. 摸清全国农村集体家底-农业大健康:产权改革谋定清产核资
  5. CentOS下显卡驱动安装的相关思考
  6. 牛客多校4 - Harder Gcd Problem(构造+贪心)
  7. nginx动静分离配置_Nginx动静分离
  8. 轻松的java,轻松进行Java Portlets
  9. 电商C4D设计素材背景,3D效果是最适合电商产品
  10. 图卷积神经网络入门详解
  11. 动态树算法概述及习题
  12. Tecplot 安装记录
  13. 控制台程序实现暂停功能
  14. C语言【微项目17】—DustBase微尘数据库[自制键值对数据库][超轻量]【2022-03-23】
  15. 银行核心系统之假期表
  16. 2021湖南高考成绩查询考生版,湖南省普通高校招生考试考生综合信息平台入口2021...
  17. springboot 的异步任务 :无返回值 和有返回值
  18. 谷歌浏览器的timeline工具的使用
  19. 【 Kotlin 脚本编程Kotlin Scripting 】Linux Shell 脚本与Kotlin Scripting
  20. 最新版Jenkins 2.249.3的安装

热门文章

  1. MyBatis使用心得
  2. AndroidStudio 3.1 截取手机屏幕
  3. 达梦数据库8自动备份教程
  4. 求解数独的所有解法,java编程实现
  5. 如何尽早解决需求变更隐患,降低项目延期风险?
  6. 实用EXECL高级技能之考勤数据合并
  7. 双榜加冕!加速科技荣登2023准独角兽中国未来独角兽双榜单
  8. DM3730学习日记-写在前面
  9. 交流微电网仿真模型(包含PCS)【含个人笔记+建模过程】
  10. 使用MediaCoder压制高质量H264影片