土木本科生的STM32探索之旅:声波测距+usart通信,将距离的结果发送到电脑的串口助手上

发布时间:2026/6/6 10:41:07

土木本科生的STM32探索之旅:声波测距+usart通信,将距离的结果发送到电脑的串口助手上 此实验我是使用的白色板子做的实验暂时手里没有高博士白羊座的黑色板子实验的原理是相通的具体的原理我就暂时不解释了哦我把博主的视频链接放在了下方【STM32】动画讲解输入捕获 并实现超声波测距_哔哩哔哩_bilibili建议是大家先去了解一下声波测距的原理在一步步地做实验。由于比较忙我就简单记录了我之前的实验过程和相关操作。下面我就直接把我的学习过程展示出来哈基于deepseek专家模式的实验指导一、硬件连接总览keysking白板子HC-SR04传感器、VCC→接单片机5V不可接3.3V、GND→GND、Trig→PA11、Echo→PA10USB-TTL模块由于是集成为usb-type-c的数据线所以暂时不需要交叉接线到单片机。思考对应着高博士黑色板上大家可以暂时思考下需要接到那几个引脚二、软件端的操作1、打开STM32CubeIDE选择c8t6芯片后新建项目修改sys的debug模式。2、RCC时钟树设置为72MHz。3.配置USART2pa10为usart1的已经被占用了所以这里用usart2做通信。4.配置Trig引脚PA11输出GPIO_Output配置保持默认推挽输出无上下拉不需要修改。这里可以借鉴了对高博士黑色板子有借鉴的意义。要什么选接入的引脚5.配置TIM1pa11输入捕获测量Echo高电平左侧Timers→TIM1、Clock Source选Internal Clock、Prescaler填72-1这样计数频率72MHz/(711)1MHz即1μs计一个数Counter Period填65535最大值支持最长65.535ms脉宽Channel3下拉选择Input Capture direct mode下方展开的Input Capture参数里Polarity Selection选择Rising Edge先捕获上升沿切换到NVIC Settings标签页勾选TIM1 capture compare interrupt确保Enabled打钩。优先级默认即可。这一步也是需要借鉴一下高博士黑色板子上面怎么配置6.点击齿轮生成代码并打开mian.c文件增加用户代码借助AI工具辅助。#include stdio.h #include string.h8.添加全局变量volatile uint8_t echo_state 0; // 0:等待上升沿, 1:等待下降沿 volatile uint32_t pulse_width 0; // 高电平时间(us) volatile uint8_t data_ready 0; // 一次测量完成标志 float distance_cm 0.0f;void DWT_Init(void); void DWT_Delay_us(uint32_t us);void DWT_Init(void) { CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk; DWT-CYCCNT 0; } void DWT_Delay_us(uint32_t us) { uint32_t start DWT-CYCCNT; uint32_t ticks us * (SystemCoreClock / 1000000); while ((DWT-CYCCNT - start) ticks); }void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_3) // TIM1_CH3 { if (echo_state 0) // 刚捕获到上升沿 { // 切换为下降沿捕获清空计数器 __HAL_TIM_SET_CAPTUREPOLARITY(htim1, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING); __HAL_TIM_SET_COUNTER(htim1, 0); echo_state 1; } else // 捕获到下降沿高电平结束 { pulse_width HAL_TIM_ReadCapturedValue(htim1, TIM_CHANNEL_3); distance_cm pulse_width * 0.017f; // 计算距离(cm) data_ready 1; // 通知主循环 // 恢复上升沿捕获准备下一次测量 __HAL_TIM_SET_CAPTUREPOLARITY(htim1, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); echo_state 0; } } }11.主函数初始化代码// 初始化 DWT 延时 DWT_Init(); // 拉低 Trig让传感器稳定 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); HAL_Delay(100); // 启动 TIM1 通道3 输入捕获中断 HAL_TIM_IC_Start_IT(htim1, TIM_CHANNEL_3);12.主循环代码// 如果有新数据通过 USART2 发送 if (data_ready) { data_ready 0; char msg[50]; sprintf(msg, Distance: %.2f cm\r\n, distance_cm); HAL_UART_Transmit(huart2, (uint8_t *)msg, strlen(msg), 100); } // 触发 HC-SR04PA11 发出 10us 高脉冲 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); DWT_Delay_us(10); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); // 间隔 200ms传感器要求至少 60ms HAL_Delay(200);13.打开浮点解决小虫子的问题14.编译代码倘若没有问题的话将代码烧写进单片机。15.打开网页版串口助手观察实验效果。实际测的距离较为准确还有待一定的提升可以再优化优化代码使其测量的结果更加精准。欢迎大家在评论区留言和私信有问题一块解决哦谢谢大家。

相关新闻