帮我写基于stm32超声波测距代码我用了hc-sr04用了PA6、PA7,用库函数
时间: 2024-06-08 17:07:44 浏览: 93
好的,以下是基于STM32的HC-SR04超声波测距的代码,使用的是STM32库函数:
```c
#include "stm32f10x.h"
#include <stdio.h>
#define TRIG_PIN GPIO_Pin_6 // PA6
#define ECHO_PIN GPIO_Pin_7 // PA7
void delay_us(uint32_t us)
{
SysTick->LOAD = us * (SystemCoreClock / 1000000);
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
SysTick->CTRL = 0;
}
float get_distance(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
float distance = 0;
// 初始化GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = TRIG_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = ECHO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化定时器2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = 71; // 设置预分频值,频率 1MHz
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
// 初始化输入捕获通道1
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
// 发送超声波信号
GPIO_SetBits(GPIOA, TRIG_PIN);
delay_us(10);
GPIO_ResetBits(GPIOA, TRIG_PIN);
// 等待回波
while (GPIO_ReadInputDataBit(GPIOA, ECHO_PIN) == RESET);
// 开始计时
TIM_Cmd(TIM2, ENABLE);
// 等待计时完成
while (TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1) == RESET);
// 计算距离
distance = TIM_GetCapture1(TIM2) / 58.0;
// 关闭定时器和GPIO口
TIM_Cmd(TIM2, DISABLE);
GPIO_SetBits(GPIOA, TRIG_PIN);
GPIO_InitStruct.GPIO_Pin = TRIG_PIN | ECHO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
return distance;
}
int main(void)
{
float distance = 0;
char str[20];
// 初始化SysTick
SysTick_Config(SystemCoreClock / 1000000);
while (1)
{
distance = get_distance();
// 将距离转换为字符串
sprintf(str, "%.2fcm", distance);
// 通过串口发送距离数据
printf("%s\n", str);
// 延时一段时间
delay_us(500000);
}
}
```
在这个例子中,我们使用PA6口作为超声波的发射端口,PA7口作为接收端口。首先我们初始化GPIO口和定时器2,并将PA6口设置为输出模式,PA7口设置为输入模式。然后我们发送一个10us的高电平信号到PA6口,等待PA7口的回波信号。当PA7口检测到高电平时,定时器开始计时,并等待计时完成。最后,根据计时器的值计算出距离,并将PA6和PA7口重新配置为浮空输入模式。
在主函数中,我们不断调用`get_distance()`函数获取距离,并将距离通过串口发送出去。在本例中,我们使用了sprintf()函数将距离转换为字符串,并通过printf()函数将字符串发送到串口。你可以根据自己的需要修改代码,比如改变超声波的发射和接收端口,或者改变输出方式等。
阅读全文