最详细STM32,cubeMX 超声波测距
这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。
文章目录
- 前言
- 一、超声波模块
- `测距原理` :
- 二、cubeMX 配置
- 三、实验程序
- 总结
前言
- 实验材料:STM32F103C8T6开发板, HC-SR04 超声波模块。
- 所需软件:keil5 , cubeMX ,AiThinker Serial Tool 串口助手。
- 实验目的:了解 STM32使用 cubeMX驱动超声波 。
- 实验:超声波测距。
一、超声波模块
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能。有4 个引脚:VCC, GND, Trig(信号触发引脚),Echo(接收返回信号)。
当超声波发出一个信号时,信号碰到物体或阻碍后会立即返回。只要得到 信号往返传输的时间就可以测出距离。

参数列表:
工作电压 VCC : 5 V
最远射程 : 4m
最近射程 :2cm
信号传输速度 :340m/s
测距原理 :
下图是 超声波时序图。
-
首先让超声波的 trig 引脚发送触发信号:一个 10 us 的 TTL 高电平。
-
然后模块内部会自动循环发出 8 个 40 KHZ 的脉冲。
-
接着 超声波的 echo 引脚会接收到回返信号。
-
最后只需要计算出这段回返信号的高电平时间 再带入公式
S = 340(m/s) * T(s) / 2即可算出距离.这里是往返时间,要除 2。(因为 高电平的时间就是信号往返传输的时间)

二、cubeMX 配置
对于基础的配置可以看我之前的文章。
- 由于 要发送一个 10us 的高电平,这个时间用定时器进行配置,所以这里我
使用 定时器 2 进行延时。(尽量不要使用 HAL_Delay 函数,多次使用会导致程序卡顿)
这里选择内部时钟源,并配置相关参数。这里配置的参数是 1us 延时。

- 我们还需要 一个定时器去 计算回返信号的高电平时间。使用定时器3。配置的定时时间依然是 1us。
如果对 定时器的定时时长有不了解的可以参考我之前的文章:最详细STM32,cubeMX 定时器

- 需要将测出的距离使用串口助手打印出来,所以这里需要使用一个 串口 USART2.(使用 异步传输)
如果对 串口的配置有不了解的可以参考我之前的文章:最详细STM32,cubeMX串口发送,接收数据

- 对于检测 是否接收到 回返信号 ,可以使用外部中断。
超声波需要两个引脚分别用来 发送触发信号 ,接收回返信号。所以,这里我使用 PB3 用来 发送触发信号,设置为输出引脚。使用 PB6 接收信号,并将其设置为 外部中断模式。
如果对 外部中断的配置有不了解的可以参考我之前的文章:STM32不使用 cubeMX实现外部中断

-
并将 PB6 设置为 双边沿触发中断。

-
并将外部中断使能。

三、实验程序
sr04.h:
#ifndef _SR04_H_
#define _SR04_H_#include <stdio.h>
#include "main.h"#define Trigger_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET)
#define Trigger_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET)void Delay_us(uint16_t us); // 使用定时器2编写的延时函数
void Trigger_signal(void); // 发送 10us 的触发信号#endif
sr04.c:
#include "sr04.h"int distance_cm = 0;extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;/* 延时函数(单位 us) */
void Delay_us(uint16_t us)
{uint16_t time = 0xffff - us - 5;__HAL_TIM_SET_COUNTER(&htim2,time); // 设置 定时器2 的值HAL_TIM_Base_Start(&htim2); // 开启定时器2while(time < 0xffff-5){time = __HAL_TIM_GET_COUNTER(&htim2); // 获取定时器2 值}HAL_TIM_Base_Stop(&htim2); // 停止 定时器2
}/* 发送 10us 的触发信号 */
void Trigger_signal(void)
{Trigger_ON; // 发送高电平Delay_us(10); // 延时 10 usTrigger_OFF; // 发送低电平
}/* 外部中断回调函数 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{ static uint32_t time_us = 0;if(GPIO_Pin == GPIO_PIN_6){if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)){HAL_TIM_Base_Start(&htim3); // 开启定时器3(开始计时)__HAL_TIM_SetCounter(&htim3,0); // 清空定时器3}else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6) == 0){HAL_TIM_Base_Stop(&htim3); //关闭定时器3(停止计时)time_us = __HAL_TIM_GetCounter(&htim3); // 获取高电平时间printf("time_us : %d\r\n", time_us);distance_cm = time_us * 340/2*0.000001*100;printf("distance_cm is %d cm\r\n", distance_cm);time_us = 0;}}
}
对于串口发送数据,可以使用重定义函数,简化代码:
int fputc(int ch,FILE* f)
{while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch),1000) != HAL_OK);return 0;
}
测试程序:
在 while 循环中持续发送触发信号。
int count = 0;while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* 每 50 ms 发送一次触发信号 */if(HAL_GetTick() - count > 50){count = HAL_GetTick();Trigger_signal();} }
HAL_GetTick() 函数 用来获取当前的时间。可以看到这个函数返回 uwTick 变量,在 HAL_IncTick() 中一直增加。uwTick 变量是从STM32 开机就开始计时。 1 uwTick 就是 1ms.

总结
下一篇文章为大家介绍 STM32 驱动蓝牙的实现。
相关文章:
最详细STM32,cubeMX 超声波测距
这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 文章目录 前言一、超声波模块测距原理 : 二、cubeMX 配置三、实验程序总结 前言 实验材料:STM32F103C8T6开发板, HC-SR04 超声波模块。所需软件:keil5 , cubeM…...
Java实现连接SQL Server解决方案及代码
下面展示了连接SQL Server数据库的整个流程: 加载数据库驱动建立数据库连接执行SQL语句处理结果关闭连接 在连接之前,前提是确保数据库成功的下载,创建,配置好账号密码。 运行成功的代码: import java.sql.*;publi…...
如何用 JMeter 编写性能测试脚本?
Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本? 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明(以 JMeter 5.1 为例)。 如下图所示:…...
vue3+vite在线预览pdf
效果图 代码 <template><div class"pdf-preview"><div class"pdf-wrap"><vue-pdf-embed :source"state.source" :style"scale" class"vue-pdf-embed" :page"state.pageNum" /></div…...
Python深度学习实战-基于Sequential方法搭建BP神经网络实现分类任务(附源码和实现效果)
实现功能 第一步:导入模块:import tensorflow as tf 第二步:制定输入网络的训练集和测试集 第三步:搭建网络结构:tf.keras.models.Sequential() 第四步:配置训练方法:model.compile()&#x…...
【前端】Webpack5中Html和CSS的压缩打包
1.Webpack5简介 1.1.Webpack简介 (1)webpack的发展历程 2012.3—webpack(问世) 2014.2—webpack1 2016.12—webpack2 2017.6—webpack3 2018.2—webpack4 2020.10—webpack5(要求node版本10.13) &a…...
postman接收后端返回的文件流并自动下载
不要点send,点send and download,postman接受完文件流会弹出文件保存框让你选择保存路径...
谈谈Net-SNMP软件
Net-SNMP是一个开源的SNMP软件套件,它提供了SNMP代理(snmpd)和SNMP工具(如snmpget、snmpwalk等),可以用于监控和管理网络设备。 Net-SNMP最初是从UC Davis的SNMP软件衍生而来,现在已经成为广泛…...
前端对普通数字数组排序示例
1. arr.sort(fn) // 升序排序arr.sort((a, b) > a - b);// 降序排序arr.sort((a, b) > b - a); 2. 冒泡排序 冒泡排序-升序原理: eg: [1, 6, 7, 9, 10, 3, 4, 5, 2] 1) 先遍历第一遍数组, 前一个数字大于后一个数字, 就交换位置, 最后最大值10放在数组的最后, 此时是…...
SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)
SQL server中:常见问题汇总 1.修改表时提示:不允许修改表结构步骤图例注意 2.将截断字符串或二进制数据。3.在将 varchar 值 null 转换成数据类型 int 时失败。4.插入insert 、更新update、删除drop数据失败,主外键FOREIGN KEY 冲突5.列不允许…...
无线通信中CSI的含义
在无线通信中,CSI代表"Channel State Information",即信道状态信息。CSI是一种关键的信息,用于评估和描述通信信道的特性,以帮助发送器和接收器在通信过程中做出智能的调整和决策。 CSI包括有关通信信道的以下信息&…...
如何一键核实验证身份证的真伪?
据报道,今年10月10日,广东省佛山市朱某因生活琐事与丈夫发生争吵,民警发现她的身份证有问题。 在民警打算进一步了解情况,查看夫妻二人的身份证件时,朱某的身份证引起了民警的注意。这张身份证表面很光滑,…...
冒泡排序:了解原理与实现
目录 原理 实现 性能分析 结论 冒泡排序(Bubble Sort)是一种简单但效率较低的排序算法。它重复地比较相邻的元素并交换位置,直到整个序列有序为止。虽然冒泡排序的时间复杂度较高,但在小规模数据集上仍然具有一定的实际应用价…...
springboot maven项目环境搭建idea
springboot maven项目环境搭建idea 文章目录 springboot maven项目环境搭建idea用到的软件idea下载和安装java下载和安装maven下载和安装安装maven添加JAVA_HOME路径,增加JRE环境修改conf/settings.xml,请参考以下 项目idea配置打开现有项目run或build打…...
vue3检测是手机还是pc端,监测视图窗口变化
1.超小屏幕(手机) 768px以下 2.小屏设备(平板) 768px-992px 3.中等屏幕(旧式电脑) 992px-1200px 4.大屏设备(现代电脑) 1200px以上 <script setup name"welcome"> i…...
B - Magical Subsequence (CCPC2021哈尔滨)
思路: (1)问题:对于已知数组,每组依次选两个,尽量选更多组,选的每组和相等;(假定和为x) (2)于是问题拆分为两步, x是多少x确定时&a…...
Leetcode刷题详解——x的平方根
1. 题目链接:69. x 的平方根 2. 题目描述: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 **注意:**不允许使用任何内置指数函数和…...
windows安装docker,解决require wsl 2问题
想在windows上安装桌面版docker,上官网下载了安装包,安装完后,启动报错,忘了截图了。 大概意思就是require wsl 2。 于是就是docker FAQ中找相关问题解决方案,点,点,点然后就点到微软了。 ws…...
建立复数类
目录 程序设计 程序分析 系列文章 在课堂示例的基础上,显示复数时如果虚部为0时只显示实部,实部为0时只显示虚部,虚部为负数时以a-bi的形式显示,并为复数类增加减法功能。 程序设计 Work4类: package work;import java.util.Scanner;public class Work4 {private in…...
docker部署prometheus+grafana服务器监控(三) - 配置grafana
查看 prometheus 访问 http://ip:9090/targets,效果如下,上面我们通过 node_exporter 收集的节点状态是 up 状态。 配置 Grafana 访问 http://ip:3000,登录 Grafana,默认的账号密码是 admin:admin,首次登录需要修改…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
