超声波模块基于STM32HAL库使用代码
时间: 2024-10-23 21:12:50 浏览: 35
基于STM32/HAL库的超声波避障小车
超声波模块通常用于测量距离,它在STM32微控制器上使用时,需要结合STM32 HAL库(Hardware Abstraction Layer,硬件抽象层)来简化编程。以下是一个基本示例,展示如何在STM32F103系列中使用HAL库来操作超声波传感器如HC-SR04:
```c
#include "stm32f1xx_hal.h"
#include "usart.h"
#include "gpio.h"
// 定义超声波模块的GPIO口和中断资源
static GPIO_TypeDef* USR_XTRIG_PIN = GPIOA;
static GPIO_TypeDef* USR_ECHO_PIN = GPIOB;
static EXTI_HandleTypeDef UsrExtiHandle;
void ultrasonic_init(void) {
// 初始化GPIO和EXTI
GPIO_InitTypeDef gpio_InitStructure;
EXTI_InitTypeDef exti_InitStructure;
// 设置触发和echo引脚为输入模式
gpio_InitStructure.Pin = GPIO_PIN_2; // 选择XTRIG引脚
gpio_InitStructure.Mode = GPIO_MODE_INPUT;
gpio_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(USR_XTRIG_PIN, &gpio_InitStructure);
gpio_InitStructure.Pin = GPIO_PIN_3; // 选择ECHO引脚
gpio_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
gpio_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(USR_ECHO_PIN, &gpio_InitStructure);
// 初始化EXTI for ECHO pin
exti_InitStructure.Line = EXTI_Line3;
exti_InitStructure.ExtType = EXTI_RisingFallEdge; // 对于HC-SR04,通常是上升沿触发
exti_InitStructure Trigger = EXTI_Trigger_RISING;
exti_InitStructure.Interrupt = ENABLE;
exti_InitStructure.Polarity = EXTI_Polarity_High;
HAL_EXTI_Init(&UsrExtiHandle);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); // Enable EXTI interrupt
// 开启定时器以产生触发脉冲
TIM_TimeBaseInitTypeDef timinit;
timinit.Prescaler = 83; // 根据实际时钟频率调整
timinit.CounterMode = TIM_COUNTERMODE_UP;
timinit.Period = 25000 - 1; // 发送周期减去1是为了留出时间等待回声
HAL_TIM_Base_Init(&TIM3, &timinit);
HAL_TIM_Base_Start_IT(&TIM3);
}
int32_t ultrasonic_distance(void) {
// 停止计时器以接收回声信号
HAL_TIM_Base_Stop_IT(&TIM3);
HAL_GPIO_WritePin(USR_ECHO_PIN, GPIO_PIN_3, GPIO_PIN_SET); // 发送高电平
HAL_Delay(10); // 等待Echo pulse反射
HAL_GPIO_WritePin(USR_ECHO_PIN, GPIO_PIN_3, GPIO_PIN_RESET); // 发送低电平,开始计时
uint16_t echo_time = 0;
while (HAL_GPIO_ReadPin(USR_ECHO_PIN, GPIO_PIN_3) == GPIO_PIN_RESET) { // 监听Echo pin直到高电平
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET) {
echo_time = HAL_UART_GetData(USART2);
}
if (echo_time > 750) break; // HC-SR04的最短回声时间为750μs,超过则停止计数
}
// 计算距离并返回结果
int32_t distance = (echo_time * 58 / 2); // 使用公式d=ct/2,其中c=34300cm/s, t=echo_time/1000
return distance;
}
阅读全文